@skyux/grids 4.0.6 → 5.0.1
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/LICENSE +21 -0
- package/bundles/skyux-grids.umd.js +864 -744
- package/bundles/skyux-grids.umd.js.map +1 -1
- package/documentation.json +4089 -0
- package/esm2015/modules/grid/grid-adapter.service.js +22 -24
- package/esm2015/modules/grid/grid-cell.component.js +30 -32
- package/esm2015/modules/grid/grid-column.component.js +54 -63
- package/esm2015/modules/grid/grid-column.model.js +1 -1
- package/esm2015/modules/grid/grid.component.js +216 -210
- package/esm2015/modules/grid/grid.module.js +51 -30
- package/esm2015/modules/grid/types/grid-column-alignment.js +2 -1
- package/esm2015/modules/grid/types/grid-column-description-model-change.js +2 -1
- package/esm2015/modules/grid/types/grid-column-heading-model-change.js +2 -1
- package/esm2015/modules/grid/types/grid-column-inline-help-popover-model-change.js +2 -1
- package/esm2015/modules/grid/types/grid-column-width-model-change.js +2 -1
- package/esm2015/modules/grid/types/grid-message-type.js +1 -1
- package/esm2015/modules/grid/types/grid-message.js +2 -1
- package/esm2015/modules/grid/types/grid-row-delete-cancel-args.js +2 -1
- package/esm2015/modules/grid/types/grid-row-delete-config.js +2 -1
- package/esm2015/modules/grid/types/grid-row-delete-confirm-args.js +2 -1
- package/esm2015/modules/grid/types/grid-row-delete-contents.js +2 -1
- package/esm2015/modules/grid/types/grid-selected-rows-model-change.js +2 -1
- package/esm2015/modules/grid/types/grid-selected-rows-source.js +1 -1
- package/esm2015/modules/grid/types/grid-ui-config.js +2 -1
- package/esm2015/modules/shared/skyux-grids-resources.module.js +45 -0
- package/esm2015/public-api.js +20 -0
- package/esm2015/skyux-grids.js +2 -6
- package/fesm2015/skyux-grids.js +486 -482
- package/fesm2015/skyux-grids.js.map +1 -1
- package/modules/grid/grid-adapter.service.d.ts +3 -0
- package/modules/grid/grid-cell.component.d.ts +3 -0
- package/modules/grid/grid-column.component.d.ts +5 -1
- package/modules/grid/grid.component.d.ts +6 -4
- package/modules/grid/grid.module.d.ts +16 -0
- package/modules/shared/skyux-grids-resources.module.d.ts +14 -0
- package/package.json +15 -30
- package/{public_api.d.ts → public-api.d.ts} +0 -0
- package/skyux-grids.d.ts +2 -5
- package/CHANGELOG.md +0 -188
- package/bundles/skyux-grids.umd.min.js +0 -16
- package/bundles/skyux-grids.umd.min.js.map +0 -1
- package/esm2015/modules/shared/grids-resources.module.js +0 -20
- package/esm2015/plugin-resources/grids-resources-provider.js +0 -16
- package/esm2015/polyfills.js +0 -29
- package/esm2015/public_api.js +0 -9
- package/esm5/modules/grid/grid-adapter.service.js +0 -106
- package/esm5/modules/grid/grid-cell.component.js +0 -59
- package/esm5/modules/grid/grid-column.component.js +0 -129
- package/esm5/modules/grid/grid-column.model.js +0 -27
- package/esm5/modules/grid/grid.component.js +0 -1016
- package/esm5/modules/grid/grid.module.js +0 -53
- package/esm5/modules/grid/types/grid-column-alignment.js +0 -1
- package/esm5/modules/grid/types/grid-column-description-model-change.js +0 -1
- package/esm5/modules/grid/types/grid-column-heading-model-change.js +0 -1
- package/esm5/modules/grid/types/grid-column-inline-help-popover-model-change.js +0 -1
- package/esm5/modules/grid/types/grid-column-width-model-change.js +0 -1
- package/esm5/modules/grid/types/grid-message-type.js +0 -20
- package/esm5/modules/grid/types/grid-message.js +0 -1
- package/esm5/modules/grid/types/grid-row-delete-cancel-args.js +0 -1
- package/esm5/modules/grid/types/grid-row-delete-config.js +0 -1
- package/esm5/modules/grid/types/grid-row-delete-confirm-args.js +0 -1
- package/esm5/modules/grid/types/grid-row-delete-contents.js +0 -1
- package/esm5/modules/grid/types/grid-selected-rows-model-change.js +0 -1
- package/esm5/modules/grid/types/grid-selected-rows-source.js +0 -12
- package/esm5/modules/grid/types/grid-ui-config.js +0 -1
- package/esm5/modules/shared/grids-resources.module.js +0 -23
- package/esm5/plugin-resources/grids-resources-provider.js +0 -17
- package/esm5/polyfills.js +0 -29
- package/esm5/public_api.js +0 -9
- package/esm5/skyux-grids.js +0 -9
- package/fesm5/skyux-grids.js +0 -1463
- package/fesm5/skyux-grids.js.map +0 -1
- package/modules/shared/grids-resources.module.d.ts +0 -2
- package/plugin-resources/grids-resources-provider.d.ts +0 -5
- package/polyfills.d.ts +0 -0
- package/skyux-grids.metadata.json +0 -1
- package/src/assets/locales/resources_en_US.json +0 -6
|
@@ -1,1016 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { AfterContentInit, AfterViewInit, ChangeDetectorRef, ChangeDetectionStrategy, ContentChildren, Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, QueryList, SimpleChanges, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
|
|
3
|
-
import { SkyAffixAutoFitContext, SkyAffixService, SkyAppWindowRef, SkyOverlayService, SkyUIConfigService } from '@skyux/core';
|
|
4
|
-
import { DragulaService } from 'ng2-dragula';
|
|
5
|
-
import { BehaviorSubject, Subject, merge, fromEvent } from 'rxjs';
|
|
6
|
-
import { distinctUntilChanged, map, take, takeUntil, takeWhile } from 'rxjs/operators';
|
|
7
|
-
import { ListItemModel } from '@skyux/list-builder-common';
|
|
8
|
-
import { SkyGridMessageType } from './types/grid-message-type';
|
|
9
|
-
import { SkyGridSelectedRowsSource } from './types/grid-selected-rows-source';
|
|
10
|
-
import { SkyGridColumnComponent } from './grid-column.component';
|
|
11
|
-
import { SkyGridColumnModel } from './grid-column.model';
|
|
12
|
-
import { SkyGridAdapterService } from './grid-adapter.service';
|
|
13
|
-
import '../../polyfills';
|
|
14
|
-
var nextId = 0;
|
|
15
|
-
var SkyGridComponent = /** @class */ (function () {
|
|
16
|
-
function SkyGridComponent(affixService, changeDetector, dragulaService, gridAdapter, overlayService, skyWindow, uiConfigService) {
|
|
17
|
-
this.affixService = affixService;
|
|
18
|
-
this.changeDetector = changeDetector;
|
|
19
|
-
this.dragulaService = dragulaService;
|
|
20
|
-
this.gridAdapter = gridAdapter;
|
|
21
|
-
this.overlayService = overlayService;
|
|
22
|
-
this.skyWindow = skyWindow;
|
|
23
|
-
this.uiConfigService = uiConfigService;
|
|
24
|
-
/**
|
|
25
|
-
* Indicates whether to enable the multiselect feature to display a column of
|
|
26
|
-
* checkboxes on the left side of the grid. You can specify a unique ID with
|
|
27
|
-
* the `multiselectRowId` property, but multiselect defaults to the `id` property on
|
|
28
|
-
* the `data` object. To include options to select and clear all multiselect checkboxes,
|
|
29
|
-
* we recommend the [list view grid](https://developer.blackbaud.com/skyux/components/list/grid) component.
|
|
30
|
-
* @default false
|
|
31
|
-
*/
|
|
32
|
-
this.enableMultiselect = false;
|
|
33
|
-
/**
|
|
34
|
-
* Specifies how the grid fits to its parent. The valid options are `width`,
|
|
35
|
-
* which fits the grid to the parent's full width, and `scroll`, which allows the grid
|
|
36
|
-
* to exceed the parent's width. If the grid does not have enough columns to fill
|
|
37
|
-
* the parent's width, it always stretches to the parent's full width.
|
|
38
|
-
*/
|
|
39
|
-
this.fit = 'width';
|
|
40
|
-
/**
|
|
41
|
-
* Indicates whether to display a toolbar with the grid.
|
|
42
|
-
*/
|
|
43
|
-
this.hasToolbar = false;
|
|
44
|
-
/**
|
|
45
|
-
* Provides an observable to send commands to the grid.
|
|
46
|
-
*/
|
|
47
|
-
this.messageStream = new Subject();
|
|
48
|
-
/**
|
|
49
|
-
* Fires when the width of a column changes.
|
|
50
|
-
*/
|
|
51
|
-
this.columnWidthChange = new EventEmitter();
|
|
52
|
-
/**
|
|
53
|
-
* Fires when the selection of multiselect checkboxes changes.
|
|
54
|
-
* Emits an array of IDs for the selected rows based on the `multiselectRowId` property
|
|
55
|
-
* that the consumer provides.
|
|
56
|
-
*/
|
|
57
|
-
this.multiselectSelectionChange = new EventEmitter();
|
|
58
|
-
/**
|
|
59
|
-
* @internal
|
|
60
|
-
*/
|
|
61
|
-
this.rowDeleteCancel = new EventEmitter();
|
|
62
|
-
/**
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
this.rowDeleteConfirm = new EventEmitter();
|
|
66
|
-
/**
|
|
67
|
-
* Fires when the columns to display in the grid change or when the order of the columns changes.
|
|
68
|
-
* The event emits an array of IDs for the displayed columns that reflects the column order.
|
|
69
|
-
*/
|
|
70
|
-
this.selectedColumnIdsChange = new EventEmitter();
|
|
71
|
-
/**
|
|
72
|
-
* Fires when the active sort field changes.
|
|
73
|
-
*/
|
|
74
|
-
this.sortFieldChange = new EventEmitter();
|
|
75
|
-
this.columnResizeStep = 10;
|
|
76
|
-
this.gridId = ++nextId;
|
|
77
|
-
this.rowDeleteConfigs = [];
|
|
78
|
-
this.maxColWidth = 9999; // This is an arbitrary number, as the input range picker won't work without a value.
|
|
79
|
-
this.minColWidth = 50;
|
|
80
|
-
this.showResizeBar = false;
|
|
81
|
-
this.showTopScroll = false;
|
|
82
|
-
this.isDraggingResizeHandle = false;
|
|
83
|
-
this.isResized = false;
|
|
84
|
-
this.ngUnsubscribe = new Subject();
|
|
85
|
-
this.rowDeleteContents = {};
|
|
86
|
-
this.subscriptions = [];
|
|
87
|
-
this.scrollTriggered = false;
|
|
88
|
-
this.selectedColumnIdsSet = false;
|
|
89
|
-
this.displayedColumns = new Array();
|
|
90
|
-
this.items = new Array();
|
|
91
|
-
this.currentSortField = new BehaviorSubject({
|
|
92
|
-
fieldSelector: '',
|
|
93
|
-
descending: false
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
Object.defineProperty(SkyGridComponent.prototype, "selectedColumnIds", {
|
|
97
|
-
get: function () {
|
|
98
|
-
return this._selectedColumnIds;
|
|
99
|
-
},
|
|
100
|
-
/**
|
|
101
|
-
* Specifies the columns to display in the grid based on the `id` or `field` properties
|
|
102
|
-
* of the columns. If no columns are specified, then the grid displays all columns.
|
|
103
|
-
*/
|
|
104
|
-
set: function (value) {
|
|
105
|
-
var currentIds = this._selectedColumnIds;
|
|
106
|
-
this._selectedColumnIds = value;
|
|
107
|
-
if (this.columns) {
|
|
108
|
-
this.setDisplayedColumns();
|
|
109
|
-
}
|
|
110
|
-
// Ensure that the ids have changed.
|
|
111
|
-
if (!currentIds ||
|
|
112
|
-
!value ||
|
|
113
|
-
!this.arraysEqual(value, currentIds)) {
|
|
114
|
-
// This variable ensures that we do not set user config options or fire the change event
|
|
115
|
-
// on the first time that the columns are set up
|
|
116
|
-
if (this.selectedColumnIdsSet) {
|
|
117
|
-
this.setUserConfig({
|
|
118
|
-
selectedColumnIds: value
|
|
119
|
-
});
|
|
120
|
-
this.selectedColumnIdsChange.emit(this._selectedColumnIds);
|
|
121
|
-
if (this.isResized) {
|
|
122
|
-
this.resetTableWidth();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
this.selectedColumnIdsSet = true;
|
|
127
|
-
},
|
|
128
|
-
enumerable: true,
|
|
129
|
-
configurable: true
|
|
130
|
-
});
|
|
131
|
-
Object.defineProperty(SkyGridComponent.prototype, "selectedRowIds", {
|
|
132
|
-
get: function () {
|
|
133
|
-
return this._selectedRowIds;
|
|
134
|
-
},
|
|
135
|
-
/**
|
|
136
|
-
* Specifies a set of IDs for the rows to select in a multiselect grid.
|
|
137
|
-
* The IDs match the `id` properties of the `data` objects.
|
|
138
|
-
* Rows with IDs that are not included are de-selected in the grid.
|
|
139
|
-
*/
|
|
140
|
-
set: function (value) {
|
|
141
|
-
if (value) {
|
|
142
|
-
this._selectedRowIds = value;
|
|
143
|
-
this.applySelectedRows();
|
|
144
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.SelectedRowIdsChange);
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
enumerable: true,
|
|
148
|
-
configurable: true
|
|
149
|
-
});
|
|
150
|
-
Object.defineProperty(SkyGridComponent.prototype, "tableWidth", {
|
|
151
|
-
get: function () {
|
|
152
|
-
return this.tableElementRef.nativeElement.offsetWidth;
|
|
153
|
-
},
|
|
154
|
-
enumerable: true,
|
|
155
|
-
configurable: true
|
|
156
|
-
});
|
|
157
|
-
SkyGridComponent.prototype.ngOnInit = function () {
|
|
158
|
-
var _this = this;
|
|
159
|
-
this.messageStream
|
|
160
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
161
|
-
.subscribe(function (message) {
|
|
162
|
-
_this.handleIncomingMessages(message);
|
|
163
|
-
});
|
|
164
|
-
};
|
|
165
|
-
SkyGridComponent.prototype.ngAfterContentInit = function () {
|
|
166
|
-
var _this = this;
|
|
167
|
-
if (this.settingsKey) {
|
|
168
|
-
this.applyUserConfig().then(function () {
|
|
169
|
-
_this.initColumns();
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
this.initColumns();
|
|
174
|
-
}
|
|
175
|
-
// Setup column drag-and-drop.
|
|
176
|
-
this.gridAdapter.initializeDragAndDrop(this.dragulaService, function (selectedColumnIds) {
|
|
177
|
-
_this.onHeaderDrop(selectedColumnIds);
|
|
178
|
-
});
|
|
179
|
-
this.applySelectedRows();
|
|
180
|
-
};
|
|
181
|
-
SkyGridComponent.prototype.ngAfterViewInit = function () {
|
|
182
|
-
this.checkUserColumnWidthsForScroll();
|
|
183
|
-
};
|
|
184
|
-
SkyGridComponent.prototype.ngOnChanges = function (changes) {
|
|
185
|
-
var _this = this;
|
|
186
|
-
if (changes.columns && this.columns) {
|
|
187
|
-
if (this.selectedColumnIds) {
|
|
188
|
-
this.selectedColumnIds = this.selectedColumnIds.filter(function (columnId) { return _this.columns.find(function (column) { return column.id === columnId; }); });
|
|
189
|
-
}
|
|
190
|
-
this.setDisplayedColumns(true);
|
|
191
|
-
}
|
|
192
|
-
if (changes.data && this.data) {
|
|
193
|
-
this.transformData();
|
|
194
|
-
// This set timeout is necessary to ensure the data has rendered in the grid
|
|
195
|
-
setTimeout(function () {
|
|
196
|
-
// This cleans up any lingering row deletes for items that have been removed.
|
|
197
|
-
Object.keys(_this.rowDeleteContents).forEach(function (id) {
|
|
198
|
-
if (!_this.data.find(function (item) { return item.id === id; })) {
|
|
199
|
-
_this.destroyRowDelete(id);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// The rows re-render thus messing up the affixers. We must reaffix them so that things
|
|
203
|
-
// continue to render correctly.
|
|
204
|
-
var rowElement = _this.tableElementRef.nativeElement.querySelector('[sky-cmp-id="' + id + '"]');
|
|
205
|
-
_this.rowDeleteContents[id].affixer.affixTo(rowElement, {
|
|
206
|
-
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
207
|
-
isSticky: true,
|
|
208
|
-
placement: 'above',
|
|
209
|
-
verticalAlignment: 'top',
|
|
210
|
-
horizontalAlignment: 'left',
|
|
211
|
-
enableAutoFit: false
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
_this.checkUserColumnWidthsForScroll();
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
if (changes.sortField) {
|
|
219
|
-
this.setSortHeaders();
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
SkyGridComponent.prototype.ngOnDestroy = function () {
|
|
223
|
-
var _this = this;
|
|
224
|
-
this.subscriptions.forEach(function (subscription) {
|
|
225
|
-
subscription.unsubscribe();
|
|
226
|
-
});
|
|
227
|
-
this.multiselectSelectionChange.complete();
|
|
228
|
-
this.ngUnsubscribe.next();
|
|
229
|
-
this.ngUnsubscribe.complete();
|
|
230
|
-
Object.keys(this.rowDeleteContents).forEach(function (id) {
|
|
231
|
-
_this.destroyRowDelete(id);
|
|
232
|
-
});
|
|
233
|
-
};
|
|
234
|
-
SkyGridComponent.prototype.onWindowResize = function () {
|
|
235
|
-
this.checkUserColumnWidthsForScroll();
|
|
236
|
-
};
|
|
237
|
-
SkyGridComponent.prototype.getTopScrollWidth = function () {
|
|
238
|
-
return this.tableElementRef.nativeElement.scrollWidth;
|
|
239
|
-
};
|
|
240
|
-
SkyGridComponent.prototype.getTableClassNames = function () {
|
|
241
|
-
var classNames = [];
|
|
242
|
-
if (this.fit !== 'scroll') {
|
|
243
|
-
classNames.push('sky-grid-fit');
|
|
244
|
-
}
|
|
245
|
-
if (this.hasToolbar) {
|
|
246
|
-
classNames.push('sky-grid-has-toolbar');
|
|
247
|
-
}
|
|
248
|
-
return this.addDelimeter(classNames, ' ');
|
|
249
|
-
};
|
|
250
|
-
SkyGridComponent.prototype.getTableHeaderClassNames = function (column) {
|
|
251
|
-
var classNames = [];
|
|
252
|
-
if (column && column.locked) {
|
|
253
|
-
classNames.push('sky-grid-header-locked');
|
|
254
|
-
}
|
|
255
|
-
return this.addDelimeter(classNames, ' ');
|
|
256
|
-
};
|
|
257
|
-
SkyGridComponent.prototype.getCaretIconNames = function (column) {
|
|
258
|
-
var iconNames = [];
|
|
259
|
-
this.getSortDirection(column.field).subscribe(function (sortDir) {
|
|
260
|
-
if (sortDir === 'asc') {
|
|
261
|
-
iconNames.push('caret-up');
|
|
262
|
-
}
|
|
263
|
-
if (sortDir === 'desc') {
|
|
264
|
-
iconNames.push('caret-down');
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
return this.addDelimeter(iconNames, ' ');
|
|
268
|
-
};
|
|
269
|
-
SkyGridComponent.prototype.onKeydown = function (event, column) {
|
|
270
|
-
var key = event.key.toLowerCase();
|
|
271
|
-
if (key === 'enter' || key === ' ') {
|
|
272
|
-
this.sortByColumn(column);
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
SkyGridComponent.prototype.sortByColumn = function (column) {
|
|
276
|
-
var _this = this;
|
|
277
|
-
if (!this.isDraggingResizeHandle && column.isSortable) {
|
|
278
|
-
this.currentSortField
|
|
279
|
-
.pipe(take(1), map(function (field) {
|
|
280
|
-
var selector = {
|
|
281
|
-
fieldSelector: column.field,
|
|
282
|
-
descending: true
|
|
283
|
-
};
|
|
284
|
-
if (field && field.fieldSelector === column.field && field.descending) {
|
|
285
|
-
selector = {
|
|
286
|
-
fieldSelector: column.field,
|
|
287
|
-
descending: false
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
_this.sortFieldChange.emit(selector);
|
|
291
|
-
_this.currentSortField.next(selector);
|
|
292
|
-
}))
|
|
293
|
-
.subscribe();
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
SkyGridComponent.prototype.getSortDirection = function (columnField) {
|
|
297
|
-
return this.currentSortField
|
|
298
|
-
.pipe(distinctUntilChanged(), map(function (field) {
|
|
299
|
-
return field.fieldSelector === columnField ?
|
|
300
|
-
(field.descending ? 'desc' : 'asc') : undefined;
|
|
301
|
-
}));
|
|
302
|
-
};
|
|
303
|
-
SkyGridComponent.prototype.getAriaSortDirection = function (column) {
|
|
304
|
-
return this.currentSortField
|
|
305
|
-
.pipe(distinctUntilChanged(), map(function (field) {
|
|
306
|
-
return field.fieldSelector === column.field ?
|
|
307
|
-
(field.descending ? 'descending' : 'ascending') : (column.isSortable ? 'none' : undefined);
|
|
308
|
-
}));
|
|
309
|
-
};
|
|
310
|
-
SkyGridComponent.prototype.getCaretVisibility = function (columnField) {
|
|
311
|
-
return this.currentSortField
|
|
312
|
-
.pipe(distinctUntilChanged(), map(function (field) {
|
|
313
|
-
return field.fieldSelector === columnField ? 'visible' : 'hidden';
|
|
314
|
-
}));
|
|
315
|
-
};
|
|
316
|
-
SkyGridComponent.prototype.getHelpInlineClass = function (columnField) {
|
|
317
|
-
return this.getCaretVisibility(columnField)
|
|
318
|
-
.pipe(map(function (visibility) {
|
|
319
|
-
return visibility === 'hidden';
|
|
320
|
-
}));
|
|
321
|
-
};
|
|
322
|
-
SkyGridComponent.prototype.onMultiselectCheckboxChange = function () {
|
|
323
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.CheckboxChange);
|
|
324
|
-
};
|
|
325
|
-
SkyGridComponent.prototype.updateColumnHeading = function (change) {
|
|
326
|
-
var foundColumnModel = this.columns.find(function (column) {
|
|
327
|
-
return (change.id !== undefined && change.id === column.id ||
|
|
328
|
-
change.field !== undefined && change.field === column.field);
|
|
329
|
-
});
|
|
330
|
-
/* istanbul ignore else */
|
|
331
|
-
if (foundColumnModel) {
|
|
332
|
-
foundColumnModel.heading = change.value;
|
|
333
|
-
this.changeDetector.markForCheck();
|
|
334
|
-
}
|
|
335
|
-
};
|
|
336
|
-
SkyGridComponent.prototype.updateInlineHelpPopover = function (change) {
|
|
337
|
-
var foundColumnModel = this.columns.find(function (column) {
|
|
338
|
-
return (change.id !== undefined && change.id === column.id ||
|
|
339
|
-
change.field !== undefined && change.field === column.field);
|
|
340
|
-
});
|
|
341
|
-
/* istanbul ignore else */
|
|
342
|
-
if (foundColumnModel) {
|
|
343
|
-
foundColumnModel.inlineHelpPopover = change.value;
|
|
344
|
-
this.changeDetector.markForCheck();
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
SkyGridComponent.prototype.updateColumnDescription = function (change) {
|
|
348
|
-
var foundColumnModel = this.columns.find(function (column) {
|
|
349
|
-
return (change.id !== undefined && change.id === column.id ||
|
|
350
|
-
change.field !== undefined && change.field === column.field);
|
|
351
|
-
});
|
|
352
|
-
/* istanbul ignore else */
|
|
353
|
-
if (foundColumnModel) {
|
|
354
|
-
foundColumnModel.description = change.value;
|
|
355
|
-
this.changeDetector.markForCheck();
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
SkyGridComponent.prototype.onResizeColumnStart = function (event) {
|
|
359
|
-
var _this = this;
|
|
360
|
-
// If this table hasn't been resized, initialize all the resize widths.
|
|
361
|
-
if (!this.isResized) {
|
|
362
|
-
this.initColumnWidths();
|
|
363
|
-
this.isResized = true;
|
|
364
|
-
}
|
|
365
|
-
this.initializeResizeColumn(event);
|
|
366
|
-
this.isDraggingResizeHandle = true;
|
|
367
|
-
this.xPosStart = event.pageX;
|
|
368
|
-
this.showResizeBar = true;
|
|
369
|
-
// Show visual indicator of where mouse is dragging (resizeBar).
|
|
370
|
-
this.changeDetector.detectChanges();
|
|
371
|
-
this.setResizeBarPosition(event.pageX);
|
|
372
|
-
event.preventDefault();
|
|
373
|
-
event.stopPropagation();
|
|
374
|
-
var mouseMoveEvent = fromEvent(document, 'mousemove');
|
|
375
|
-
var touchMoveEvent = fromEvent(document, 'touchmove');
|
|
376
|
-
merge(mouseMoveEvent, touchMoveEvent)
|
|
377
|
-
.pipe(takeWhile(function () {
|
|
378
|
-
return _this.isDraggingResizeHandle;
|
|
379
|
-
}))
|
|
380
|
-
.subscribe(function (moveEvent) {
|
|
381
|
-
_this.onResizeHandleMove(moveEvent);
|
|
382
|
-
});
|
|
383
|
-
var mouseUpEvent = fromEvent(document, 'mouseup');
|
|
384
|
-
var touchEndEvent = fromEvent(document, 'touchend');
|
|
385
|
-
merge(mouseUpEvent, touchEndEvent)
|
|
386
|
-
.pipe(takeWhile(function () {
|
|
387
|
-
return _this.isDraggingResizeHandle;
|
|
388
|
-
}))
|
|
389
|
-
.subscribe(function (endEvent) {
|
|
390
|
-
_this.onResizeHandleRelease(endEvent);
|
|
391
|
-
});
|
|
392
|
-
};
|
|
393
|
-
SkyGridComponent.prototype.onKeydownResizeCol = function (event) {
|
|
394
|
-
// If this table hasn't been resized, initialize all the resize widths.
|
|
395
|
-
if (!this.isResized) {
|
|
396
|
-
this.initColumnWidths();
|
|
397
|
-
this.isResized = true;
|
|
398
|
-
}
|
|
399
|
-
this.initializeResizeColumn(event);
|
|
400
|
-
};
|
|
401
|
-
SkyGridComponent.prototype.onInputChangeResizeCol = function (event) {
|
|
402
|
-
var input = event.target;
|
|
403
|
-
var newValue = Number(input.value);
|
|
404
|
-
var deltaX = newValue - this.startColumnWidth;
|
|
405
|
-
this.resizeColumnByIndex(this.activeResizeColumnIndex, newValue, deltaX);
|
|
406
|
-
var left = input.getBoundingClientRect().left;
|
|
407
|
-
this.setResizeBarPosition(left);
|
|
408
|
-
};
|
|
409
|
-
SkyGridComponent.prototype.onResizeHandleMove = function (event) {
|
|
410
|
-
var deltaX = event.pageX - this.xPosStart;
|
|
411
|
-
var newColWidth = this.startColumnWidth + deltaX;
|
|
412
|
-
if (newColWidth <= this.minColWidth) {
|
|
413
|
-
event.stopPropagation();
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
var max = this.getMaxRangeByIndex(this.activeResizeColumnIndex);
|
|
417
|
-
if (this.fit === 'width' && newColWidth > max) {
|
|
418
|
-
event.stopPropagation();
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
this.setResizeBarPosition(event.pageX);
|
|
422
|
-
};
|
|
423
|
-
SkyGridComponent.prototype.onResizeHandleBlur = function (event) {
|
|
424
|
-
this.showResizeBar = false;
|
|
425
|
-
};
|
|
426
|
-
SkyGridComponent.prototype.onResizeHandleFocus = function (event) {
|
|
427
|
-
this.showResizeBar = true;
|
|
428
|
-
this.changeDetector.detectChanges();
|
|
429
|
-
var target = event.target;
|
|
430
|
-
var left = target.getBoundingClientRect().left;
|
|
431
|
-
this.setResizeBarPosition(left);
|
|
432
|
-
};
|
|
433
|
-
SkyGridComponent.prototype.onResizeHandleRelease = function (event) {
|
|
434
|
-
this.showResizeBar = false;
|
|
435
|
-
var deltaX = event.pageX - this.xPosStart;
|
|
436
|
-
var newColWidth = this.startColumnWidth + deltaX;
|
|
437
|
-
this.resizeColumnByIndex(this.activeResizeColumnIndex, newColWidth, deltaX);
|
|
438
|
-
this.isDraggingResizeHandle = false;
|
|
439
|
-
this.activeResizeColumnIndex = undefined;
|
|
440
|
-
event.stopPropagation();
|
|
441
|
-
this.changeDetector.markForCheck();
|
|
442
|
-
};
|
|
443
|
-
SkyGridComponent.prototype.onRowClick = function (event, selectedItem) {
|
|
444
|
-
/* istanbul ignore else */
|
|
445
|
-
if (this.enableMultiselect) {
|
|
446
|
-
if (event.target === event.currentTarget || !this.isInteractiveElement(event)) {
|
|
447
|
-
selectedItem.isSelected = !selectedItem.isSelected;
|
|
448
|
-
this.changeDetector.markForCheck();
|
|
449
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.RowClick);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
};
|
|
453
|
-
SkyGridComponent.prototype.isRowHighlighted = function (id) {
|
|
454
|
-
if (this.rowHighlightedId) {
|
|
455
|
-
return id === this.rowHighlightedId;
|
|
456
|
-
}
|
|
457
|
-
return false;
|
|
458
|
-
};
|
|
459
|
-
SkyGridComponent.prototype.getRowHeight = function (index) {
|
|
460
|
-
return this.gridAdapter.getRowHeight(this.tableElementRef, index);
|
|
461
|
-
};
|
|
462
|
-
SkyGridComponent.prototype.cancelRowDelete = function (id) {
|
|
463
|
-
this.rowDeleteConfigs = this.rowDeleteConfigs.filter(function (config) { return config.id !== id; });
|
|
464
|
-
this.rowDeleteCancel.emit({ id: id });
|
|
465
|
-
this.destroyRowDelete(id);
|
|
466
|
-
};
|
|
467
|
-
SkyGridComponent.prototype.confirmRowDelete = function (id) {
|
|
468
|
-
this.rowDeleteConfigs.find(function (config) { return config.id === id; }).pending = true;
|
|
469
|
-
this.rowDeleteConfirm.emit({ id: id });
|
|
470
|
-
};
|
|
471
|
-
SkyGridComponent.prototype.getRowDeleteItem = function (id) {
|
|
472
|
-
return this.rowDeleteConfigs.find(function (rowDelete) { return rowDelete.id === id; });
|
|
473
|
-
};
|
|
474
|
-
// Prevent touch devices from inadvertently scrolling grid while dragging columns.
|
|
475
|
-
SkyGridComponent.prototype.onTouchMove = function (event) {
|
|
476
|
-
event.preventDefault();
|
|
477
|
-
};
|
|
478
|
-
SkyGridComponent.prototype.onTopScroll = function (event) {
|
|
479
|
-
/* sanity check */
|
|
480
|
-
/* istanbul ignore else */
|
|
481
|
-
if (this.tableContainerElementRef) {
|
|
482
|
-
if (this.scrollTriggered) {
|
|
483
|
-
this.scrollTriggered = false;
|
|
484
|
-
this.tableContainerElementRef.nativeElement.scrollLeft =
|
|
485
|
-
this.topScrollContainerElementRef.nativeElement.scrollLeft;
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
this.scrollTriggered = true;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
};
|
|
492
|
-
SkyGridComponent.prototype.onGridScroll = function (event) {
|
|
493
|
-
/* sanity check */
|
|
494
|
-
/* istanbul ignore else */
|
|
495
|
-
if (this.topScrollContainerElementRef) {
|
|
496
|
-
if (this.scrollTriggered) {
|
|
497
|
-
this.scrollTriggered = false;
|
|
498
|
-
this.topScrollContainerElementRef.nativeElement.scrollLeft =
|
|
499
|
-
this.tableContainerElementRef.nativeElement.scrollLeft;
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
this.scrollTriggered = true;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
SkyGridComponent.prototype.checkUserColumnWidthsForScroll = function () {
|
|
507
|
-
var _this = this;
|
|
508
|
-
if (!this.showTopScroll && this.columnElementRefs && this.columnElementRefs.length > 0) {
|
|
509
|
-
var columnsWidthTotal_1 = 0;
|
|
510
|
-
var windowSize_1 = this.skyWindow.nativeWindow.innerWidth;
|
|
511
|
-
this.columnElementRefs.forEach(function (col) {
|
|
512
|
-
if (!_this.showTopScroll) {
|
|
513
|
-
var computedWidth = parseFloat(window.getComputedStyle(col.nativeElement).width);
|
|
514
|
-
var offsetWidth = col.nativeElement.offsetWidth;
|
|
515
|
-
var width = Math.max(computedWidth || offsetWidth, _this.minColWidth);
|
|
516
|
-
columnsWidthTotal_1 = columnsWidthTotal_1 + width;
|
|
517
|
-
if (columnsWidthTotal_1 > windowSize_1) {
|
|
518
|
-
_this.showTopScroll = true;
|
|
519
|
-
setTimeout(function () {
|
|
520
|
-
_this.changeDetector.markForCheck();
|
|
521
|
-
});
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
};
|
|
527
|
-
SkyGridComponent.prototype.multiselectSelectAll = function () {
|
|
528
|
-
for (var i = 0; i < this.items.length; i++) {
|
|
529
|
-
this.items[i].isSelected = true;
|
|
530
|
-
}
|
|
531
|
-
this.changeDetector.markForCheck();
|
|
532
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.SelectAll);
|
|
533
|
-
};
|
|
534
|
-
SkyGridComponent.prototype.multiselectClearAll = function () {
|
|
535
|
-
for (var i = 0; i < this.items.length; i++) {
|
|
536
|
-
this.items[i].isSelected = false;
|
|
537
|
-
}
|
|
538
|
-
this.changeDetector.markForCheck();
|
|
539
|
-
this.emitSelectedRows(SkyGridSelectedRowsSource.ClearAll);
|
|
540
|
-
};
|
|
541
|
-
SkyGridComponent.prototype.handleIncomingMessages = function (message) {
|
|
542
|
-
var _this = this;
|
|
543
|
-
/* tslint:disable-next-line:switch-default */
|
|
544
|
-
switch (message.type) {
|
|
545
|
-
case SkyGridMessageType.SelectAll:
|
|
546
|
-
this.multiselectSelectAll();
|
|
547
|
-
break;
|
|
548
|
-
case SkyGridMessageType.ClearAll:
|
|
549
|
-
this.multiselectClearAll();
|
|
550
|
-
break;
|
|
551
|
-
case SkyGridMessageType.PromptDeleteRow:
|
|
552
|
-
/* sanity check */
|
|
553
|
-
/* istanbul ignore else */
|
|
554
|
-
if (message.data && message.data.promptDeleteRow) {
|
|
555
|
-
var existingConfig = this.rowDeleteConfigs
|
|
556
|
-
.find(function (config) { return config.id === message.data.promptDeleteRow.id; });
|
|
557
|
-
if (existingConfig) {
|
|
558
|
-
existingConfig.pending = false;
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
this.rowDeleteConfigs.push({ id: message.data.promptDeleteRow.id, pending: false });
|
|
562
|
-
var overlay_1 = this.overlayService.create({
|
|
563
|
-
enableScroll: true,
|
|
564
|
-
showBackdrop: false,
|
|
565
|
-
closeOnNavigation: true,
|
|
566
|
-
enableClose: false,
|
|
567
|
-
enablePointerEvents: true
|
|
568
|
-
});
|
|
569
|
-
overlay_1.attachTemplate(this.inlineDeleteTemplateRef, { $implicit: this.data.find(function (item) { return item.id === message.data.promptDeleteRow.id; }) });
|
|
570
|
-
/**
|
|
571
|
-
* We are manually setting the z-index here because overlays will always be on top of
|
|
572
|
-
* the omnibar. This manual setting is 1 less than the omnibar's z-index of 1000. We
|
|
573
|
-
* discussed changing the overlay service to allow for this but decided against that
|
|
574
|
-
* change at this time due to its niche nature.
|
|
575
|
-
*/
|
|
576
|
-
overlay_1.componentRef.instance.zIndex = '999';
|
|
577
|
-
setTimeout(function () {
|
|
578
|
-
var inlineDeleteRef = _this.inlineDeleteRefs.toArray()
|
|
579
|
-
.find(function (elRef) {
|
|
580
|
-
return elRef.nativeElement.id === 'row-delete-ref-' + message.data.promptDeleteRow.id;
|
|
581
|
-
});
|
|
582
|
-
var affixer = _this.affixService.createAffixer(inlineDeleteRef);
|
|
583
|
-
var rowElement = _this.tableElementRef.nativeElement.querySelector('[sky-cmp-id="' + message.data.promptDeleteRow.id + '"]');
|
|
584
|
-
affixer.affixTo(rowElement, {
|
|
585
|
-
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
586
|
-
isSticky: true,
|
|
587
|
-
placement: 'above',
|
|
588
|
-
verticalAlignment: 'top',
|
|
589
|
-
horizontalAlignment: 'left',
|
|
590
|
-
enableAutoFit: false
|
|
591
|
-
});
|
|
592
|
-
_this.rowDeleteContents[message.data.promptDeleteRow.id] = {
|
|
593
|
-
affixer: affixer,
|
|
594
|
-
overlay: overlay_1
|
|
595
|
-
};
|
|
596
|
-
});
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
break;
|
|
600
|
-
case SkyGridMessageType.AbortDeleteRow:
|
|
601
|
-
/* sanity check */
|
|
602
|
-
/* istanbul ignore else */
|
|
603
|
-
if (message.data && message.data.abortDeleteRow) {
|
|
604
|
-
this.rowDeleteConfigs = this.rowDeleteConfigs.filter(function (config) { return config.id !== message.data.abortDeleteRow.id; });
|
|
605
|
-
this.destroyRowDelete(message.data.abortDeleteRow.id);
|
|
606
|
-
}
|
|
607
|
-
break;
|
|
608
|
-
}
|
|
609
|
-
this.changeDetector.markForCheck();
|
|
610
|
-
};
|
|
611
|
-
SkyGridComponent.prototype.onHeaderDrop = function (newColumnIds) {
|
|
612
|
-
// update selected columnIds
|
|
613
|
-
this.selectedColumnIdsSet = true;
|
|
614
|
-
this.selectedColumnIds = newColumnIds;
|
|
615
|
-
// mark for check because we are using ChangeDetectionStrategy.onPush
|
|
616
|
-
this.changeDetector.markForCheck();
|
|
617
|
-
};
|
|
618
|
-
SkyGridComponent.prototype.setDisplayedColumns = function (respectHidden) {
|
|
619
|
-
var _this = this;
|
|
620
|
-
if (respectHidden === void 0) { respectHidden = false; }
|
|
621
|
-
if (this.selectedColumnIds !== undefined) {
|
|
622
|
-
// setup displayed columns
|
|
623
|
-
this.displayedColumns = this.selectedColumnIds
|
|
624
|
-
.filter(function (columnId) { return _this.columns.find(function (column) { return column.id === columnId; }); }).map(function (columnId) { return _this.columns.filter(function (column) { return column.id === columnId; })[0]; });
|
|
625
|
-
}
|
|
626
|
-
else if (respectHidden) {
|
|
627
|
-
this.displayedColumns = this.columns.filter(function (column) {
|
|
628
|
-
return !column.hidden;
|
|
629
|
-
});
|
|
630
|
-
}
|
|
631
|
-
else {
|
|
632
|
-
this.displayedColumns = this.columns;
|
|
633
|
-
}
|
|
634
|
-
};
|
|
635
|
-
SkyGridComponent.prototype.transformData = function () {
|
|
636
|
-
// Transform data into object with id and data properties
|
|
637
|
-
if (this.data && this.data.length > 0 && this.data[0].id && !this.data[0].data) {
|
|
638
|
-
if (this.multiselectRowId) {
|
|
639
|
-
this.items = this.getGridDataWithSelectedRows();
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
this.items = this.data.map(function (item) { return new ListItemModel(item.id, item); });
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
else {
|
|
646
|
-
this.items = this.data;
|
|
647
|
-
}
|
|
648
|
-
};
|
|
649
|
-
SkyGridComponent.prototype.getGridDataWithSelectedRows = function () {
|
|
650
|
-
var _this = this;
|
|
651
|
-
var selectedRows = this.getSelectedRows();
|
|
652
|
-
return this.data.map(function (item) {
|
|
653
|
-
var checked;
|
|
654
|
-
if (item.hasOwnProperty(_this.multiselectRowId)) {
|
|
655
|
-
checked = selectedRows.indexOf(item[_this.multiselectRowId]) > -1;
|
|
656
|
-
}
|
|
657
|
-
else {
|
|
658
|
-
checked = selectedRows.indexOf(item.id) > -1;
|
|
659
|
-
}
|
|
660
|
-
return new ListItemModel(item.id, item, checked);
|
|
661
|
-
});
|
|
662
|
-
};
|
|
663
|
-
SkyGridComponent.prototype.applySelectedRows = function () {
|
|
664
|
-
if (this.items && this.items.length > 0 && this.selectedRowIds) {
|
|
665
|
-
for (var i = 0; i < this.items.length; i++) {
|
|
666
|
-
this.items[i].isSelected = (this.selectedRowIds.indexOf(this.items[i].id) > -1);
|
|
667
|
-
}
|
|
668
|
-
this.changeDetector.markForCheck();
|
|
669
|
-
}
|
|
670
|
-
};
|
|
671
|
-
SkyGridComponent.prototype.setSortHeaders = function () {
|
|
672
|
-
this.currentSortField.next(this.sortField || { fieldSelector: '', descending: false });
|
|
673
|
-
};
|
|
674
|
-
SkyGridComponent.prototype.getColumnsFromComponent = function () {
|
|
675
|
-
this.columns = this.columnComponents.map(function (columnComponent) {
|
|
676
|
-
return new SkyGridColumnModel(columnComponent.template, columnComponent);
|
|
677
|
-
});
|
|
678
|
-
};
|
|
679
|
-
SkyGridComponent.prototype.updateColumns = function () {
|
|
680
|
-
var _this = this;
|
|
681
|
-
this.getColumnsFromComponent();
|
|
682
|
-
this.setDisplayedColumns(true);
|
|
683
|
-
this.changeDetector.markForCheck();
|
|
684
|
-
// This set timeout is necessary to ensure the columns have rendered in the grid
|
|
685
|
-
setTimeout(function () {
|
|
686
|
-
_this.checkUserColumnWidthsForScroll();
|
|
687
|
-
});
|
|
688
|
-
};
|
|
689
|
-
SkyGridComponent.prototype.resizeColumnByIndex = function (columnIndex, newColWidth, deltaX) {
|
|
690
|
-
var column = this.getColumnModelByIndex(columnIndex);
|
|
691
|
-
// Prevent accidental shrinkage below minimum width.
|
|
692
|
-
if (newColWidth <= this.minColWidth) {
|
|
693
|
-
deltaX = deltaX + this.minColWidth - newColWidth;
|
|
694
|
-
newColWidth = this.minColWidth;
|
|
695
|
-
}
|
|
696
|
-
// fit=width adds/removes width from the last column
|
|
697
|
-
// fit=scroll adds/removes width from the table
|
|
698
|
-
if (this.fit === 'width') {
|
|
699
|
-
var lastColumn = this.getLastDisplayedColumn();
|
|
700
|
-
// Prevent accidental growth that would bump last column off screen.
|
|
701
|
-
var max = this.getMaxRangeByIndex(columnIndex);
|
|
702
|
-
if (newColWidth > max) {
|
|
703
|
-
newColWidth = max;
|
|
704
|
-
deltaX = max - this.startColumnWidth;
|
|
705
|
-
}
|
|
706
|
-
column.width = newColWidth;
|
|
707
|
-
lastColumn.width = lastColumn.width - deltaX;
|
|
708
|
-
this.updateMaxRange();
|
|
709
|
-
}
|
|
710
|
-
else {
|
|
711
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'width', this.tableWidth + deltaX + "px");
|
|
712
|
-
column.width = newColWidth;
|
|
713
|
-
}
|
|
714
|
-
this.changeDetector.detectChanges();
|
|
715
|
-
this.columnWidthChange.emit(this.getColumnWidthModelChange());
|
|
716
|
-
};
|
|
717
|
-
SkyGridComponent.prototype.initColumnWidths = function () {
|
|
718
|
-
var _this = this;
|
|
719
|
-
// Establish table width.
|
|
720
|
-
this.showTopScroll = true;
|
|
721
|
-
// Set column widths based on the width initially given by the browser.
|
|
722
|
-
// computedWidth prevents accidental overflow for browsers with sub-pixel widths.
|
|
723
|
-
this.columnElementRefs.forEach(function (col, index) {
|
|
724
|
-
var computedWidth = parseFloat(window.getComputedStyle(col.nativeElement).width);
|
|
725
|
-
var offsetWidth = col.nativeElement.offsetWidth;
|
|
726
|
-
var width = Math.max(computedWidth /* istanbul ignore next */ || offsetWidth, _this.minColWidth);
|
|
727
|
-
_this.getColumnModelByIndex(index).width = width;
|
|
728
|
-
});
|
|
729
|
-
// 'scroll' tables should be allowed to expand outside of their constraints.
|
|
730
|
-
if (this.fit === 'scroll') {
|
|
731
|
-
this.gridAdapter.setStyle(this.tableElementRef, 'min-width', 'auto');
|
|
732
|
-
}
|
|
733
|
-
// Update max limits for input ranges.
|
|
734
|
-
if (this.fit === 'width') {
|
|
735
|
-
this.updateMaxRange();
|
|
736
|
-
}
|
|
737
|
-
this.changeDetector.detectChanges();
|
|
738
|
-
};
|
|
739
|
-
SkyGridComponent.prototype.getColumnWidthModelChange = function () {
|
|
740
|
-
var columnWidthModelChange = new Array();
|
|
741
|
-
this.columns.forEach(function (column) {
|
|
742
|
-
columnWidthModelChange.push({
|
|
743
|
-
id: column.id,
|
|
744
|
-
field: column.field,
|
|
745
|
-
width: column.width
|
|
746
|
-
});
|
|
747
|
-
});
|
|
748
|
-
return columnWidthModelChange;
|
|
749
|
-
};
|
|
750
|
-
SkyGridComponent.prototype.updateMaxRange = function () {
|
|
751
|
-
var _this = this;
|
|
752
|
-
var leftoverWidth = this.getLastDisplayedColumn().width - this.minColWidth;
|
|
753
|
-
this.displayedColumns.forEach(function (column, index) {
|
|
754
|
-
var newMaxRange = column.width + leftoverWidth;
|
|
755
|
-
var rangeInput = _this.getRangeInputByIndex(index);
|
|
756
|
-
rangeInput.nativeElement.max = newMaxRange;
|
|
757
|
-
rangeInput.nativeElement.setAttribute('aria-valuemax', newMaxRange);
|
|
758
|
-
});
|
|
759
|
-
};
|
|
760
|
-
SkyGridComponent.prototype.initializeResizeColumn = function (event) {
|
|
761
|
-
var clickTarget = event.target;
|
|
762
|
-
this.activeResizeColumnIndex = clickTarget.getAttribute('sky-cmp-index');
|
|
763
|
-
var column = this.getColumnModelByIndex(this.activeResizeColumnIndex);
|
|
764
|
-
this.startColumnWidth = column.width;
|
|
765
|
-
};
|
|
766
|
-
SkyGridComponent.prototype.resetTableWidth = function () {
|
|
767
|
-
var _this = this;
|
|
768
|
-
this.skyWindow.nativeWindow.setTimeout(function () {
|
|
769
|
-
_this.gridAdapter.setStyle(_this.tableElementRef, 'width', "auto");
|
|
770
|
-
_this.changeDetector.detectChanges();
|
|
771
|
-
_this.gridAdapter.setStyle(_this.tableElementRef, 'width', _this.tableWidth + "px");
|
|
772
|
-
_this.changeDetector.detectChanges();
|
|
773
|
-
});
|
|
774
|
-
};
|
|
775
|
-
SkyGridComponent.prototype.getRangeInputByIndex = function (index) {
|
|
776
|
-
return this.columnRangeInputElementRefs.find(function (input) {
|
|
777
|
-
return input.nativeElement.getAttribute('sky-cmp-index') === index.toString();
|
|
778
|
-
});
|
|
779
|
-
};
|
|
780
|
-
SkyGridComponent.prototype.getColumnModelByIndex = function (index) {
|
|
781
|
-
return this.displayedColumns[Number(index)];
|
|
782
|
-
};
|
|
783
|
-
SkyGridComponent.prototype.getMaxRangeByIndex = function (index) {
|
|
784
|
-
var columnElementRef = this.columnElementRefs.find(function (th) {
|
|
785
|
-
return th.nativeElement.getAttribute('sky-cmp-index') === index;
|
|
786
|
-
});
|
|
787
|
-
var rangeInput = columnElementRef.nativeElement.querySelector('.sky-grid-column-input-aria-only');
|
|
788
|
-
return Number(rangeInput.max);
|
|
789
|
-
};
|
|
790
|
-
SkyGridComponent.prototype.getLastDisplayedColumn = function () {
|
|
791
|
-
return this.getColumnModelByIndex(this.displayedColumns.length - 1);
|
|
792
|
-
};
|
|
793
|
-
SkyGridComponent.prototype.addDelimeter = function (text, delimiter) {
|
|
794
|
-
return text.filter(function (val) { return val; }).join(delimiter);
|
|
795
|
-
};
|
|
796
|
-
SkyGridComponent.prototype.destroyRowDelete = function (id) {
|
|
797
|
-
var rowDeleteContents = this.rowDeleteContents[id];
|
|
798
|
-
if (rowDeleteContents) {
|
|
799
|
-
rowDeleteContents.affixer.destroy();
|
|
800
|
-
this.overlayService.close(rowDeleteContents.overlay);
|
|
801
|
-
delete this.rowDeleteContents[id];
|
|
802
|
-
}
|
|
803
|
-
};
|
|
804
|
-
SkyGridComponent.prototype.emitSelectedRows = function (source) {
|
|
805
|
-
var selectedRows = {
|
|
806
|
-
selectedRowIds: this.getSelectedRows(),
|
|
807
|
-
source: source
|
|
808
|
-
};
|
|
809
|
-
this.multiselectSelectionChange.emit(selectedRows);
|
|
810
|
-
};
|
|
811
|
-
SkyGridComponent.prototype.getSelectedRows = function () {
|
|
812
|
-
var _this = this;
|
|
813
|
-
return this.items.filter(function (item) {
|
|
814
|
-
return item.isSelected;
|
|
815
|
-
}).map(function (item) {
|
|
816
|
-
if (item.data.hasOwnProperty(_this.multiselectRowId)) {
|
|
817
|
-
return item.data[_this.multiselectRowId];
|
|
818
|
-
}
|
|
819
|
-
return item.id;
|
|
820
|
-
});
|
|
821
|
-
};
|
|
822
|
-
SkyGridComponent.prototype.isInteractiveElement = function (event) {
|
|
823
|
-
var interactiveElSelectors = "\n a,\n button,\n input,\n label,\n option,\n select,\n textarea,\n details,\n dialog,\n menu,\n menuitem,\n summary";
|
|
824
|
-
return event.target.closest(interactiveElSelectors);
|
|
825
|
-
};
|
|
826
|
-
SkyGridComponent.prototype.setResizeBarPosition = function (xPosition) {
|
|
827
|
-
var parentScroll = this.tableContainerElementRef.nativeElement.scrollLeft;
|
|
828
|
-
var resizeBarX = xPosition - this.tableElementRef.nativeElement.getBoundingClientRect().left - parentScroll;
|
|
829
|
-
this.gridAdapter.setStyle(this.resizeBar, 'left', resizeBarX + 'px');
|
|
830
|
-
};
|
|
831
|
-
SkyGridComponent.prototype.applyUserConfig = function () {
|
|
832
|
-
var _this = this;
|
|
833
|
-
return new Promise(function (resolve) {
|
|
834
|
-
_this.uiConfigService.getConfig(_this.settingsKey)
|
|
835
|
-
.pipe(take(1))
|
|
836
|
-
.subscribe(function (config) {
|
|
837
|
-
/* istanbul ignore else */
|
|
838
|
-
if (config && config.selectedColumnIds) {
|
|
839
|
-
// Remove any columnIds that don't exist in the current data set.
|
|
840
|
-
var filteredColumnIds = config.selectedColumnIds.filter(function (id) { return _this.columns.find(function (column) { return column.id === id; }); });
|
|
841
|
-
_this.selectedColumnIds = filteredColumnIds;
|
|
842
|
-
_this.changeDetector.markForCheck();
|
|
843
|
-
}
|
|
844
|
-
resolve();
|
|
845
|
-
}, function () {
|
|
846
|
-
resolve();
|
|
847
|
-
});
|
|
848
|
-
});
|
|
849
|
-
};
|
|
850
|
-
SkyGridComponent.prototype.setUserConfig = function (config) {
|
|
851
|
-
if (!this.settingsKey) {
|
|
852
|
-
return;
|
|
853
|
-
}
|
|
854
|
-
this.uiConfigService.setConfig(this.settingsKey, config)
|
|
855
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
856
|
-
.subscribe(function () { }, function (err) {
|
|
857
|
-
console.warn('Could not save grid settings.');
|
|
858
|
-
console.warn(err);
|
|
859
|
-
});
|
|
860
|
-
};
|
|
861
|
-
SkyGridComponent.prototype.initColumns = function () {
|
|
862
|
-
var _this = this;
|
|
863
|
-
/* istanbul ignore else */
|
|
864
|
-
if (this.columnComponents.length !== 0 ||
|
|
865
|
-
this.columns !== undefined) {
|
|
866
|
-
/* istanbul ignore else */
|
|
867
|
-
/* sanity check */
|
|
868
|
-
if (this.columnComponents.length > 0) {
|
|
869
|
-
this.getColumnsFromComponent();
|
|
870
|
-
}
|
|
871
|
-
this.transformData();
|
|
872
|
-
this.setDisplayedColumns(true);
|
|
873
|
-
this.changeDetector.markForCheck();
|
|
874
|
-
}
|
|
875
|
-
// Watch for added/removed columns:
|
|
876
|
-
this.subscriptions.push(this.columnComponents.changes.subscribe(function () { return _this.updateColumns(); }));
|
|
877
|
-
// Watch for column heading changes:
|
|
878
|
-
this.columnComponents.forEach(function (comp) {
|
|
879
|
-
_this.subscriptions.push(comp.headingModelChanges
|
|
880
|
-
.subscribe(function (change) {
|
|
881
|
-
_this.updateColumnHeading(change);
|
|
882
|
-
}));
|
|
883
|
-
_this.subscriptions.push(comp.descriptionModelChanges
|
|
884
|
-
.subscribe(function (change) {
|
|
885
|
-
_this.updateColumnDescription(change);
|
|
886
|
-
}));
|
|
887
|
-
_this.subscriptions.push(comp.inlineHelpPopoverModelChanges
|
|
888
|
-
.subscribe(function (change) {
|
|
889
|
-
_this.updateInlineHelpPopover(change);
|
|
890
|
-
}));
|
|
891
|
-
});
|
|
892
|
-
};
|
|
893
|
-
SkyGridComponent.prototype.arraysEqual = function (arrayA, arrayB) {
|
|
894
|
-
return arrayA.length === arrayB.length &&
|
|
895
|
-
arrayA.every(function (value, index) {
|
|
896
|
-
return value === arrayB[index];
|
|
897
|
-
});
|
|
898
|
-
};
|
|
899
|
-
SkyGridComponent.ctorParameters = function () { return [
|
|
900
|
-
{ type: SkyAffixService },
|
|
901
|
-
{ type: ChangeDetectorRef },
|
|
902
|
-
{ type: DragulaService },
|
|
903
|
-
{ type: SkyGridAdapterService },
|
|
904
|
-
{ type: SkyOverlayService },
|
|
905
|
-
{ type: SkyAppWindowRef },
|
|
906
|
-
{ type: SkyUIConfigService }
|
|
907
|
-
]; };
|
|
908
|
-
__decorate([
|
|
909
|
-
Input()
|
|
910
|
-
], SkyGridComponent.prototype, "columns", void 0);
|
|
911
|
-
__decorate([
|
|
912
|
-
Input()
|
|
913
|
-
], SkyGridComponent.prototype, "data", void 0);
|
|
914
|
-
__decorate([
|
|
915
|
-
Input()
|
|
916
|
-
], SkyGridComponent.prototype, "enableMultiselect", void 0);
|
|
917
|
-
__decorate([
|
|
918
|
-
Input()
|
|
919
|
-
], SkyGridComponent.prototype, "fit", void 0);
|
|
920
|
-
__decorate([
|
|
921
|
-
Input()
|
|
922
|
-
], SkyGridComponent.prototype, "hasToolbar", void 0);
|
|
923
|
-
__decorate([
|
|
924
|
-
Input()
|
|
925
|
-
], SkyGridComponent.prototype, "height", void 0);
|
|
926
|
-
__decorate([
|
|
927
|
-
Input()
|
|
928
|
-
], SkyGridComponent.prototype, "highlightText", void 0);
|
|
929
|
-
__decorate([
|
|
930
|
-
Input()
|
|
931
|
-
], SkyGridComponent.prototype, "messageStream", void 0);
|
|
932
|
-
__decorate([
|
|
933
|
-
Input()
|
|
934
|
-
], SkyGridComponent.prototype, "multiselectRowId", void 0);
|
|
935
|
-
__decorate([
|
|
936
|
-
Input()
|
|
937
|
-
], SkyGridComponent.prototype, "rowHighlightedId", void 0);
|
|
938
|
-
__decorate([
|
|
939
|
-
Input()
|
|
940
|
-
], SkyGridComponent.prototype, "selectedColumnIds", null);
|
|
941
|
-
__decorate([
|
|
942
|
-
Input()
|
|
943
|
-
], SkyGridComponent.prototype, "selectedRowIds", null);
|
|
944
|
-
__decorate([
|
|
945
|
-
Input()
|
|
946
|
-
], SkyGridComponent.prototype, "settingsKey", void 0);
|
|
947
|
-
__decorate([
|
|
948
|
-
Input()
|
|
949
|
-
], SkyGridComponent.prototype, "sortField", void 0);
|
|
950
|
-
__decorate([
|
|
951
|
-
Input()
|
|
952
|
-
], SkyGridComponent.prototype, "width", void 0);
|
|
953
|
-
__decorate([
|
|
954
|
-
Output()
|
|
955
|
-
], SkyGridComponent.prototype, "columnWidthChange", void 0);
|
|
956
|
-
__decorate([
|
|
957
|
-
Output()
|
|
958
|
-
], SkyGridComponent.prototype, "multiselectSelectionChange", void 0);
|
|
959
|
-
__decorate([
|
|
960
|
-
Output()
|
|
961
|
-
], SkyGridComponent.prototype, "rowDeleteCancel", void 0);
|
|
962
|
-
__decorate([
|
|
963
|
-
Output()
|
|
964
|
-
], SkyGridComponent.prototype, "rowDeleteConfirm", void 0);
|
|
965
|
-
__decorate([
|
|
966
|
-
Output()
|
|
967
|
-
], SkyGridComponent.prototype, "selectedColumnIdsChange", void 0);
|
|
968
|
-
__decorate([
|
|
969
|
-
Output()
|
|
970
|
-
], SkyGridComponent.prototype, "sortFieldChange", void 0);
|
|
971
|
-
__decorate([
|
|
972
|
-
ContentChildren(SkyGridColumnComponent)
|
|
973
|
-
], SkyGridComponent.prototype, "columnComponents", void 0);
|
|
974
|
-
__decorate([
|
|
975
|
-
ViewChildren('gridCol')
|
|
976
|
-
], SkyGridComponent.prototype, "columnElementRefs", void 0);
|
|
977
|
-
__decorate([
|
|
978
|
-
ViewChildren('colSizeRange')
|
|
979
|
-
], SkyGridComponent.prototype, "columnRangeInputElementRefs", void 0);
|
|
980
|
-
__decorate([
|
|
981
|
-
ViewChildren('inlineDeleteRef')
|
|
982
|
-
], SkyGridComponent.prototype, "inlineDeleteRefs", void 0);
|
|
983
|
-
__decorate([
|
|
984
|
-
ViewChild('inlineDeleteTemplateRef', { read: TemplateRef })
|
|
985
|
-
], SkyGridComponent.prototype, "inlineDeleteTemplateRef", void 0);
|
|
986
|
-
__decorate([
|
|
987
|
-
ViewChild('gridContainer')
|
|
988
|
-
], SkyGridComponent.prototype, "tableContainerElementRef", void 0);
|
|
989
|
-
__decorate([
|
|
990
|
-
ViewChild('gridTable')
|
|
991
|
-
], SkyGridComponent.prototype, "tableElementRef", void 0);
|
|
992
|
-
__decorate([
|
|
993
|
-
ViewChild('topScrollContainer')
|
|
994
|
-
], SkyGridComponent.prototype, "topScrollContainerElementRef", void 0);
|
|
995
|
-
__decorate([
|
|
996
|
-
ViewChild('resizeBar')
|
|
997
|
-
], SkyGridComponent.prototype, "resizeBar", void 0);
|
|
998
|
-
__decorate([
|
|
999
|
-
HostListener('window:resize')
|
|
1000
|
-
], SkyGridComponent.prototype, "onWindowResize", null);
|
|
1001
|
-
SkyGridComponent = __decorate([
|
|
1002
|
-
Component({
|
|
1003
|
-
selector: 'sky-grid',
|
|
1004
|
-
template: "<div class=\"sky-grid\">\n <div *ngIf=\"showTopScroll\"\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n #topScrollContainer\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n #gridContainer\n >\n <table\n class=\"sky-grid-table\"\n [ngClass]=\"getTableClassNames()\"\n #gridTable>\n <thead>\n <tr dragula=\"sky-grid-heading\">\n <th *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th *ngFor=\"let column of displayedColumns; let last = last, let i = index\"\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n #gridCol\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span\n class=\"sky-grid-header-text\"\n >{{column.heading?.trim()}}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"'sky-grid-heading-sort-' + (getCaretVisibility(column.field) | async)\"\n [icon]=\"getCaretIconNames(column)\"\n >\n </sky-icon>\n <sky-help-inline *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden' : getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </sky-help-inline>\n </div>\n <span\n *ngIf=\"(fit==='width' && !last) || (fit==='scroll')\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur($event)\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n #colSizeRange />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n class=\"sky-grid-row\"\n *ngFor=\"let item of items; let i = index\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.aria-selected]=\"item.isSelected\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row' : item.isSelected,\n 'sky-grid-multiselect-row' : enableMultiselect,\n 'sky-grid-row-highlight' : isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n (change)=\"onMultiselectCheckboxChange()\"\n [(ngModel)]=\"item.isSelected\"\n >\n </sky-checkbox>\n </div>\n </td>\n <td *ngFor=\"let column of displayedColumns; let last = last; let i = index\"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"!column.excludeFromHighlighting ? highlightText : undefined\"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\">\n </sky-grid-cell>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"showResizeBar\"\n aria-hidden=\"true\"\n id=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n #resizeBar\n >\n </div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{value}}</ng-template>\n\n<ng-template\n let-item\n #inlineDeleteTemplateRef\n>\n <div\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]='{\n \"height\": getRowHeight(0),\n \"position\": \"fixed\",\n \"width\": tableWidth + \"px\"\n }'\n #inlineDeleteRef\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n ></sky-inline-delete>\n </div>\n</ng-template>\n",
|
|
1005
|
-
viewProviders: [DragulaService],
|
|
1006
|
-
providers: [
|
|
1007
|
-
SkyGridAdapterService
|
|
1008
|
-
],
|
|
1009
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1010
|
-
styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:0 solid #cdcfd2;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;-moz-user-select:none;-ms-user-select:none;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:0 0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0;background:0 0;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0;background:0 0;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0;background:0 0;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep.sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:0;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0 solid transparent;border-right:0 solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover::after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}#sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}"]
|
|
1011
|
-
})
|
|
1012
|
-
], SkyGridComponent);
|
|
1013
|
-
return SkyGridComponent;
|
|
1014
|
-
}());
|
|
1015
|
-
export { SkyGridComponent };
|
|
1016
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2t5dXgvZ3JpZHMvIiwic291cmNlcyI6WyJtb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxhQUFhLEVBQ2IsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbkIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLGNBQWMsRUFDZixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxLQUFLLEVBQ0wsU0FBUyxFQUNWLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEVBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsYUFBYSxFQUVkLE1BQU0sNEJBQTRCLENBQUM7QUFzQnBDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbkIsTUFBTSwyQkFBMkIsQ0FBQztBQXNCbkMsT0FBTyxFQUNMLHlCQUF5QixFQUMxQixNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdkIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxF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SUFFaEQ7UUFEQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7cUVBQ1Y7SUFFbEQ7UUFEQyxTQUFTLENBQUMsZUFBZSxDQUFDO3NFQUNrQjtJQUU3QztRQURDLFNBQVMsQ0FBQyxXQUFXLENBQUM7NkRBQ2E7SUFFcEM7UUFEQyxTQUFTLENBQUMsb0JBQW9CLENBQUM7MEVBQ2lCO0lBRWpEO1FBREMsU0FBUyxDQUFDLFdBQVcsQ0FBQzt1REFDTztJQTJIOUI7UUFEQyxZQUFZLENBQUMsZUFBZSxDQUFDOzBEQUc3QjtJQXhXVSxnQkFBZ0I7UUFWNUIsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsMHhPQUFvQztZQUVwQyxhQUFhLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDL0IsU0FBUyxFQUFFO2dCQUNULHFCQUFxQjthQUN0QjtZQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztTQUNoRCxDQUFDO09BQ1csZ0JBQWdCLENBdXBDNUI7SUFBRCx1QkFBQztDQUFBLEFBdnBDRCxJQXVwQ0M7U0F2cENZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29udGVudENoaWxkcmVuLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgU2t5QWZmaXhBdXRvRml0Q29udGV4dCxcbiAgU2t5QWZmaXhTZXJ2aWNlLFxuICBTa3lBcHBXaW5kb3dSZWYsXG4gIFNreU92ZXJsYXlTZXJ2aWNlLFxuICBTa3lVSUNvbmZpZ1NlcnZpY2Vcbn0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQge1xuICBEcmFndWxhU2VydmljZVxufSBmcm9tICduZzItZHJhZ3VsYSc7XG5cbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBtZXJnZSxcbiAgZnJvbUV2ZW50XG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRha2VXaGlsZVxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIExpc3RJdGVtTW9kZWwsXG4gIExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcblxuaW1wb3J0IHtcbiAgU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2Vcbn0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1kZXNjcmlwdGlvbi1tb2RlbC1jaGFuZ2UnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlXG59IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taGVhZGluZy1tb2RlbC1jaGFuZ2UnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZVxufSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWlubGluZS1oZWxwLXBvcG92ZXItbW9kZWwtY2hhbmdlJztcblxuaW1wb3J0IHtcbiAgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2Vcbn0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi13aWR0aC1tb2RlbC1jaGFuZ2UnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkTWVzc2FnZVxufSBmcm9tICcuL3R5cGVzL2dyaWQtbWVzc2FnZSc7XG5cbmltcG9ydCB7XG4gIFNreUdyaWRNZXNzYWdlVHlwZVxufSBmcm9tICcuL3R5cGVzL2dyaWQtbWVzc2FnZS10eXBlJztcblxuaW1wb3J0IHtcbiAgU2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3Ncbn0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY2FuY2VsLWFyZ3MnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkUm93RGVsZXRlQ29uZmlnXG59IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpZyc7XG5cbmltcG9ydCB7XG4gIFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJnc1xufSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb25maXJtLWFyZ3MnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkUm93RGVsZXRlQ29udGVudHNcbn0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29udGVudHMnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2Vcbn0gZnJvbSAnLi90eXBlcy9ncmlkLXNlbGVjdGVkLXJvd3MtbW9kZWwtY2hhbmdlJztcblxuaW1wb3J0IHtcbiAgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZVxufSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1zb3VyY2UnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkQ29sdW1uQ29tcG9uZW50XG59IGZyb20gJy4vZ3JpZC1jb2x1bW4uY29tcG9uZW50JztcblxuaW1wb3J0IHtcbiAgU2t5R3JpZENvbHVtbk1vZGVsXG59IGZyb20gJy4vZ3JpZC1jb2x1bW4ubW9kZWwnO1xuXG5pbXBvcnQge1xuICBTa3lHcmlkQWRhcHRlclNlcnZpY2Vcbn0gZnJvbSAnLi9ncmlkLWFkYXB0ZXIuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFNreUdyaWRVSUNvbmZpZ1xufSBmcm9tICcuL3R5cGVzL2dyaWQtdWktY29uZmlnJztcblxuaW1wb3J0ICcuLi8uLi9wb2x5ZmlsbHMnO1xuXG5sZXQgbmV4dElkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW0RyYWd1bGFTZXJ2aWNlXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2t5R3JpZEFkYXB0ZXJTZXJ2aWNlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFNreUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbHVtbnMgYW5kIGNvbHVtbiBwcm9wZXJ0aWVzIGZvciB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRhdGEgZm9yIHRoZSBncmlkLiBFYWNoIGl0ZW0gcmVxdWlyZXMgYW4gYGlkYCBhbmQgYSBwcm9wZXJ0eSB0aGF0IG1hcHNcbiAgICogdG8gdGhlIGBmaWVsZGAgb3IgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoIGNvbHVtbiBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkYXRhOiBBcnJheTxhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgdGhlIG11bHRpc2VsZWN0IGZlYXR1cmUgdG8gZGlzcGxheSBhIGNvbHVtbiBvZlxuICAgKiBjaGVja2JveGVzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdyaWQuIFlvdSBjYW4gc3BlY2lmeSBhIHVuaXF1ZSBJRCB3aXRoXG4gICAqIHRoZSBgbXVsdGlzZWxlY3RSb3dJZGAgcHJvcGVydHksIGJ1dCBtdWx0aXNlbGVjdCBkZWZhdWx0cyB0byB0aGUgYGlkYCBwcm9wZXJ0eSBvblxuICAgKiB0aGUgYGRhdGFgIG9iamVjdC4gVG8gaW5jbHVkZSBvcHRpb25zIHRvIHNlbGVjdCBhbmQgY2xlYXIgYWxsIG11bHRpc2VsZWN0IGNoZWNrYm94ZXMsXG4gICAqIHdlIHJlY29tbWVuZCB0aGUgW2xpc3QgdmlldyBncmlkXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvbGlzdC9ncmlkKSBjb21wb25lbnQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlTXVsdGlzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyB0aGUgZ3JpZCBmaXRzIHRvIGl0cyBwYXJlbnQuIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBgd2lkdGhgLFxuICAgKiB3aGljaCBmaXRzIHRoZSBncmlkIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLCBhbmQgYHNjcm9sbGAsIHdoaWNoIGFsbG93cyB0aGUgZ3JpZFxuICAgKiB0byBleGNlZWQgdGhlIHBhcmVudCdzIHdpZHRoLiBJZiB0aGUgZ3JpZCBkb2VzIG5vdCBoYXZlIGVub3VnaCBjb2x1bW5zIHRvIGZpbGxcbiAgICogdGhlIHBhcmVudCdzIHdpZHRoLCBpdCBhbHdheXMgc3RyZXRjaGVzIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpdDogc3RyaW5nID0gJ3dpZHRoJztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2l0aCB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgaGVpZ2h0IG9mIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGV4dCB0byBoaWdobGlnaHQgd2l0aGluIHRoZSBncmlkLlxuICAgKiBUeXBpY2FsbHksIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHNlYXJjaC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaWdobGlnaHRUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIG9ic2VydmFibGUgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5R3JpZE1lc3NhZ2U+KCk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHVuaXF1ZSBJRCB0aGF0IG1hdGNoZXMgYSBwcm9wZXJ0eSBvbiB0aGUgYGRhdGFgIG9iamVjdC5cbiAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSB1c2VzIHRoZSBgaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG11bHRpc2VsZWN0Um93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiB0aGUgcm93IHRvIGhpZ2hsaWdodC4gVGhlIElEIG1hdGNoZXMgdGhlIGBpZGAgcHJvcGVydHlcbiAgICogb2YgdGhlIGBkYXRhYCBvYmplY3QuIFR5cGljYWxseSwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICogdGhlIGZseW91dCBjb21wb25lbnQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcm93SGlnaGxpZ2h0ZWRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGNvbHVtbnMgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZCBiYXNlZCBvbiB0aGUgYGlkYCBvciBgZmllbGRgIHByb3BlcnRpZXNcbiAgICogb2YgdGhlIGNvbHVtbnMuIElmIG5vIGNvbHVtbnMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgZ3JpZCBkaXNwbGF5cyBhbGwgY29sdW1ucy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRDb2x1bW5JZHModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcblxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbklkcyA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIGlkcyBoYXZlIGNoYW5nZWQuXG4gICAgaWYgKFxuICAgICAgIWN1cnJlbnRJZHMgfHxcbiAgICAgICF2YWx1ZSB8fFxuICAgICAgIXRoaXMuYXJyYXlzRXF1YWwodmFsdWUsIGN1cnJlbnRJZHMpXG4gICAgKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGVuc3VyZXMgdGhhdCB3ZSBkbyBub3Qgc2V0IHVzZXIgY29uZmlnIG9wdGlvbnMgb3IgZmlyZSB0aGUgY2hhbmdlIGV2ZW50XG4gICAgICAvLyBvbiB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZSBjb2x1bW5zIGFyZSBzZXQgdXBcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzU2V0KSB7XG4gICAgICAgIHRoaXMuc2V0VXNlckNvbmZpZyh7XG4gICAgICAgICAgc2VsZWN0ZWRDb2x1bW5JZHM6IHZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZENvbHVtbklkcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXNpemVkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFRhYmxlV2lkdGgoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvbHVtbklkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDb2x1bW5JZHM7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgc2V0IG9mIElEcyBmb3IgdGhlIHJvd3MgdG8gc2VsZWN0IGluIGEgbXVsdGlzZWxlY3QgZ3JpZC5cbiAgICogVGhlIElEcyBtYXRjaCB0aGUgYGlkYCBwcm9wZXJ0aWVzIG9mIHRoZSBgZGF0YWAgb2JqZWN0cy5cbiAgICogUm93cyB3aXRoIElEcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlIGRlLXNlbGVjdGVkIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZFJvd0lkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlNlbGVjdGVkUm93SWRzQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93SWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJvd0lkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSB1bmlxdWUga2V5IGZvciB0aGUgVUkgQ29uZmlnIFNlcnZpY2UgdG8gcmV0cmlldmUgc3RvcmVkIHNldHRpbmdzIGZyb20gYSBkYXRhYmFzZS5cbiAgICogVGhlIFVJIENvbmZpZyBTZXJ2aWNlIHNhdmVzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHVzZXJzIGFuZCByZXR1cm5zXG4gICAqIGBzZWxlY3RlZENvbHVtbklkc2AgdG8gcHJlc2VydmUgdGhlIGNvbHVtbnMgdG8gZGlzcGxheSBhbmQgdGhlIHByZWZlcnJlZCBjb2x1bW4gb3JkZXIuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBVSSBDb25maWcgU2VydmljZSwgc2VlXG4gICAqIFt0aGUgc3RpY2t5IHNldHRpbmdzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vZ2V0LXN0YXJ0ZWQvYWR2YW5jZWQvc3RpY2t5LXNldHRpbmdzKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXR0aW5nc0tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIGNhcmV0IGluIHRoZSBjb2x1bW4gdGhhdCB3YXMgdXNlZCB0byBzb3J0IHRoZSBncmlkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWxcbiAgICogd2hlbiB5b3UgcHJvZ3JhbW1hdGljYWxseSBzb3J0IGRhdGEgYW5kIHdhbnQgdG8gdmlzdWFsbHkgaW5kaWNhdGUgaG93IHRoZSBncmlkIHdhcyBzb3J0ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBhIGBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbGAgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqIC0gYGZpZWxkU2VsZWN0b3JgIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc29ydCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBzdHJpbmdgIHZhbHVlcy5cbiAgICogLSBgZGVzY2VuZGluZ2AgSW5kaWNhdGVzIHdoZXRoZXIgdG8gc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLiBUaGUgY2FyZXQgdGhhdCB2aXN1YWxseVxuICAgKiBpbmRpY2F0ZXMgdGhlIHNvcnQgb3JkZXIgcG9pbnRzIGRvd24gZm9yIGRlc2NlbmRpbmcgb3JkZXIgYW5kIHVwIGZvciBhc2NlbmRpbmcgb3JkZXIuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBgYm9vbGVhbmAgdmFsdWVzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkOiBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZCBpbiBwaXhlbHMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgd2lkdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgd2lkdGggb2YgYSBjb2x1bW4gY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY29sdW1uV2lkdGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFNreUdyaWRDb2x1bW5XaWR0aE1vZGVsQ2hhbmdlPj4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgc2VsZWN0aW9uIG9mIG11bHRpc2VsZWN0IGNoZWNrYm94ZXMgY2hhbmdlcy5cbiAgICogRW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgc2VsZWN0ZWQgcm93cyBiYXNlZCBvbiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5XG4gICAqIHRoYXQgdGhlIGNvbnN1bWVyIHByb3ZpZGVzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcm93RGVsZXRlQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkUm93RGVsZXRlQ2FuY2VsQXJncz4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGNoYW5nZSBvciB3aGVuIHRoZSBvcmRlciBvZiB0aGUgY29sdW1ucyBjaGFuZ2VzLlxuICAgKiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdCByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYWN0aXZlIHNvcnQgZmllbGQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oKTtcblxuICBwdWJsaWMgY29sdW1uUmVzaXplU3RlcCA9IDEwO1xuICBwdWJsaWMgY3VycmVudFNvcnRGaWVsZDogQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPjtcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnM6IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD47XG4gIHB1YmxpYyBncmlkSWQ6IG51bWJlciA9ICsrbmV4dElkO1xuICBwdWJsaWMgcm93RGVsZXRlQ29uZmlnczogU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZ1tdID0gW107XG4gIHB1YmxpYyBpdGVtczogQXJyYXk8YW55PjtcbiAgcHVibGljIG1heENvbFdpZHRoID0gOTk5OTsgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLCBhcyB0aGUgaW5wdXQgcmFuZ2UgcGlja2VyIHdvbid0IHdvcmsgd2l0aG91dCBhIHZhbHVlLlxuICBwdWJsaWMgbWluQ29sV2lkdGggPSA1MDtcbiAgcHVibGljIHNob3dSZXNpemVCYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dUb3BTY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IHRhYmxlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreUdyaWRDb2x1bW5Db21wb25lbnQpXG4gIHByaXZhdGUgY29sdW1uQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUdyaWRDb2x1bW5Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRDb2wnKVxuICBwcml2YXRlIGNvbHVtbkVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2NvbFNpemVSYW5nZScpXG4gIHByaXZhdGUgY29sdW1uUmFuZ2VJbnB1dEVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2lubGluZURlbGV0ZVJlZicpXG4gIHByaXZhdGUgaW5saW5lRGVsZXRlUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZicsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnZ3JpZENvbnRhaW5lcicpXG4gIHByaXZhdGUgdGFibGVDb250YWluZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdncmlkVGFibGUnKVxuICBwcml2YXRlIHRhYmxlRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndG9wU2Nyb2xsQ29udGFpbmVyJylcbiAgcHJpdmF0ZSB0b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyZXNpemVCYXInKVxuICBwcml2YXRlIHJlc2l6ZUJhcjogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4OiBzdHJpbmc7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzUmVzaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJvd0RlbGV0ZUNvbnRlbnRzOiB7IFtpZDogc3RyaW5nXTogU2t5R3JpZFJvd0RlbGV0ZUNvbnRlbnRzIH0gPSB7fTtcbiAgcHJpdmF0ZSBzdGFydENvbHVtbldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBzY3JvbGxUcmlnZ2VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbHVtbklkc1NldDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHhQb3NTdGFydDogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uSWRzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIF9zZWxlY3RlZFJvd0lkczogQXJyYXk8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZHJhZ3VsYVNlcnZpY2U6IERyYWd1bGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JpZEFkYXB0ZXI6IFNreUdyaWRBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBwcml2YXRlIHNreVdpbmRvdzogU2t5QXBwV2luZG93UmVmLFxuICAgIHByaXZhdGUgdWlDb25maWdTZXJ2aWNlOiBTa3lVSUNvbmZpZ1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gbmV3IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD4oKTtcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPih7XG4gICAgICBmaWVsZFNlbGVjdG9yOiAnJyxcbiAgICAgIGRlc2NlbmRpbmc6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tZXNzYWdlU3RyZWFtXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy5zZXR0aW5nc0tleSkge1xuICAgICAgdGhpcy5hcHBseVVzZXJDb25maWcoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdENvbHVtbnMoKTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBjb2x1bW4gZHJhZy1hbmQtZHJvcC5cbiAgICB0aGlzLmdyaWRBZGFwdGVyLmluaXRpYWxpemVEcmFnQW5kRHJvcChcbiAgICAgIHRoaXMuZHJhZ3VsYVNlcnZpY2UsXG4gICAgICAoc2VsZWN0ZWRDb2x1bW5JZHM6IEFycmF5PHN0cmluZz4pID0+IHtcbiAgICAgICAgdGhpcy5vbkhlYWRlckRyb3Aoc2VsZWN0ZWRDb2x1bW5JZHMpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gdGhpcy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoY29sdW1uSWQgPT4gdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5kYXRhICYmIHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG5cbiAgICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgZGF0YSBoYXMgcmVuZGVyZWQgaW4gdGhlIGdyaWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBUaGlzIGNsZWFucyB1cCBhbnkgbGluZ2VyaW5nIHJvdyBkZWxldGVzIGZvciBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLlxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzKS5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcm93cyByZS1yZW5kZXIgdGh1cyBtZXNzaW5nIHVwIHRoZSBhZmZpeGVycy4gV2UgbXVzdCByZWFmZml4IHRoZW0gc28gdGhhdCB0aGluZ3NcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHJlbmRlciBjb3JyZWN0bHkuXG4gICAgICAgICAgICBsZXQgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tza3ktY21wLWlkPVwiJyArIGlkICsgJ1wiXScpO1xuXG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXS5hZmZpeGVyLmFmZml4VG8ocm93RWxlbWVudCwge1xuICAgICAgICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlbWVudDogJ2Fib3ZlJyxcbiAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnQ6ICd0b3AnLFxuICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgIGVuYWJsZUF1dG9GaXQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5zb3J0RmllbGQpIHtcbiAgICAgIHRoaXMuc2V0U29ydEhlYWRlcnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5yb3dEZWxldGVDb250ZW50cykuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShpZCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9wU2Nyb2xsV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWJsZUNsYXNzTmFtZXMoKSB7XG4gICAgbGV0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5maXQgIT09ICdzY3JvbGwnKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3NreS1ncmlkLWZpdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc1Rvb2xiYXIpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtaGFzLXRvb2xiYXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWV0ZXIoY2xhc3NOYW1lcywgJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWJsZUhlYWRlckNsYXNzTmFtZXMoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBsZXQgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY2tlZCkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1oZWFkZXItbG9ja2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1ldGVyKGNsYXNzTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FyZXRJY29uTmFtZXMoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBsZXQgaWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKGNvbHVtbi5maWVsZCkuc3Vic2NyaWJlKChzb3J0RGlyKSA9PiB7XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2FzYycpIHtcbiAgICAgICAgaWNvbk5hbWVzLnB1c2goJ2NhcmV0LXVwJyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIGljb25OYW1lcy5wdXNoKCdjYXJldC1kb3duJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWV0ZXIoaWNvbk5hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoa2V5ID09PSAnZW50ZXInIHx8IGtleSA9PT0gJyAnKSB7XG4gICAgICB0aGlzLnNvcnRCeUNvbHVtbihjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzb3J0QnlDb2x1bW4oY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSAmJiBjb2x1bW4uaXNTb3J0YWJsZSkge1xuICAgICAgdGhpcy5jdXJyZW50U29ydEZpZWxkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgbWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcjogY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICBkZXNjZW5kaW5nOiB0cnVlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkICYmIGZpZWxkLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcjogY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgIGRlc2NlbmRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvcnRGaWVsZENoYW5nZS5lbWl0KHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZC5uZXh0KHNlbGVjdG9yKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvbihjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgbWFwKGZpZWxkID0+IHtcbiAgICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uRmllbGQgP1xuICAgICAgICAgICAgKGZpZWxkLmRlc2NlbmRpbmcgPyAnZGVzYycgOiAnYXNjJykgOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFyaWFTb3J0RGlyZWN0aW9uKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgbWFwKGZpZWxkID0+IHtcbiAgICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkID9cbiAgICAgICAgICAgIChmaWVsZC5kZXNjZW5kaW5nID8gJ2Rlc2NlbmRpbmcnIDogJ2FzY2VuZGluZycpIDogKGNvbHVtbi5pc1NvcnRhYmxlID8gJ25vbmUnIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3J0RmllbGRcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBtYXAoZmllbGQgPT4ge1xuICAgICAgICAgIHJldHVybiBmaWVsZC5maWVsZFNlbGVjdG9yID09PSBjb2x1bW5GaWVsZCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHZpc2liaWxpdHk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSAnaGlkZGVuJztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKCkge1xuICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLkNoZWNrYm94Q2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW5IZWFkaW5nKGNoYW5nZTogU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkIHx8XG4gICAgICAgIGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5oZWFkaW5nID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkIHx8XG4gICAgICAgIGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5pbmxpbmVIZWxwUG9wb3ZlciA9IGNoYW5nZS52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbkRlc2NyaXB0aW9uKGNoYW5nZTogU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UpIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCB8fFxuICAgICAgICBjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuZGVzY3JpcHRpb24gPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiByZXNpemVkLCBpbml0aWFsaXplIGFsbCB0aGUgcmVzaXplIHdpZHRocy5cbiAgICBpZiAoIXRoaXMuaXNSZXNpemVkKSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5XaWR0aHMoKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQpO1xuXG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gdHJ1ZTtcbiAgICB0aGlzLnhQb3NTdGFydCA9IGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG5cbiAgICAvLyBTaG93IHZpc3VhbCBpbmRpY2F0b3Igb2Ygd2hlcmUgbW91c2UgaXMgZHJhZ2dpbmcgKHJlc2l6ZUJhcikuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihldmVudC5wYWdlWCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbW91c2VNb3ZlRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICBjb25zdCB0b3VjaE1vdmVFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNobW92ZScpO1xuXG4gICAgbWVyZ2UobW91c2VNb3ZlRXZlbnQsIHRvdWNoTW92ZUV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG1vdmVFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVNb3ZlKG1vdmVFdmVudCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IG1vdXNlVXBFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcbiAgICBjb25zdCB0b3VjaEVuZEV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKTtcblxuICAgIG1lcmdlKG1vdXNlVXBFdmVudCwgdG91Y2hFbmRFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGU7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlbmRFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVSZWxlYXNlKGVuZEV2ZW50KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93blJlc2l6ZUNvbChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcmVzaXplZCwgaW5pdGlhbGl6ZSBhbGwgdGhlIHJlc2l6ZSB3aWR0aHMuXG4gICAgaWYgKCF0aGlzLmlzUmVzaXplZCkge1xuICAgICAgdGhpcy5pbml0Q29sdW1uV2lkdGhzKCk7XG4gICAgICB0aGlzLmlzUmVzaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlUmVzaXplQ29sKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IG5ld1ZhbHVlID0gTnVtYmVyKGlucHV0LnZhbHVlKTtcbiAgICBsZXQgZGVsdGFYID0gbmV3VmFsdWUgLSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGg7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5CeUluZGV4KHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXgsIG5ld1ZhbHVlLCBkZWx0YVgpO1xuICAgIGNvbnN0IGxlZnQgPSBpbnB1dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24obGVmdCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgbGV0IGRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy54UG9zU3RhcnQ7XG4gICAgbGV0IG5ld0NvbFdpZHRoID0gdGhpcy5zdGFydENvbHVtbldpZHRoICsgZGVsdGFYO1xuXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBtYXggPSB0aGlzLmdldE1heFJhbmdlQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4KTtcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcgJiYgbmV3Q29sV2lkdGggPiBtYXgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24oZXZlbnQucGFnZVgpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlQmx1cihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZUZvY3VzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBsZWZ0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihsZWZ0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZVJlbGVhc2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgICBsZXQgZGVsdGFYID0gZXZlbnQucGFnZVggLSB0aGlzLnhQb3NTdGFydDtcbiAgICBsZXQgbmV3Q29sV2lkdGggPSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggKyBkZWx0YVg7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5CeUluZGV4KHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXgsIG5ld0NvbFdpZHRoLCBkZWx0YVgpO1xuICAgIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXggPSB1bmRlZmluZWQ7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uUm93Q2xpY2soZXZlbnQ6IGFueSwgc2VsZWN0ZWRJdGVtOiBMaXN0SXRlbU1vZGVsKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5lbmFibGVNdWx0aXNlbGVjdCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fCAhdGhpcy5pc0ludGVyYWN0aXZlRWxlbWVudChldmVudCkpIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLmlzU2VsZWN0ZWQgPSAhc2VsZWN0ZWRJdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlJvd0NsaWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNSb3dIaWdobGlnaHRlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucm93SGlnaGxpZ2h0ZWRJZCkge1xuICAgICAgcmV0dXJuIGlkID09PSB0aGlzLnJvd0hpZ2hsaWdodGVkSWQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dIZWlnaHQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEFkYXB0ZXIuZ2V0Um93SGVpZ2h0KHRoaXMudGFibGVFbGVtZW50UmVmLCBpbmRleCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MgPSB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmlsdGVyKGNvbmZpZyA9PiBjb25maWcuaWQgIT09IGlkKTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNhbmNlbC5lbWl0KHsgaWQ6IGlkIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmluZChjb25maWcgPT4gY29uZmlnLmlkID09PSBpZCkucGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maXJtLmVtaXQoeyBpZDogaWQgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGVsZXRlSXRlbShpZDogc3RyaW5nKTogU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMucm93RGVsZXRlQ29uZmlncy5maW5kKHJvd0RlbGV0ZSA9PiByb3dEZWxldGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgdG91Y2ggZGV2aWNlcyBmcm9tIGluYWR2ZXJ0ZW50bHkgc2Nyb2xsaW5nIGdyaWQgd2hpbGUgZHJhZ2dpbmcgY29sdW1ucy5cbiAgcHVibGljIG9uVG91Y2hNb3ZlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHVibGljIG9uVG9wU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVHJpZ2dlcmVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICAgICAgdGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25HcmlkU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWYpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRyaWdnZXJlZCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUb3BTY3JvbGwgJiYgdGhpcy5jb2x1bW5FbGVtZW50UmVmcyAmJiB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBjb2x1bW5zV2lkdGhUb3RhbCA9IDA7XG4gICAgICBjb25zdCB3aW5kb3dTaXplID0gdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dUb3BTY3JvbGwpIHtcbiAgICAgICAgICBsZXQgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUoY29sLm5hdGl2ZUVsZW1lbnQpLndpZHRoKTtcbiAgICAgICAgICBsZXQgb2Zmc2V0V2lkdGggPSBjb2wubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICBsZXQgd2lkdGggPSBNYXRoLm1heChjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLCB0aGlzLm1pbkNvbFdpZHRoKTtcbiAgICAgICAgICBjb2x1bW5zV2lkdGhUb3RhbCA9IGNvbHVtbnNXaWR0aFRvdGFsICsgd2lkdGg7XG4gICAgICAgICAgaWYgKGNvbHVtbnNXaWR0aFRvdGFsID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VG9wU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpc2VsZWN0U2VsZWN0QWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5TZWxlY3RBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdENsZWFyQWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2xlYXJBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSB7XG4gICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0ICovXG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlNlbGVjdEFsbDpcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdEFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQ2xlYXJBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDbGVhckFsbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlByb21wdERlbGV0ZVJvdzpcbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdykge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gdGhpcy5yb3dEZWxldGVDb25maWdzXG4gICAgICAgICAgICAuZmluZChjb25maWcgPT4gY29uZmlnLmlkID09PSBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdDb25maWcpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nQ29uZmlnLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVDb25maWdzLnB1c2goeyBpZDogbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZCwgcGVuZGluZzogZmFsc2UgfSk7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgICAgICAgZW5hYmxlU2Nyb2xsOiB0cnVlLFxuICAgICAgICAgICAgICBzaG93QmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICAgICAgICBlbmFibGVQb2ludGVyRXZlbnRzOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgb3ZlcmxheS5hdHRhY2hUZW1wbGF0ZSh0aGlzLmlubGluZURlbGV0ZVRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICB7ICRpbXBsaWNpdDogdGhpcy5kYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkKSB9KTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXZSBhcmUgbWFudWFsbHkgc2V0dGluZyB0aGUgei1pbmRleCBoZXJlIGJlY2F1c2Ugb3ZlcmxheXMgd2lsbCBhbHdheXMgYmUgb24gdG9wIG9mXG4gICAgICAgICAgICAgKiB0aGUgb21uaWJhci4gVGhpcyBtYW51YWwgc2V0dGluZyBpcyAxIGxlc3MgdGhhbiB0aGUgb21uaWJhcidzIHotaW5kZXggb2YgMTAwMC4gV2VcbiAgICAgICAgICAgICAqIGRpc2N1c3NlZCBjaGFuZ2luZyB0aGUgb3ZlcmxheSBzZXJ2aWNlIHRvIGFsbG93IGZvciB0aGlzIGJ1dCBkZWNpZGVkIGFnYWluc3QgdGhhdFxuICAgICAgICAgICAgICogY2hhbmdlIGF0IHRoaXMgdGltZSBkdWUgdG8gaXRzIG5pY2hlIG5hdHVyZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gJzk5OSc7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmxpbmVEZWxldGVSZWYgPSB0aGlzLmlubGluZURlbGV0ZVJlZnMudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoZWxSZWYgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsUmVmLm5hdGl2ZUVsZW1lbnQuaWQgPT09ICdyb3ctZGVsZXRlLXJlZi0nICsgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbGV0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKGlubGluZURlbGV0ZVJlZik7XG5cbiAgICAgICAgICAgICAgbGV0IHJvd0VsZW1lbnQ6IEhUTUxFbGVtZW50ID1cbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tza3ktY21wLWlkPVwiJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQgKyAnXCJdJyk7XG5cbiAgICAgICAgICAgICAgYWZmaXhlci5hZmZpeFRvKHJvd0VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6ICdhYm92ZScsXG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnQ6ICd0b3AnLFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdsZWZ0JyxcbiAgICAgICAgICAgICAgICBlbmFibGVBdXRvRml0OiBmYWxzZVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW21lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRdID0ge1xuICAgICAgICAgICAgICAgIGFmZml4ZXI6IGFmZml4ZXIsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5pZCAhPT0gbWVzc2FnZS5kYXRhLmFib3J0RGVsZXRlUm93LmlkKTtcblxuICAgICAgICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3cuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhlYWRlckRyb3AobmV3Q29sdW1uSWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgLy8gdXBkYXRlIHNlbGVjdGVkIGNvbHVtbklkc1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSBuZXdDb2x1bW5JZHM7XG5cbiAgICAvLyBtYXJrIGZvciBjaGVjayBiZWNhdXNlIHdlIGFyZSB1c2luZyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5vblB1c2hcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREaXNwbGF5ZWRDb2x1bW5zKHJlc3BlY3RIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHNldHVwIGRpc3BsYXllZCBjb2x1bW5zXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICBjb2x1bW5JZCA9PiB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZClcbiAgICAgICkubWFwKFxuICAgICAgICBjb2x1bW5JZCA9PiB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaWQgPT09IGNvbHVtbklkKVswXVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHJlc3BlY3RIaWRkZW4pIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IHtcbiAgICAgICAgcmV0dXJuICFjb2x1bW4uaGlkZGVuO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgLy8gVHJhbnNmb3JtIGRhdGEgaW50byBvYmplY3Qgd2l0aCBpZCBhbmQgZGF0YSBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRhdGFbMF0uaWQgJiYgIXRoaXMuZGF0YVswXS5kYXRhKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdFJvd0lkKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmdldEdyaWREYXRhV2l0aFNlbGVjdGVkUm93cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YS5tYXAoaXRlbSA9PiBuZXcgTGlzdEl0ZW1Nb2RlbChpdGVtLmlkLCBpdGVtKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YVdpdGhTZWxlY3RlZFJvd3MoKSB7XG4gICAgbGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tYXAoaXRlbSA9PiB7XG4gICAgICBsZXQgY2hlY2tlZDtcbiAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KHRoaXMubXVsdGlzZWxlY3RSb3dJZCkpIHtcbiAgICAgICAgY2hlY2tlZCA9IHNlbGVjdGVkUm93cy5pbmRleE9mKGl0ZW1bdGhpcy5tdWx0aXNlbGVjdFJvd0lkXSkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrZWQgPSBzZWxlY3RlZFJvd3MuaW5kZXhPZihpdGVtLmlkKSA+IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlbU1vZGVsKGl0ZW0uaWQsIGl0ZW0sIGNoZWNrZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaV0uaXNTZWxlY3RlZCA9ICh0aGlzLnNlbGVjdGVkUm93SWRzLmluZGV4T2YodGhpcy5pdGVtc1tpXS5pZCkgPiAtMSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U29ydEhlYWRlcnMoKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkLm5leHQodGhpcy5zb3J0RmllbGQgfHwgeyBmaWVsZFNlbGVjdG9yOiAnJywgZGVzY2VuZGluZzogZmFsc2UgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbnNGcm9tQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoY29sdW1uQ29tcG9uZW50ID0+IHtcbiAgICAgIHJldHVybiBuZXcgU2t5R3JpZENvbHVtbk1vZGVsKGNvbHVtbkNvbXBvbmVudC50ZW1wbGF0ZSwgY29sdW1uQ29tcG9uZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1ucygpIHtcbiAgICB0aGlzLmdldENvbHVtbnNGcm9tQ29tcG9uZW50KCk7XG4gICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBUaGlzIHNldCB0aW1lb3V0IGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlIGNvbHVtbnMgaGF2ZSByZW5kZXJlZCBpbiB0aGUgZ3JpZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplQ29sdW1uQnlJbmRleChjb2x1bW5JbmRleDogc3RyaW5nLCBuZXdDb2xXaWR0aDogbnVtYmVyLCBkZWx0YVg6IG51bWJlcikge1xuICAgIGxldCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk1vZGVsQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBQcmV2ZW50IGFjY2lkZW50YWwgc2hyaW5rYWdlIGJlbG93IG1pbmltdW0gd2lkdGguXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGRlbHRhWCA9IGRlbHRhWCArIHRoaXMubWluQ29sV2lkdGggLSBuZXdDb2xXaWR0aDtcbiAgICAgIG5ld0NvbFdpZHRoID0gdGhpcy5taW5Db2xXaWR0aDtcbiAgICB9XG5cbiAgICAvLyBmaXQ9d2lkdGggYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIGxhc3QgY29sdW1uXG4gICAgLy8gZml0PXNjcm9sbCBhZGRzL3JlbW92ZXMgd2lkdGggZnJvbSB0aGUgdGFibGVcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcpIHtcbiAgICAgIGxldCBsYXN0Q29sdW1uID0gdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCk7XG5cbiAgICAgIC8vIFByZXZlbnQgYWNjaWRlbnRhbCBncm93dGggdGhhdCB3b3VsZCBidW1wIGxhc3QgY29sdW1uIG9mZiBzY3JlZW4uXG4gICAgICBsZXQgbWF4ID0gdGhpcy5nZXRNYXhSYW5nZUJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgICAgaWYgKG5ld0NvbFdpZHRoID4gbWF4KSB7XG4gICAgICAgIG5ld0NvbFdpZHRoID0gbWF4O1xuICAgICAgICBkZWx0YVggPSBtYXggLSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGg7XG4gICAgICB9XG4gICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2xXaWR0aDtcbiAgICAgIGxhc3RDb2x1bW4ud2lkdGggPSBsYXN0Q29sdW1uLndpZHRoIC0gZGVsdGFYO1xuICAgICAgdGhpcy51cGRhdGVNYXhSYW5nZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdyaWRBZGFwdGVyLnNldFN0eWxlKHRoaXMudGFibGVFbGVtZW50UmVmLCAnd2lkdGgnLCBgJHt0aGlzLnRhYmxlV2lkdGggKyBkZWx0YVh9cHhgKTtcbiAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbFdpZHRoO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuY29sdW1uV2lkdGhDaGFuZ2UuZW1pdCh0aGlzLmdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5XaWR0aHMoKSB7XG4gICAgLy8gRXN0YWJsaXNoIHRhYmxlIHdpZHRoLlxuICAgIHRoaXMuc2hvd1RvcFNjcm9sbCA9IHRydWU7XG5cbiAgICAvLyBTZXQgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgd2lkdGggaW5pdGlhbGx5IGdpdmVuIGJ5IHRoZSBicm93c2VyLlxuICAgIC8vIGNvbXB1dGVkV2lkdGggcHJldmVudHMgYWNjaWRlbnRhbCBvdmVyZmxvdyBmb3IgYnJvd3NlcnMgd2l0aCBzdWItcGl4ZWwgd2lkdGhzLlxuICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IGNvbXB1dGVkV2lkdGggPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbC5uYXRpdmVFbGVtZW50KS53aWR0aCk7XG4gICAgICBsZXQgb2Zmc2V0V2lkdGggPSBjb2wubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIGxldCB3aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICBjb21wdXRlZFdpZHRoIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLm1pbkNvbFdpZHRoXG4gICAgICApO1xuICAgICAgdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoaW5kZXgpLndpZHRoID0gd2lkdGg7XG4gICAgfSk7XG5cbiAgICAvLyAnc2Nyb2xsJyB0YWJsZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwYW5kIG91dHNpZGUgb2YgdGhlaXIgY29uc3RyYWludHMuXG4gICAgaWYgKHRoaXMuZml0ID09PSAnc2Nyb2xsJykge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ21pbi13aWR0aCcsICdhdXRvJyk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1heCBsaW1pdHMgZm9yIGlucHV0IHJhbmdlcy5cbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcpIHtcbiAgICAgIHRoaXMudXBkYXRlTWF4UmFuZ2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uV2lkdGhNb2RlbENoYW5nZSgpIHtcbiAgICBsZXQgY29sdW1uV2lkdGhNb2RlbENoYW5nZSA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT4oKTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgY29sdW1uV2lkdGhNb2RlbENoYW5nZS5wdXNoKHtcbiAgICAgICAgaWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgZmllbGQ6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgd2lkdGg6IGNvbHVtbi53aWR0aFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1heFJhbmdlKCkge1xuICAgIGxldCBsZWZ0b3ZlcldpZHRoID0gdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCkud2lkdGggLSB0aGlzLm1pbkNvbFdpZHRoO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBsZXQgbmV3TWF4UmFuZ2UgPSBjb2x1bW4ud2lkdGggKyBsZWZ0b3ZlcldpZHRoO1xuICAgICAgbGV0IHJhbmdlSW5wdXQgPSB0aGlzLmdldFJhbmdlSW5wdXRCeUluZGV4KGluZGV4KTtcbiAgICAgIHJhbmdlSW5wdXQubmF0aXZlRWxlbWVudC5tYXggPSBuZXdNYXhSYW5nZTtcbiAgICAgIHJhbmdlSW5wdXQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCBuZXdNYXhSYW5nZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGNsaWNrVGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXggPSBjbGlja1RhcmdldC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKTtcbiAgICBsZXQgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgdGhpcy5zdGFydENvbHVtbldpZHRoID0gY29sdW1uLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYmxlV2lkdGgoKSB7XG4gICAgdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYGF1dG9gKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYCR7dGhpcy50YWJsZVdpZHRofXB4YCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VJbnB1dEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJhbmdlSW5wdXRFbGVtZW50UmVmcy5maW5kKGlucHV0ID0+XG4gICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleC50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zW051bWJlcihpbmRleCldO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXhSYW5nZUJ5SW5kZXgoaW5kZXg6IHN0cmluZykge1xuICAgIGxldCBjb2x1bW5FbGVtZW50UmVmID0gdGhpcy5jb2x1bW5FbGVtZW50UmVmcy5maW5kKHRoID0+XG4gICAgICB0aC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleFxuICAgICk7XG4gICAgbGV0IHJhbmdlSW5wdXQgPSBjb2x1bW5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNreS1ncmlkLWNvbHVtbi1pbnB1dC1hcmlhLW9ubHknKTtcbiAgICByZXR1cm4gTnVtYmVyKHJhbmdlSW5wdXQubWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdERpc3BsYXllZENvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWxpbWV0ZXIodGV4dDogc3RyaW5nW10sIGRlbGltaXRlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHQuZmlsdGVyKHZhbCA9PiB2YWwpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVJvd0RlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm93RGVsZXRlQ29udGVudHMgPSB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXTtcbiAgICBpZiAocm93RGVsZXRlQ29udGVudHMpIHtcbiAgICAgIHJvd0RlbGV0ZUNvbnRlbnRzLmFmZml4ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5jbG9zZShyb3dEZWxldGVDb250ZW50cy5vdmVybGF5KTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3RlZFJvd3Moc291cmNlOiBTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlKSB7XG4gICAgbGV0IHNlbGVjdGVkUm93czogU2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlID0ge1xuICAgICAgc2VsZWN0ZWRSb3dJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCksXG4gICAgICBzb3VyY2U6IHNvdXJjZVxuICAgIH07XG4gICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkUm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gaXRlbS5pc1NlbGVjdGVkO1xuICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLmRhdGEuaGFzT3duUHJvcGVydHkodGhpcy5tdWx0aXNlbGVjdFJvd0lkKSkge1xuICAgICAgICByZXR1cm4gaXRlbS5kYXRhW3RoaXMubXVsdGlzZWxlY3RSb3dJZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnRlcmFjdGl2ZUVsZW1lbnQoZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgbGV0IGludGVyYWN0aXZlRWxTZWxlY3RvcnMgPSBgXG4gICAgICBhLFxuICAgICAgYnV0dG9uLFxuICAgICAgaW5wdXQsXG4gICAgICBsYWJlbCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHNlbGVjdCxcbiAgICAgIHRleHRhcmVhLFxuICAgICAgZGV0YWlscyxcbiAgICAgIGRpYWxvZyxcbiAgICAgIG1lbnUsXG4gICAgICBtZW51aXRlbSxcbiAgICAgIHN1bW1hcnlgO1xuICAgIHJldHVybiBldmVudC50YXJnZXQuY2xvc2VzdChpbnRlcmFjdGl2ZUVsU2VsZWN0b3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVzaXplQmFyUG9zaXRpb24oeFBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgcGFyZW50U2Nyb2xsID0gdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGxldCByZXNpemVCYXJYID0geFBvc2l0aW9uIC0gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gcGFyZW50U2Nyb2xsO1xuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy5yZXNpemVCYXIsICdsZWZ0JywgcmVzaXplQmFyWCArICdweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVVzZXJDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnVpQ29uZmlnU2VydmljZS5nZXRDb25maWcodGhpcy5zZXR0aW5nc0tleSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29uZmlnOiBTa3lHcmlkVUlDb25maWcpID0+IHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNlbGVjdGVkQ29sdW1uSWRzKSB7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgY29sdW1uSWRzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgZGF0YSBzZXQuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZENvbHVtbklkcyA9IGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoXG4gICAgICAgICAgICAgIGlkID0+IHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4uaWQgPT09IGlkKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IGZpbHRlcmVkQ29sdW1uSWRzO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVc2VyQ29uZmlnKGNvbmZpZzogU2t5R3JpZFVJQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51aUNvbmZpZ1NlcnZpY2Uuc2V0Q29uZmlnKFxuICAgICAgdGhpcy5zZXR0aW5nc0tleSxcbiAgICAgIGNvbmZpZ1xuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4geyB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3Qgc2F2ZSBncmlkIHNldHRpbmdzLicpO1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29sdW1ucygpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggIT09IDAgfHxcbiAgICAgIHRoaXMuY29sdW1ucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICBpZiAodGhpcy5jb2x1bW5Db21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5nZXRDb2x1bW5zRnJvbUNvbXBvbmVudCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLy8gV2F0Y2ggZm9yIGFkZGVkL3JlbW92ZWQgY29sdW1uczpcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUNvbHVtbnMoKSlcbiAgICApO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNvbHVtbiBoZWFkaW5nIGNoYW5nZXM6XG4gICAgdGhpcy5jb2x1bW5Db21wb25lbnRzLmZvckVhY2goKGNvbXA6IFNreUdyaWRDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBjb21wLmhlYWRpbmdNb2RlbENoYW5nZXNcbiAgICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFNreUdyaWRDb2x1bW5IZWFkaW5nTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uSGVhZGluZyhjaGFuZ2UpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbXAuZGVzY3JpcHRpb25Nb2RlbENoYW5nZXNcbiAgICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbkRlc2NyaXB0aW9uKGNoYW5nZSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5pbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlc1xuICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXJyYXlzRXF1YWwoYXJyYXlBOiBhbnlbXSwgYXJyYXlCOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcnJheUEubGVuZ3RoID09PSBhcnJheUIubGVuZ3RoICYmXG4gICAgICBhcnJheUEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT5cbiAgICAgICAgdmFsdWUgPT09IGFycmF5QltpbmRleF0pO1xuICB9XG59XG4iXX0=
|