@skyux/grids 7.4.2 → 7.6.0
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/documentation.json +35 -35
- package/esm2020/lib/modules/grid/grid-column.component.mjs +4 -4
- package/esm2020/lib/modules/grid/grid.component.mjs +12 -12
- package/esm2020/lib/modules/grid/types/grid-column-width-model-change.mjs +1 -1
- package/esm2020/lib/modules/grid/types/grid-message.mjs +1 -1
- package/esm2020/lib/modules/grid/types/grid-selected-rows-model-change.mjs +1 -1
- package/fesm2015/skyux-grids.mjs +14 -14
- package/fesm2015/skyux-grids.mjs.map +1 -1
- package/fesm2020/skyux-grids.mjs +14 -14
- package/fesm2020/skyux-grids.mjs.map +1 -1
- package/lib/modules/grid/grid-column.component.d.ts +13 -13
- package/lib/modules/grid/grid.component.d.ts +15 -15
- package/lib/modules/grid/types/grid-column-width-model-change.d.ts +3 -3
- package/lib/modules/grid/types/grid-message.d.ts +1 -1
- package/lib/modules/grid/types/grid-selected-rows-model-change.d.ts +1 -1
- package/package.json +8 -8
|
@@ -35,7 +35,7 @@ export class SkyGridComponent {
|
|
|
35
35
|
this.skyWindow = skyWindow;
|
|
36
36
|
this.uiConfigService = uiConfigService;
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Whether to enable the multiselect feature to display a column of
|
|
39
39
|
* checkboxes on the left side of the grid. You can specify a unique ID with
|
|
40
40
|
* the `multiselectRowId` property, but multiselect defaults to the `id` property on
|
|
41
41
|
* the `data` object.
|
|
@@ -43,7 +43,7 @@ export class SkyGridComponent {
|
|
|
43
43
|
*/
|
|
44
44
|
this.enableMultiselect = false;
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* How the grid fits to its parent. The valid options are `width`,
|
|
47
47
|
* which fits the grid to the parent's full width, and `scroll`, which allows the grid
|
|
48
48
|
* to exceed the parent's width. If the grid does not have enough columns to fill
|
|
49
49
|
* the parent's width, it always stretches to the parent's full width.
|
|
@@ -51,11 +51,11 @@ export class SkyGridComponent {
|
|
|
51
51
|
*/
|
|
52
52
|
this.fit = 'width';
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
54
|
+
* Whether to display a toolbar with the grid.
|
|
55
55
|
*/
|
|
56
56
|
this.hasToolbar = false;
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* The observable to send commands to the grid.
|
|
59
59
|
*/
|
|
60
60
|
this.messageStream = new Subject();
|
|
61
61
|
/**
|
|
@@ -113,7 +113,7 @@ export class SkyGridComponent {
|
|
|
113
113
|
this.dragulaGroupName = `sky-grids-group-${this.gridId}`;
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
|
-
*
|
|
116
|
+
* Columns and column properties for the grid.
|
|
117
117
|
*/
|
|
118
118
|
set columns(newColumns) {
|
|
119
119
|
const oldColumns = this.columns;
|
|
@@ -129,7 +129,7 @@ export class SkyGridComponent {
|
|
|
129
129
|
return this._columns;
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
|
-
*
|
|
132
|
+
* The columns to display in the grid based on the `id` or `field` properties
|
|
133
133
|
* of the columns. If no columns are specified, then the grid displays all columns.
|
|
134
134
|
*/
|
|
135
135
|
set selectedColumnIds(value) {
|
|
@@ -158,7 +158,7 @@ export class SkyGridComponent {
|
|
|
158
158
|
return this._selectedColumnIds;
|
|
159
159
|
}
|
|
160
160
|
/**
|
|
161
|
-
*
|
|
161
|
+
* The set of IDs for the rows to select in a multiselect grid.
|
|
162
162
|
* The IDs match the `id` properties of the `data` objects.
|
|
163
163
|
* Rows with IDs that are not included are de-selected in the grid.
|
|
164
164
|
*/
|
|
@@ -265,14 +265,14 @@ export class SkyGridComponent {
|
|
|
265
265
|
if (this.hasToolbar) {
|
|
266
266
|
classNames.push('sky-grid-has-toolbar');
|
|
267
267
|
}
|
|
268
|
-
return this.
|
|
268
|
+
return this.addDelimiter(classNames, ' ');
|
|
269
269
|
}
|
|
270
270
|
getTableHeaderClassNames(column) {
|
|
271
271
|
const classNames = [];
|
|
272
272
|
if (column && column.locked) {
|
|
273
273
|
classNames.push('sky-grid-header-locked');
|
|
274
274
|
}
|
|
275
|
-
return this.
|
|
275
|
+
return this.addDelimiter(classNames, ' ');
|
|
276
276
|
}
|
|
277
277
|
getCaretIconNames(column) {
|
|
278
278
|
const iconNames = [];
|
|
@@ -284,7 +284,7 @@ export class SkyGridComponent {
|
|
|
284
284
|
iconNames.push('caret-down');
|
|
285
285
|
}
|
|
286
286
|
});
|
|
287
|
-
return this.
|
|
287
|
+
return this.addDelimiter(iconNames, ' ');
|
|
288
288
|
}
|
|
289
289
|
onKeydown(event, column) {
|
|
290
290
|
const key = event.key.toLowerCase();
|
|
@@ -835,7 +835,7 @@ export class SkyGridComponent {
|
|
|
835
835
|
getLastDisplayedColumn() {
|
|
836
836
|
return this.getColumnModelByIndex(this.displayedColumns.length - 1);
|
|
837
837
|
}
|
|
838
|
-
|
|
838
|
+
addDelimiter(text, delimiter) {
|
|
839
839
|
return text.filter((val) => val).join(delimiter);
|
|
840
840
|
}
|
|
841
841
|
destroyRowDelete(id) {
|
|
@@ -1031,4 +1031,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImpo
|
|
|
1031
1031
|
type: HostListener,
|
|
1032
1032
|
args: ['window:resize']
|
|
1033
1033
|
}] } });
|
|
1034
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxzQkFBc0IsR0FNdkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGFBQWEsR0FFZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsU0FBUyxFQUNULEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILElBQUksRUFDSixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFNekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFHOUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWY7O0dBRUc7QUFTSCxNQUFNLE9BQU8sZ0JBQWdCO0lBc1EzQixZQUNVLFlBQTZCLEVBQzdCLGNBQWlDLEVBQ2pDLGNBQThCLEVBQzlCLFdBQWtDLEVBQ2xDLGNBQWlDLEVBQ2pDLFNBQTBCLEVBQzFCLGVBQW1DLEVBQzNDLE1BQXFCO1FBUGIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBb0I7UUFoUDdDOzs7Ozs7V0FNRztRQUVJLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUVqQzs7Ozs7O1dBTUc7UUFFSSxRQUFHLEdBQUcsT0FBTyxDQUFDO1FBRXJCOztXQUVHO1FBRUksZUFBVSxHQUFHLEtBQUssQ0FBQztRQWUxQjs7V0FFRztRQUVJLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFrR3JEOztXQUVHO1FBRUksc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBRXhDLENBQUM7UUFFSjs7OztXQUlHO1FBRUksK0JBQTBCLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFFdkY7O1dBRUc7UUFFSSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBRXhFOztXQUVHO1FBRUkscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFFMUU7OztXQUdHO1FBRUksNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFbkU7O1dBRUc7UUFFSSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBRWpFLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUl0QixXQUFNLEdBQVcsRUFBRSxNQUFNLENBQUM7UUFDMUIscUJBQWdCLEdBQTZCLEVBQUUsQ0FBQztRQUVoRCxnQkFBVyxHQUFHLElBQUksQ0FBQyxDQUFDLHFGQUFxRjtRQUN6RyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQTJCckIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3BDLHNCQUFpQixHQUErQyxFQUFFLENBQUM7UUFFbkUsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQWlCbkMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRTtZQUNwQyx1QkFBdUIsRUFBRSxDQUFDO1lBQzFCLFdBQVcsRUFBRSw0REFBNEQ7WUFDekUseUJBQXlCLEVBQUUsd0JBQXdCO1NBQ3BELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBc0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUE2QjtZQUN0RSxhQUFhLEVBQUUsRUFBRTtZQUNqQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBMVJEOztPQUVHO0lBQ0gsSUFDVyxPQUFPLENBQUMsVUFBcUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMzQixJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQXFFRDs7O09BR0c7SUFDSCxJQUNXLGlCQUFpQixDQUFDLEtBQW9CO1FBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMzQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUVELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDakUsd0ZBQXdGO1lBQ3hGLGdEQUFnRDtZQUNoRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDakIsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRTNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUN4QjthQUNGO1NBQ0Y7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ1csY0FBYyxDQUFDLEtBQW9CO1FBQzVDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDdkU7SUFDSCxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBaUZELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUN4RCxDQUFDO0lBOERNLFFBQVE7UUFDYixJQUFJLENBQUMsYUFBYTthQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxDQUFDLE9BQXVCLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtRQUVELDhCQUE4QjtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQ25CLENBQUMsaUJBQWdDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25DLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNsRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLDRFQUE0RTtZQUM1RSxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLDZFQUE2RTtnQkFDN0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO3dCQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzNCO3lCQUFNO3dCQUNMLHVGQUF1Rjt3QkFDdkYsZ0NBQWdDO3dCQUNoQyxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQzlDLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUM1QixDQUFDO3dCQUVKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTs0QkFDckQsY0FBYyxFQUFFLHNCQUFzQixDQUFDLFFBQVE7NEJBQy9DLFFBQVEsRUFBRSxJQUFJOzRCQUNkLFNBQVMsRUFBRSxPQUFPOzRCQUNsQixpQkFBaUIsRUFBRSxLQUFLOzRCQUN4QixtQkFBbUIsRUFBRSxNQUFNOzRCQUMzQixhQUFhLEVBQUUsS0FBSzt5QkFDckIsQ0FBQyxDQUFDO3FCQUNKO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUEwQixFQUFFLEVBQUU7WUFDeEQsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU5QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFHTSxjQUFjO1FBQ25CLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDeEQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUN6QixVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUN6QztRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLHdCQUF3QixDQUFDLE1BQTBCO1FBQ3hELE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUVoQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzNCLFVBQVUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUMzQztRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQTBCO1FBQ2pELE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3hELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM5QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQW9CLEVBQUUsTUFBMEI7UUFDL0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxNQUEwQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDckQsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDWixJQUFJLFFBQVEsR0FBRztvQkFDYixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDO2dCQUVGLElBQ0UsS0FBSztvQkFDTCxLQUFLLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxLQUFLO29CQUNwQyxLQUFLLENBQUMsVUFBVSxFQUNoQjtvQkFDQSxRQUFRLEdBQUc7d0JBQ1QsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLO3dCQUMzQixVQUFVLEVBQUUsS0FBSztxQkFDbEIsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FDSDtpQkFDQSxTQUFTLEVBQUUsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxXQUFtQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQy9CLG9CQUFvQixFQUFFLEVBQ3RCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUMsYUFBYSxLQUFLLFdBQVc7Z0JBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDaEIsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1QsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLG9CQUFvQixDQUFDLE1BQTBCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDL0Isb0JBQW9CLEVBQUUsRUFDdEIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEtBQUssQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLEtBQUs7Z0JBQ3pDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDaEIsQ0FBQyxDQUFDLFlBQVk7b0JBQ2QsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVO29CQUNuQixDQUFDLENBQUMsTUFBTTtvQkFDUixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sa0JBQWtCLENBQUMsV0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUMvQixvQkFBb0IsRUFBRSxFQUN0QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNaLE9BQU8sS0FBSyxDQUFDLGFBQWEsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sa0JBQWtCLENBQUMsV0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUM5QyxHQUFHLENBQUMsQ0FBQyxVQUFrQixFQUFFLEVBQUU7WUFDekIsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsTUFBdUM7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtZQUN4RSxPQUFPLENBQ0wsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQzlELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sdUJBQXVCLENBQzVCLE1BQWlEO1FBRWpELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUEwQixFQUFFLEVBQUU7WUFDeEUsT0FBTyxDQUNMLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUM5RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixnQkFBZ0IsQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sdUJBQXVCLENBQUMsTUFBMkM7UUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtZQUN4RSxPQUFPLENBQ0wsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQzlELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FJMUI7UUFDQyx1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFMUIsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4RCxLQUFLLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQzthQUNsQyxJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXRELEtBQUssQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO2FBQy9CLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBb0I7UUFDNUMsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxLQUFZO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxLQUFpQjtRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztRQUVuRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25DLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFO1lBQzdDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEtBQWlCO1FBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0scUJBQXFCLENBQUMsS0FBaUI7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1FBRXpDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBVSxFQUFFLFlBQTJCO1FBQ3ZELDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUNFLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLGFBQWE7Z0JBQ3BDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUNqQztnQkFDQSxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsRUFBVTtRQUNoQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7U0FDckM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBYTtRQUMvQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFVO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNsRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsRUFBVTtRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQzNFLFdBQVcsQ0FBQyxLQUFVO1FBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQVU7UUFDM0Isa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLFVBQVU7b0JBQ3BELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO2FBQzlEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQVU7UUFDNUIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLFVBQVU7b0JBQ3hELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO2FBQzFEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLElBQ0UsQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUNuQixJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNqQztZQUNBLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUN2QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQzlCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUNqRCxDQUFDO29CQUNGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO29CQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNwQixhQUFhLElBQUksV0FBVyxFQUM1QixJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO29CQUNGLGlCQUFpQixHQUFHLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDOUMsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ3JDLENBQUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxtQkFBbUI7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUF1QjtRQUNwRCxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDcEIsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO2dCQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsTUFBTTtZQUVSLEtBQUssa0JBQWtCLENBQUMsUUFBUTtnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLGtCQUFrQixDQUFDLGVBQWU7Z0JBQ3JDLGtCQUFrQjtnQkFDbEIsMEJBQTBCO2dCQUMxQixJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ2hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQy9DLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FDMUQsQ0FBQztvQkFDRixJQUFJLGNBQWMsRUFBRTt3QkFDbEIsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ2hDO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7NEJBQ3pCLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFOzRCQUNuQyxPQUFPLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7d0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7NEJBQ3pDLFlBQVksRUFBRSxJQUFJOzRCQUNsQixZQUFZLEVBQUUsS0FBSzs0QkFDbkIsaUJBQWlCLEVBQUUsSUFBSTs0QkFDdkIsV0FBVyxFQUFFLEtBQUs7NEJBQ2xCLG1CQUFtQixFQUFFLElBQUk7eUJBQzFCLENBQUMsQ0FBQzt3QkFFSCxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTs0QkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN2QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQ3REO3lCQUNGLENBQUMsQ0FBQzt3QkFFSDs7Ozs7MkJBS0c7d0JBQ0gsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzt3QkFFN0MsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDZCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO2lDQUMxQyxPQUFPLEVBQUU7aUNBQ1QsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0NBQ2QsT0FBTyxDQUNMLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRTtvQ0FDdEIsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUNwRCxDQUFDOzRCQUNKLENBQUMsQ0FBQyxDQUFDOzRCQUNMLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUVqRSxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQzlDLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUN6RCxDQUFDOzRCQUVKLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2dDQUMxQixjQUFjLEVBQUUsc0JBQXNCLENBQUMsUUFBUTtnQ0FDL0MsUUFBUSxFQUFFLElBQUk7Z0NBQ2QsU0FBUyxFQUFFLE9BQU87Z0NBQ2xCLGlCQUFpQixFQUFFLEtBQUs7Z0NBQ3hCLG1CQUFtQixFQUFFLE1BQU07Z0NBQzNCLGFBQWEsRUFBRSxLQUFLOzZCQUNyQixDQUFDLENBQUM7NEJBRUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dDQUN4RCxPQUFPLEVBQUUsT0FBTztnQ0FDaEIsT0FBTyxFQUFFLE9BQU87NkJBQ2pCLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssa0JBQWtCLENBQUMsY0FBYztnQkFDcEMsa0JBQWtCO2dCQUNsQiwwQkFBMEI7Z0JBQzFCLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQ2xELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FDekQsQ0FBQztvQkFFRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3ZEO2dCQUNELE1BQU07U0FDVDtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLFlBQVksQ0FBQyxZQUEyQjtRQUM5Qyw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO1FBRXRDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxnQkFBeUIsS0FBSztRQUN4RCxrQkFBa0I7UUFDbEIsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hDLDBCQUEwQjtnQkFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUI7cUJBQzNDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDLENBQUM7cUJBQ0QsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLENBQUMsQ0FBQyxDQUFDO2FBQ047aUJBQU0sSUFBSSxhQUFhLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNyRCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUN0QztTQUNGO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIseURBQXlEO1FBQ3pELElBQ0UsSUFBSSxDQUFDLElBQUk7WUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNmLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ2xCO1lBQ0EsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7YUFDakQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3hFO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTywyQkFBMkI7UUFDakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM1QixJQUFJLE9BQU8sQ0FBQztZQUNaLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDckUsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEU7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO29CQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQ3hCLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxJQUFJLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQixnRkFBZ0Y7UUFDaEYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUN6QixXQUFtQixFQUNuQixXQUFtQixFQUNuQixNQUFjO1FBRWQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXZELG9EQUFvRDtRQUNwRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25DLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDakQsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDaEM7UUFFRCxvREFBb0Q7UUFDcEQsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFakQsb0VBQW9FO1lBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRCxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUU7Z0JBQ3JCLFdBQVcsR0FBRyxHQUFHLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQ3RDO1lBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7WUFDM0IsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUM3QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUN2QixJQUFJLENBQUMsZUFBZSxFQUNwQixPQUFPLEVBQ1AsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUNoQyxDQUFDO1lBQ0YsTUFBTSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQix1RUFBdUU7UUFDdkUsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUM5QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FDakQsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ2xELDBCQUEwQjtZQUMxQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2hELGFBQWEsSUFBSSxXQUFXLEVBQzVCLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFVBQWdDLEVBQ2hDLFVBQWdDO1FBRWhDLGtCQUFrQjtRQUNsQiwwQkFBMEI7UUFDMUIsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFO1lBQzVCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUNsQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUU7b0JBQ25CLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQ3BDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQzdDLENBQUM7b0JBQ0YsSUFBSSxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO3dCQUMzQyxjQUFjLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7cUJBQ3hDO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixNQUFNLHNCQUFzQixHQUFHLElBQUksS0FBSyxFQUFpQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDOUIsc0JBQXNCLENBQUMsSUFBSSxDQUFDO2dCQUMxQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN6RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7WUFDM0MsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQVU7UUFDdkMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDaEQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDdkIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsT0FBTyxFQUNQLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFzQjtRQUNqRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQzFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMsS0FBc0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQWE7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUNsRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxDQUNqRSxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FDN0Qsa0NBQWtDLENBQ25DLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBYyxFQUFFLFNBQWlCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELDBCQUEwQjtRQUMxQixJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxNQUFpQztRQUN4RCxNQUFNLFlBQVksR0FBbUM7WUFDbkQsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEMsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN0RTtnQkFDQSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDekM7WUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBVTtRQUNyQyxNQUFNLHNCQUFzQixHQUFHOzs7Ozs7Ozs7Ozs7Y0FZckIsQ0FBQztRQUNYLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDNUUsTUFBTSxVQUFVLEdBQ2QsU0FBUztZQUNULElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSTtZQUMvRCxZQUFZLENBQUM7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGVBQWU7UUFDckIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxlQUFlO2lCQUNqQixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQ1IsQ0FBQyxNQUF1QixFQUFFLEVBQUU7Z0JBQzFCLDBCQUEwQjtnQkFDMUIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFO29CQUN0QyxpRUFBaUU7b0JBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ2hELENBQUM7b0JBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDcEM7Z0JBRUQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLEVBQ0QsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUNGLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsTUFBdUI7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGVBQWU7YUFDakIsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO2FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVM7UUFDUixnRUFBZ0U7UUFDaEUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUNSLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFTyxXQUFXO1FBQ2pCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3BFLDBCQUEwQjtZQUMxQixrQkFBa0I7WUFDbEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDaEM7WUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUNwRSxDQUFDO1FBRUYsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUE0QixFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQ2hDLENBQUMsTUFBdUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUNGLENBQ0YsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUNwQyxDQUFDLE1BQTJDLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FDRixDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FDMUMsQ0FBQyxNQUFpRCxFQUFFLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQWEsRUFBRSxNQUFhO1FBQzlDLE9BQU8sQ0FDTCxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDOzs4R0FyeENVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLDB4QkFIaEIsQ0FBQyxxQkFBcUIsQ0FBQywyREFzT2pCLHNCQUFzQiw0SUFTTyxXQUFXLHV0QkM3VDNELGloUEFrTkEsMnVORHJJaUIsQ0FBQyxjQUFjLENBQUM7NEZBSXBCLGdCQUFnQjtrQkFSNUIsU0FBUzsrQkFDRSxVQUFVLGlCQUdMLENBQUMsY0FBYyxDQUFDLGFBQ3BCLENBQUMscUJBQXFCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU07a1VBU3BDLE9BQU87c0JBRGpCLEtBQUs7Z0JBcUJDLElBQUk7c0JBRFYsS0FBSztnQkFXQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBV0MsR0FBRztzQkFEVCxLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsTUFBTTtzQkFEWixLQUFLO2dCQVFDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBT0MsYUFBYTtzQkFEbkIsS0FBSztnQkFRQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBU0MsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQVFLLGlCQUFpQjtzQkFEM0IsS0FBSztnQkF1Q0ssY0FBYztzQkFEeEIsS0FBSztnQkFtQkMsV0FBVztzQkFEakIsS0FBSztnQkFhQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsS0FBSztzQkFEWCxLQUFLO2dCQU9DLGlCQUFpQjtzQkFEdkIsTUFBTTtnQkFXQSwwQkFBMEI7c0JBRGhDLE1BQU07Z0JBT0EsZUFBZTtzQkFEckIsTUFBTTtnQkFPQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBUUEsdUJBQXVCO3NCQUQ3QixNQUFNO2dCQU9BLGVBQWU7c0JBRHJCLE1BQU07Z0JBb0JDLGdCQUFnQjtzQkFEdkIsZUFBZTt1QkFBQyxzQkFBc0I7Z0JBSS9CLGlCQUFpQjtzQkFEeEIsWUFBWTt1QkFBQyxTQUFTO2dCQUdmLDJCQUEyQjtzQkFEbEMsWUFBWTt1QkFBQyxjQUFjO2dCQUdwQixnQkFBZ0I7c0JBRHZCLFlBQVk7dUJBQUMsaUJBQWlCO2dCQUd2Qix1QkFBdUI7c0JBRDlCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUduRCx3QkFBd0I7c0JBRC9CLFNBQVM7dUJBQUMsZUFBZTtnQkFHbEIsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxXQUFXO2dCQUdkLDRCQUE0QjtzQkFEbkMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBR3ZCLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsV0FBVztnQkE0SWYsY0FBYztzQkFEcEIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QXBwV2luZG93UmVmLFxuICBTa3lMb2dTZXJ2aWNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5VUlDb25maWdTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQge1xuICBMaXN0SXRlbU1vZGVsLFxuICBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbCxcbn0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBEcmFndWxhU2VydmljZSB9IGZyb20gJ25nMi1kcmFndWxhJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFrZVdoaWxlLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUdyaWRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vZ3JpZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWRlc2NyaXB0aW9uLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1oZWFkaW5nLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taW5saW5lLWhlbHAtcG9wb3Zlci1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLXdpZHRoLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlJztcbmltcG9ydCB7IFNreUdyaWRNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlLXR5cGUnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3MgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jYW5jZWwtYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29uZmlnJztcbmltcG9ydCB7IFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncyB9IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29udGVudHMgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb250ZW50cyc7XG5pbXBvcnQgeyBTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1zZWxlY3RlZC1yb3dzLXNvdXJjZSc7XG5pbXBvcnQgeyBTa3lHcmlkVUlDb25maWcgfSBmcm9tICcuL3R5cGVzL2dyaWQtdWktY29uZmlnJztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgYFNreUdyaWRDb21wb25lbnRgIGFuZCBpdHMgZmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgZGF0YSBncmlkIGluc3RlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2RhdGEtZ3JpZFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRHJhZ3VsYVNlcnZpY2VdLFxuICBwcm92aWRlcnM6IFtTa3lHcmlkQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5R3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBjb2x1bW5zIGFuZCBjb2x1bW4gcHJvcGVydGllcyBmb3IgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbHVtbnMobmV3Q29sdW1uczogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPikge1xuICAgIGNvbnN0IG9sZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgdGhpcy5fY29sdW1ucyA9IG5ld0NvbHVtbnM7XG4gICAgaWYgKG9sZENvbHVtbnMpIHtcbiAgICAgIHRoaXMudHJhbnNmZXJDb2x1bW5XaWR0aHMob2xkQ29sdW1ucywgdGhpcy5jb2x1bW5zKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkYXRhIGZvciB0aGUgZ3JpZC4gRWFjaCBpdGVtIHJlcXVpcmVzIGFuIGBpZGAgYW5kIGEgcHJvcGVydHkgdGhhdCBtYXBzXG4gICAqIHRvIHRoZSBgZmllbGRgIG9yIGBpZGAgcHJvcGVydHkgb2YgZWFjaCBjb2x1bW4gaW4gdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGF0YTogQXJyYXk8YW55PjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBtdWx0aXNlbGVjdCBmZWF0dXJlIHRvIGRpc3BsYXkgYSBjb2x1bW4gb2ZcbiAgICogY2hlY2tib3hlcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBncmlkLiBZb3UgY2FuIHNwZWNpZnkgYSB1bmlxdWUgSUQgd2l0aFxuICAgKiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5LCBidXQgbXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb25cbiAgICogdGhlIGBkYXRhYCBvYmplY3QuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlTXVsdGlzZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyB0aGUgZ3JpZCBmaXRzIHRvIGl0cyBwYXJlbnQuIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBgd2lkdGhgLFxuICAgKiB3aGljaCBmaXRzIHRoZSBncmlkIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLCBhbmQgYHNjcm9sbGAsIHdoaWNoIGFsbG93cyB0aGUgZ3JpZFxuICAgKiB0byBleGNlZWQgdGhlIHBhcmVudCdzIHdpZHRoLiBJZiB0aGUgZ3JpZCBkb2VzIG5vdCBoYXZlIGVub3VnaCBjb2x1bW5zIHRvIGZpbGxcbiAgICogdGhlIHBhcmVudCdzIHdpZHRoLCBpdCBhbHdheXMgc3RyZXRjaGVzIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLlxuICAgKiBAZGVmYXVsdCBcIndpZHRoXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaXQgPSAnd2lkdGgnO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBkaXNwbGF5IGEgdG9vbGJhciB3aXRoIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhhc1Rvb2xiYXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0ZXh0IHRvIGhpZ2hsaWdodCB3aXRoaW4gdGhlIGdyaWQuXG4gICAqIFR5cGljYWxseSwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggc2VhcmNoLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZ2hsaWdodFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvdmlkZXMgYW4gb2JzZXJ2YWJsZSB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgdW5pcXVlIElEIHRoYXQgbWF0Y2hlcyBhIHByb3BlcnR5IG9uIHRoZSBgZGF0YWAgb2JqZWN0LlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IHVzZXMgdGhlIGBpZGAgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbXVsdGlzZWxlY3RSb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIHRoZSByb3cgdG8gaGlnaGxpZ2h0LiBUaGUgSUQgbWF0Y2hlcyB0aGUgYGlkYCBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgYGRhdGFgIG9iamVjdC4gVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiB0aGUgZmx5b3V0IGNvbXBvbmVudCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dIaWdobGlnaHRlZElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGJhc2VkIG9uIHRoZSBgaWRgIG9yIGBmaWVsZGAgcHJvcGVydGllc1xuICAgKiBvZiB0aGUgY29sdW1ucy4gSWYgbm8gY29sdW1ucyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBncmlkIGRpc3BsYXlzIGFsbCBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZENvbHVtbklkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbklkcyA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIGlkcyBoYXZlIGNoYW5nZWQuXG4gICAgaWYgKCFjdXJyZW50SWRzIHx8ICF2YWx1ZSB8fCAhdGhpcy5hcnJheXNFcXVhbCh2YWx1ZSwgY3VycmVudElkcykpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBzZXQgdXNlciBjb25maWcgb3B0aW9ucyBvciBmaXJlIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIGNvbHVtbnMgYXJlIHNldCB1cFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQpIHtcbiAgICAgICAgdGhpcy5zZXRVc2VyQ29uZmlnKHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbklkczogdmFsdWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZENvbHVtbklkcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXNpemVkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFRhYmxlV2lkdGgoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvbHVtbklkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDb2x1bW5JZHM7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgc2V0IG9mIElEcyBmb3IgdGhlIHJvd3MgdG8gc2VsZWN0IGluIGEgbXVsdGlzZWxlY3QgZ3JpZC5cbiAgICogVGhlIElEcyBtYXRjaCB0aGUgYGlkYCBwcm9wZXJ0aWVzIG9mIHRoZSBgZGF0YWAgb2JqZWN0cy5cbiAgICogUm93cyB3aXRoIElEcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlIGRlLXNlbGVjdGVkIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZFJvd0lkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlNlbGVjdGVkUm93SWRzQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93SWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJvd0lkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSB1bmlxdWUga2V5IGZvciB0aGUgVUkgQ29uZmlnIFNlcnZpY2UgdG8gcmV0cmlldmUgc3RvcmVkIHNldHRpbmdzIGZyb20gYSBkYXRhYmFzZS5cbiAgICogVGhlIFVJIENvbmZpZyBTZXJ2aWNlIHNhdmVzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHVzZXJzIGFuZCByZXR1cm5zXG4gICAqIGBzZWxlY3RlZENvbHVtbklkc2AgdG8gcHJlc2VydmUgdGhlIGNvbHVtbnMgdG8gZGlzcGxheSBhbmQgdGhlIHByZWZlcnJlZCBjb2x1bW4gb3JkZXIuIFlvdSAgbXVzdCBwcm92aWRlIGBpZGAgdmFsdWVzIGZvciB5b3VyIGBza3ktZ3JpZC1jb2x1bW5gIGVsZW1lbnRzIGJlY2F1c2UgdGhlIFVJIENvbmZpZyBTZXJ2aWNlIGRlcGVuZHMgb24gdGhvc2UgdmFsdWVzIHRvIG9yZ2FuaXplIGNvbHVtbnMgYmFzZWQgb24gdXNlciBzZXR0aW5ncy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVJIENvbmZpZyBTZXJ2aWNlLCBzZWUgW3RoZSBzdGlja3kgc2V0dGluZ3MgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9nZXQtc3RhcnRlZC9zdGlja3ktc2V0dGluZ3MpLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldHRpbmdzS2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgY2FyZXQgaW4gdGhlIGNvbHVtbiB0aGF0IHdhcyB1c2VkIHRvIHNvcnQgdGhlIGdyaWQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bFxuICAgKiB3aGVuIHlvdSBwcm9ncmFtbWF0aWNhbGx5IHNvcnQgZGF0YSBhbmQgd2FudCB0byB2aXN1YWxseSBpbmRpY2F0ZSBob3cgdGhlIGdyaWQgd2FzIHNvcnRlZC5cbiAgICogVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGEgYExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsYCB2YWx1ZSB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICogLSBgZmllbGRTZWxlY3RvcmAgUmVwcmVzZW50cyB0aGUgY3VycmVudCBzb3J0IGZpZWxkLiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgYHN0cmluZ2AgdmFsdWVzLlxuICAgKiAtIGBkZXNjZW5kaW5nYCBJbmRpY2F0ZXMgd2hldGhlciB0byBzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIuIFRoZSBjYXJldCB0aGF0IHZpc3VhbGx5XG4gICAqIGluZGljYXRlcyB0aGUgc29ydCBvcmRlciBwb2ludHMgZG93biBmb3IgZGVzY2VuZGluZyBvcmRlciBhbmQgdXAgZm9yIGFzY2VuZGluZyBvcmRlci5cbiAgICogVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBib29sZWFuYCB2YWx1ZXMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0RmllbGQ6IExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBncmlkIGluIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB3aWR0aCBvZiBhIGNvbHVtbiBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2x1bW5XaWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgQXJyYXk8U2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2U+XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgc2VsZWN0aW9uIG9mIG11bHRpc2VsZWN0IGNoZWNrYm94ZXMgY2hhbmdlcy5cbiAgICogRW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgc2VsZWN0ZWQgcm93cyBiYXNlZCBvbiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5XG4gICAqIHRoYXQgdGhlIGNvbnN1bWVyIHByb3ZpZGVzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcm93RGVsZXRlQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkUm93RGVsZXRlQ2FuY2VsQXJncz4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGNoYW5nZSBvciB3aGVuIHRoZSBvcmRlciBvZiB0aGUgY29sdW1ucyBjaGFuZ2VzLlxuICAgKiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdCByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYWN0aXZlIHNvcnQgZmllbGQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oKTtcblxuICBwdWJsaWMgY29sdW1uUmVzaXplU3RlcCA9IDEwO1xuICBwdWJsaWMgY3VycmVudFNvcnRGaWVsZDogQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPjtcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnM6IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD47XG4gIHB1YmxpYyBkcmFndWxhR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBncmlkSWQ6IG51bWJlciA9ICsrbmV4dElkO1xuICBwdWJsaWMgcm93RGVsZXRlQ29uZmlnczogU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZ1tdID0gW107XG4gIHB1YmxpYyBpdGVtczogQXJyYXk8YW55PjtcbiAgcHVibGljIG1heENvbFdpZHRoID0gOTk5OTsgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLCBhcyB0aGUgaW5wdXQgcmFuZ2UgcGlja2VyIHdvbid0IHdvcmsgd2l0aG91dCBhIHZhbHVlLlxuICBwdWJsaWMgbWluQ29sV2lkdGggPSA1MDtcbiAgcHVibGljIHNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgcHVibGljIHNob3dUb3BTY3JvbGwgPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IHRhYmxlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreUdyaWRDb2x1bW5Db21wb25lbnQpXG4gIHByaXZhdGUgY29sdW1uQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUdyaWRDb2x1bW5Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRDb2wnKVxuICBwcml2YXRlIGNvbHVtbkVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2NvbFNpemVSYW5nZScpXG4gIHByaXZhdGUgY29sdW1uUmFuZ2VJbnB1dEVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2lubGluZURlbGV0ZVJlZicpXG4gIHByaXZhdGUgaW5saW5lRGVsZXRlUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZicsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInKVxuICBwcml2YXRlIHRhYmxlQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZ3JpZFRhYmxlJylcbiAgcHJpdmF0ZSB0YWJsZUVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RvcFNjcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgdG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmVzaXplQmFyJylcbiAgcHJpdmF0ZSByZXNpemVCYXI6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBhY3RpdmVSZXNpemVDb2x1bW5JbmRleDogc3RyaW5nO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByb3dEZWxldGVDb250ZW50czogeyBbaWQ6IHN0cmluZ106IFNreUdyaWRSb3dEZWxldGVDb250ZW50cyB9ID0ge307XG4gIHByaXZhdGUgc3RhcnRDb2x1bW5XaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgc2Nyb2xsVHJpZ2dlcmVkID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB4UG9zU3RhcnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+O1xuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZmZpeFNlcnZpY2U6IFNreUFmZml4U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGRyYWd1bGFTZXJ2aWNlOiBEcmFndWxhU2VydmljZSxcbiAgICBwcml2YXRlIGdyaWRBZGFwdGVyOiBTa3lHcmlkQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogU2t5T3ZlcmxheVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBza3lXaW5kb3c6IFNreUFwcFdpbmRvd1JlZixcbiAgICBwcml2YXRlIHVpQ29uZmlnU2VydmljZTogU2t5VUlDb25maWdTZXJ2aWNlLFxuICAgIGxvZ2dlcjogU2t5TG9nU2VydmljZVxuICApIHtcbiAgICBsb2dnZXIuZGVwcmVjYXRlZCgnU2t5R3JpZENvbXBvbmVudCcsIHtcbiAgICAgIGRlcHJlY2F0aW9uTWFqb3JWZXJzaW9uOiA2LFxuICAgICAgbW9yZUluZm9Vcmw6ICdodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvZGF0YS1ncmlkJyxcbiAgICAgIHJlcGxhY2VtZW50UmVjb21tZW5kYXRpb246ICdVc2UgZGF0YSBncmlkIGluc3RlYWQuJyxcbiAgICB9KTtcblxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+KCk7XG4gICAgdGhpcy5pdGVtcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oe1xuICAgICAgZmllbGRTZWxlY3RvcjogJycsXG4gICAgICBkZXNjZW5kaW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmRyYWd1bGFHcm91cE5hbWUgPSBgc2t5LWdyaWRzLWdyb3VwLSR7dGhpcy5ncmlkSWR9YDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VTdHJlYW1cbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogU2t5R3JpZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzS2V5KSB7XG4gICAgICB0aGlzLmFwcGx5VXNlckNvbmZpZygpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRDb2x1bW5zKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGNvbHVtbiBkcmFnLWFuZC1kcm9wLlxuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuaW5pdGlhbGl6ZURyYWdBbmREcm9wKFxuICAgICAgdGhpcy5kcmFndWxhR3JvdXBOYW1lLFxuICAgICAgdGhpcy5kcmFndWxhU2VydmljZSxcbiAgICAgIChzZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPikgPT4ge1xuICAgICAgICB0aGlzLm9uSGVhZGVyRHJvcChzZWxlY3RlZENvbHVtbklkcyk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmRhdGEgJiYgdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcblxuICAgICAgLy8gVGhpcyBzZXQgdGltZW91dCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBkYXRhIGhhcyByZW5kZXJlZCBpbiB0aGUgZ3JpZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgY2xlYW5zIHVwIGFueSBsaW5nZXJpbmcgcm93IGRlbGV0ZXMgZm9yIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMucm93RGVsZXRlQ29udGVudHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcm93cyByZS1yZW5kZXIgdGh1cyBtZXNzaW5nIHVwIHRoZSBhZmZpeGVycy4gV2UgbXVzdCByZWFmZml4IHRoZW0gc28gdGhhdCB0aGluZ3NcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHJlbmRlciBjb3JyZWN0bHkuXG4gICAgICAgICAgICBjb25zdCByb3dFbGVtZW50OiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnW3NreS1jbXAtaWQ9XCInICsgaWQgKyAnXCJdJ1xuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXS5hZmZpeGVyLmFmZml4VG8ocm93RWxlbWVudCwge1xuICAgICAgICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlbWVudDogJ2Fib3ZlJyxcbiAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnQ6ICd0b3AnLFxuICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgIGVuYWJsZUF1dG9GaXQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuc29ydEZpZWxkKSB7XG4gICAgICB0aGlzLnNldFNvcnRIZWFkZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZS5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMucm93RGVsZXRlQ29udGVudHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kcmFndWxhU2VydmljZS5kZXN0cm95KHRoaXMuZHJhZ3VsYUdyb3VwTmFtZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9wU2Nyb2xsV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWJsZUNsYXNzTmFtZXMoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmZpdCAhPT0gJ3Njcm9sbCcpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtZml0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzVG9vbGJhcikge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1oYXMtdG9vbGJhcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltZXRlcihjbGFzc05hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIGdldFRhYmxlSGVhZGVyQ2xhc3NOYW1lcyhjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5sb2NrZWQpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtaGVhZGVyLWxvY2tlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltZXRlcihjbGFzc05hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIGdldENhcmV0SWNvbk5hbWVzKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgY29uc3QgaWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKGNvbHVtbi5maWVsZCkuc3Vic2NyaWJlKChzb3J0RGlyKSA9PiB7XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2FzYycpIHtcbiAgICAgICAgaWNvbk5hbWVzLnB1c2goJ2NhcmV0LXVwJyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIGljb25OYW1lcy5wdXNoKCdjYXJldC1kb3duJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWV0ZXIoaWNvbk5hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoa2V5ID09PSAnZW50ZXInIHx8IGtleSA9PT0gJyAnKSB7XG4gICAgICB0aGlzLnNvcnRCeUNvbHVtbihjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzb3J0QnlDb2x1bW4oY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSAmJiBjb2x1bW4uaXNTb3J0YWJsZSkge1xuICAgICAgdGhpcy5jdXJyZW50U29ydEZpZWxkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICBmaWVsZFNlbGVjdG9yOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWUsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgICAgIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbi5maWVsZCAmJlxuICAgICAgICAgICAgICBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcjogY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgIGRlc2NlbmRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb3J0RmllbGRDaGFuZ2UuZW1pdChzZWxlY3Rvcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQubmV4dChzZWxlY3Rvcik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb24oY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbkZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgICAgOiAnYXNjJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFyaWFTb3J0RGlyZWN0aW9uKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjZW5kaW5nJ1xuICAgICAgICAgICAgOiAnYXNjZW5kaW5nJ1xuICAgICAgICAgIDogY29sdW1uLmlzU29ydGFibGVcbiAgICAgICAgICA/ICdub25lJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uRmllbGQgPyAndmlzaWJsZScgOiAnaGlkZGVuJztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZCkucGlwZShcbiAgICAgIG1hcCgodmlzaWJpbGl0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSAnaGlkZGVuJztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk11bHRpc2VsZWN0Q2hlY2tib3hDaGFuZ2UoKSB7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2hlY2tib3hDaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbkhlYWRpbmcoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlKSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5Nb2RlbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkKSB8fFxuICAgICAgICAoY2hhbmdlLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5oZWFkaW5nID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSW5saW5lSGVscFBvcG92ZXIoXG4gICAgY2hhbmdlOiBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZVxuICApIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY2hhbmdlLmlkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmlkID09PSBjb2x1bW4uaWQpIHx8XG4gICAgICAgIChjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb3VuZENvbHVtbk1vZGVsKSB7XG4gICAgICBmb3VuZENvbHVtbk1vZGVsLmlubGluZUhlbHBQb3BvdmVyID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlOiBTa3lHcmlkQ29sdW1uRGVzY3JpcHRpb25Nb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCkgfHxcbiAgICAgICAgKGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuZGVzY3JpcHRpb24gPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiB7XG4gICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB2b2lkO1xuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkO1xuICAgIHBhZ2VYPzogbnVtYmVyO1xuICB9KTogdm9pZCB7XG4gICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiByZXNpemVkLCBpbml0aWFsaXplIGFsbCB0aGUgcmVzaXplIHdpZHRocy5cbiAgICBpZiAoIXRoaXMuaXNSZXNpemVkKSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5XaWR0aHMoKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQpO1xuXG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gdHJ1ZTtcbiAgICB0aGlzLnhQb3NTdGFydCA9IGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG5cbiAgICAvLyBTaG93IHZpc3VhbCBpbmRpY2F0b3Igb2Ygd2hlcmUgbW91c2UgaXMgZHJhZ2dpbmcgKHJlc2l6ZUJhcikuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihldmVudC5wYWdlWCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbW91c2VNb3ZlRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICBjb25zdCB0b3VjaE1vdmVFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNobW92ZScpO1xuXG4gICAgbWVyZ2UobW91c2VNb3ZlRXZlbnQsIHRvdWNoTW92ZUV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG1vdmVFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVNb3ZlKG1vdmVFdmVudCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IG1vdXNlVXBFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcbiAgICBjb25zdCB0b3VjaEVuZEV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKTtcblxuICAgIG1lcmdlKG1vdXNlVXBFdmVudCwgdG91Y2hFbmRFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGU7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlbmRFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVSZWxlYXNlKGVuZEV2ZW50KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93blJlc2l6ZUNvbChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcmVzaXplZCwgaW5pdGlhbGl6ZSBhbGwgdGhlIHJlc2l6ZSB3aWR0aHMuXG4gICAgaWYgKCF0aGlzLmlzUmVzaXplZCkge1xuICAgICAgdGhpcy5pbml0Q29sdW1uV2lkdGhzKCk7XG4gICAgICB0aGlzLmlzUmVzaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlUmVzaXplQ29sKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBOdW1iZXIoaW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IGRlbHRhWCA9IG5ld1ZhbHVlIC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgIHRoaXMucmVzaXplQ29sdW1uQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4LCBuZXdWYWx1ZSwgZGVsdGFYKTtcbiAgICBjb25zdCBsZWZ0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGxlZnQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy54UG9zU3RhcnQ7XG4gICAgY29uc3QgbmV3Q29sV2lkdGggPSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggKyBkZWx0YVg7XG5cbiAgICBpZiAobmV3Q29sV2lkdGggPD0gdGhpcy5taW5Db2xXaWR0aCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gdGhpcy5nZXRNYXhSYW5nZUJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnICYmIG5ld0NvbFdpZHRoID4gbWF4KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGV2ZW50LnBhZ2VYKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVGb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgbGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24obGVmdCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVSZWxlYXNlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQucGFnZVggLSB0aGlzLnhQb3NTdGFydDtcbiAgICBjb25zdCBuZXdDb2xXaWR0aCA9IHRoaXMuc3RhcnRDb2x1bW5XaWR0aCArIGRlbHRhWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCwgbmV3Q29sV2lkdGgsIGRlbHRhWCk7XG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dDbGljayhldmVudDogYW55LCBzZWxlY3RlZEl0ZW06IExpc3RJdGVtTW9kZWwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmVuYWJsZU11bHRpc2VsZWN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fFxuICAgICAgICAhdGhpcy5pc0ludGVyYWN0aXZlRWxlbWVudChldmVudClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZCA9ICFzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuUm93Q2xpY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5yb3dIaWdobGlnaHRlZElkKSB7XG4gICAgICByZXR1cm4gaWQgPT09IHRoaXMucm93SGlnaGxpZ2h0ZWRJZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0hlaWdodChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkQWRhcHRlci5nZXRSb3dIZWlnaHQodGhpcy50YWJsZUVsZW1lbnRSZWYsIGluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxSb3dEZWxldGUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IGlkXG4gICAgKTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNhbmNlbC5lbWl0KHsgaWQ6IGlkIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IGlkKS5wZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpcm0uZW1pdCh7IGlkOiBpZCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dEZWxldGVJdGVtKGlkOiBzdHJpbmcpOiBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoKHJvd0RlbGV0ZSkgPT4gcm93RGVsZXRlLmlkID09PSBpZCk7XG4gIH1cblxuICAvLyBQcmV2ZW50IHRvdWNoIGRldmljZXMgZnJvbSBpbmFkdmVydGVudGx5IHNjcm9sbGluZyBncmlkIHdoaWxlIGRyYWdnaW5nIGNvbHVtbnMuXG4gIHB1YmxpYyBvblRvdWNoTW92ZShldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvcFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRyaWdnZXJlZCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPVxuICAgICAgICAgIHRoaXMudG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uR3JpZFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxUcmlnZ2VyZWQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dUb3BTY3JvbGwgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGV0IGNvbHVtbnNXaWR0aFRvdGFsID0gMDtcbiAgICAgIGNvbnN0IHdpbmRvd1NpemUgPSB0aGlzLnNreVdpbmRvdy5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zaG93VG9wU2Nyb2xsKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb2wubmF0aXZlRWxlbWVudCkud2lkdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gY29sLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggfHwgb2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICB0aGlzLm1pbkNvbFdpZHRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2x1bW5zV2lkdGhUb3RhbCA9IGNvbHVtbnNXaWR0aFRvdGFsICsgd2lkdGg7XG4gICAgICAgICAgaWYgKGNvbHVtbnNXaWR0aFRvdGFsID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VG9wU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpc2VsZWN0U2VsZWN0QWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5TZWxlY3RBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdENsZWFyQWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2xlYXJBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSB7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlNlbGVjdEFsbDpcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdEFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQ2xlYXJBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDbGVhckFsbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlByb21wdERlbGV0ZVJvdzpcbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdykge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0NvbmZpZykge1xuICAgICAgICAgICAgZXhpc3RpbmdDb25maWcucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkLFxuICAgICAgICAgICAgICBwZW5kaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgICAgICAgZW5hYmxlU2Nyb2xsOiB0cnVlLFxuICAgICAgICAgICAgICBzaG93QmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICAgICAgICBlbmFibGVQb2ludGVyRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG92ZXJsYXkuYXR0YWNoVGVtcGxhdGUodGhpcy5pbmxpbmVEZWxldGVUZW1wbGF0ZVJlZiwge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuZGF0YS5maW5kKFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXZSBhcmUgbWFudWFsbHkgc2V0dGluZyB0aGUgei1pbmRleCBoZXJlIGJlY2F1c2Ugb3ZlcmxheXMgd2lsbCBhbHdheXMgYmUgb24gdG9wIG9mXG4gICAgICAgICAgICAgKiB0aGUgb21uaWJhci4gVGhpcyBtYW51YWwgc2V0dGluZyBpcyAxIGxlc3MgdGhhbiB0aGUgb21uaWJhcidzIHotaW5kZXggb2YgMTAwMC4gV2VcbiAgICAgICAgICAgICAqIGRpc2N1c3NlZCBjaGFuZ2luZyB0aGUgb3ZlcmxheSBzZXJ2aWNlIHRvIGFsbG93IGZvciB0aGlzIGJ1dCBkZWNpZGVkIGFnYWluc3QgdGhhdFxuICAgICAgICAgICAgICogY2hhbmdlIGF0IHRoaXMgdGltZSBkdWUgdG8gaXRzIG5pY2hlIG5hdHVyZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gJzk5OSc7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmxpbmVEZWxldGVSZWYgPSB0aGlzLmlubGluZURlbGV0ZVJlZnNcbiAgICAgICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoKGVsUmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmlkID09PVxuICAgICAgICAgICAgICAgICAgICAncm93LWRlbGV0ZS1yZWYtJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKGlubGluZURlbGV0ZVJlZik7XG5cbiAgICAgICAgICAgICAgY29uc3Qgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICdbc2t5LWNtcC1pZD1cIicgKyBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkICsgJ1wiXSdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZF0gPSB7XG4gICAgICAgICAgICAgICAgYWZmaXhlcjogYWZmaXhlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUobWVzc2FnZS5kYXRhLmFib3J0RGVsZXRlUm93LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb25IZWFkZXJEcm9wKG5ld0NvbHVtbklkczogQXJyYXk8c3RyaW5nPikge1xuICAgIC8vIHVwZGF0ZSBzZWxlY3RlZCBjb2x1bW5JZHNcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzU2V0ID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gbmV3Q29sdW1uSWRzO1xuXG4gICAgLy8gbWFyayBmb3IgY2hlY2sgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kub25QdXNoXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGlzcGxheWVkQ29sdW1ucyhyZXNwZWN0SGlkZGVuOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gc2V0dXAgZGlzcGxheWVkIGNvbHVtbnNcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbklkc1xuICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZClbMF07XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BlY3RIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICFjb2x1bW4uaGlkZGVuO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgLy8gVHJhbnNmb3JtIGRhdGEgaW50byBvYmplY3Qgd2l0aCBpZCBhbmQgZGF0YSBwcm9wZXJ0aWVzXG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhICYmXG4gICAgICB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5kYXRhWzBdLmlkICYmXG4gICAgICAhdGhpcy5kYXRhWzBdLmRhdGFcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Um93SWQpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZ2V0R3JpZERhdGFXaXRoU2VsZWN0ZWRSb3dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4gbmV3IExpc3RJdGVtTW9kZWwoaXRlbS5pZCwgaXRlbSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZERhdGFXaXRoU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGxldCBjaGVja2VkO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCB0aGlzLm11bHRpc2VsZWN0Um93SWQpKSB7XG4gICAgICAgIGNoZWNrZWQgPSBzZWxlY3RlZFJvd3MuaW5kZXhPZihpdGVtW3RoaXMubXVsdGlzZWxlY3RSb3dJZF0pID4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja2VkID0gc2VsZWN0ZWRSb3dzLmluZGV4T2YoaXRlbS5pZCkgPiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTGlzdEl0ZW1Nb2RlbChpdGVtLmlkLCBpdGVtLCBjaGVja2VkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRSb3dJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLml0ZW1zW2ldLmlzU2VsZWN0ZWQgPVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaW5kZXhPZih0aGlzLml0ZW1zW2ldLmlkKSA+IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZC5uZXh0KFxuICAgICAgdGhpcy5zb3J0RmllbGQgfHwgeyBmaWVsZFNlbGVjdG9yOiAnJywgZGVzY2VuZGluZzogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbnNGcm9tQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcblxuICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgY29sdW1ucyBoYXZlIHJlbmRlcmVkIGluIHRoZSBncmlkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5CeUluZGV4KFxuICAgIGNvbHVtbkluZGV4OiBzdHJpbmcsXG4gICAgbmV3Q29sV2lkdGg6IG51bWJlcixcbiAgICBkZWx0YVg6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk1vZGVsQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBQcmV2ZW50IGFjY2lkZW50YWwgc2hyaW5rYWdlIGJlbG93IG1pbmltdW0gd2lkdGguXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGRlbHRhWCA9IGRlbHRhWCArIHRoaXMubWluQ29sV2lkdGggLSBuZXdDb2xXaWR0aDtcbiAgICAgIG5ld0NvbFdpZHRoID0gdGhpcy5taW5Db2xXaWR0aDtcbiAgICB9XG5cbiAgICAvLyBmaXQ9d2lkdGggYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIGxhc3QgY29sdW1uXG4gICAgLy8gZml0PXNjcm9sbCBhZGRzL3JlbW92ZXMgd2lkdGggZnJvbSB0aGUgdGFibGVcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcpIHtcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB0aGlzLmdldExhc3REaXNwbGF5ZWRDb2x1bW4oKTtcblxuICAgICAgLy8gUHJldmVudCBhY2NpZGVudGFsIGdyb3d0aCB0aGF0IHdvdWxkIGJ1bXAgbGFzdCBjb2x1bW4gb2ZmIHNjcmVlbi5cbiAgICAgIGNvbnN0IG1heCA9IHRoaXMuZ2V0TWF4UmFuZ2VCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICAgIGlmIChuZXdDb2xXaWR0aCA+IG1heCkge1xuICAgICAgICBuZXdDb2xXaWR0aCA9IG1heDtcbiAgICAgICAgZGVsdGFYID0gbWF4IC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgICAgfVxuICAgICAgY29sdW1uLndpZHRoID0gbmV3Q29sV2lkdGg7XG4gICAgICBsYXN0Q29sdW1uLndpZHRoID0gbGFzdENvbHVtbi53aWR0aCAtIGRlbHRhWDtcbiAgICAgIHRoaXMudXBkYXRlTWF4UmFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aCArIGRlbHRhWH1weGBcbiAgICAgICk7XG4gICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2xXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmNvbHVtbldpZHRoQ2hhbmdlLmVtaXQodGhpcy5nZXRDb2x1bW5XaWR0aE1vZGVsQ2hhbmdlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29sdW1uV2lkdGhzKCkge1xuICAgIC8vIEVzdGFibGlzaCB0YWJsZSB3aWR0aC5cbiAgICB0aGlzLnNob3dUb3BTY3JvbGwgPSB0cnVlO1xuXG4gICAgLy8gU2V0IGNvbHVtbiB3aWR0aHMgYmFzZWQgb24gdGhlIHdpZHRoIGluaXRpYWxseSBnaXZlbiBieSB0aGUgYnJvd3Nlci5cbiAgICAvLyBjb21wdXRlZFdpZHRoIHByZXZlbnRzIGFjY2lkZW50YWwgb3ZlcmZsb3cgZm9yIGJyb3dzZXJzIHdpdGggc3ViLXBpeGVsIHdpZHRocy5cbiAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkV2lkdGggPSBwYXJzZUZsb2F0KFxuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb2wubmF0aXZlRWxlbWVudCkud2lkdGhcbiAgICAgICk7XG4gICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGNvbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4KS53aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICBjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLm1pbkNvbFdpZHRoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gJ3Njcm9sbCcgdGFibGVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGFuZCBvdXRzaWRlIG9mIHRoZWlyIGNvbnN0cmFpbnRzLlxuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3Njcm9sbCcpIHtcbiAgICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsZW1lbnRSZWYsICdtaW4td2lkdGgnLCAnYXV0bycpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtYXggbGltaXRzIGZvciBpbnB1dCByYW5nZXMuXG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heFJhbmdlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZmVyQ29sdW1uV2lkdGhzKFxuICAgIG9sZENvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdLFxuICAgIG5ld0NvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdXG4gICkge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKG9sZENvbHVtbnMgJiYgbmV3Q29sdW1ucykge1xuICAgICAgZm9yIChjb25zdCBvbGRDb2x1bW4gb2Ygb2xkQ29sdW1ucykge1xuICAgICAgICBpZiAob2xkQ29sdW1uLndpZHRoKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdDb2x1bW4gPSBuZXdDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgICAobmV3Q29sdW1uKSA9PiBvbGRDb2x1bW4uaWQgPT09IG5ld0NvbHVtbi5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nQ29sdW1uICYmICFtYXRjaGluZ0NvbHVtbi53aWR0aCkge1xuICAgICAgICAgICAgbWF0Y2hpbmdDb2x1bW4ud2lkdGggPSBvbGRDb2x1bW4ud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSB7XG4gICAgY29uc3QgY29sdW1uV2lkdGhNb2RlbENoYW5nZSA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT4oKTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW5XaWR0aE1vZGVsQ2hhbmdlLnB1c2goe1xuICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1heFJhbmdlKCkge1xuICAgIGNvbnN0IGxlZnRvdmVyV2lkdGggPVxuICAgICAgdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCkud2lkdGggLSB0aGlzLm1pbkNvbFdpZHRoO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXhSYW5nZSA9IGNvbHVtbi53aWR0aCArIGxlZnRvdmVyV2lkdGg7XG4gICAgICBjb25zdCByYW5nZUlucHV0ID0gdGhpcy5nZXRSYW5nZUlucHV0QnlJbmRleChpbmRleCk7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQubWF4ID0gbmV3TWF4UmFuZ2U7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgbmV3TWF4UmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4ID0gY2xpY2tUYXJnZXQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4Jyk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgdGhpcy5zdGFydENvbHVtbldpZHRoID0gY29sdW1uLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYmxlV2lkdGgoKSB7XG4gICAgdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYGF1dG9gKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aH1weGBcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VJbnB1dEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJhbmdlSW5wdXRFbGVtZW50UmVmcy5maW5kKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleC50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zW051bWJlcihpbmRleCldO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXhSYW5nZUJ5SW5kZXgoaW5kZXg6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbHVtbkVsZW1lbnRSZWYgPSB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZpbmQoXG4gICAgICAodGgpID0+IHRoLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4JykgPT09IGluZGV4XG4gICAgKTtcbiAgICBjb25zdCByYW5nZUlucHV0ID0gY29sdW1uRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1ncmlkLWNvbHVtbi1pbnB1dC1hcmlhLW9ubHknXG4gICAgKTtcbiAgICByZXR1cm4gTnVtYmVyKHJhbmdlSW5wdXQubWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdERpc3BsYXllZENvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWxpbWV0ZXIodGV4dDogc3RyaW5nW10sIGRlbGltaXRlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHQuZmlsdGVyKCh2YWwpID0+IHZhbCkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Um93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb3dEZWxldGVDb250ZW50cyA9IHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJvd0RlbGV0ZUNvbnRlbnRzKSB7XG4gICAgICByb3dEZWxldGVDb250ZW50cy5hZmZpeGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuY2xvc2Uocm93RGVsZXRlQ29udGVudHMub3ZlcmxheSk7XG4gICAgICBkZWxldGUgdGhpcy5yb3dEZWxldGVDb250ZW50c1tpZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0ZWRSb3dzKHNvdXJjZTogU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogU2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlID0ge1xuICAgICAgc2VsZWN0ZWRSb3dJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCksXG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICB9O1xuICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgIH0pXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXRlbS5kYXRhLCB0aGlzLm11bHRpc2VsZWN0Um93SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBpdGVtLmRhdGFbdGhpcy5tdWx0aXNlbGVjdFJvd0lkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ludGVyYWN0aXZlRWxlbWVudChldmVudDogYW55KTogYW55IHtcbiAgICBjb25zdCBpbnRlcmFjdGl2ZUVsU2VsZWN0b3JzID0gYFxuICAgICAgYSxcbiAgICAgIGJ1dHRvbixcbiAgICAgIGlucHV0LFxuICAgICAgbGFiZWwsXG4gICAgICBvcHRpb24sXG4gICAgICBzZWxlY3QsXG4gICAgICB0ZXh0YXJlYSxcbiAgICAgIGRldGFpbHMsXG4gICAgICBkaWFsb2csXG4gICAgICBtZW51LFxuICAgICAgbWVudWl0ZW0sXG4gICAgICBzdW1tYXJ5YDtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoaW50ZXJhY3RpdmVFbFNlbGVjdG9ycyk7XG4gIH1cblxuICBwcml2YXRlIHNldFJlc2l6ZUJhclBvc2l0aW9uKHhQb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsID0gdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHJlc2l6ZUJhclggPVxuICAgICAgeFBvc2l0aW9uIC1cbiAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG4gICAgICBwYXJlbnRTY3JvbGw7XG4gICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnJlc2l6ZUJhciwgJ2xlZnQnLCByZXNpemVCYXJYICsgJ3B4Jyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VXNlckNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAgIC5nZXRDb25maWcodGhpcy5zZXR0aW5nc0tleSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAoY29uZmlnOiBTa3lHcmlkVUlDb25maWcpID0+IHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGNvbHVtbklkcyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBjdXJyZW50IGRhdGEgc2V0LlxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gY29uZmlnLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoaWQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBpZClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckNvbmZpZyhjb25maWc6IFNreUdyaWRVSUNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5nc0tleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAuc2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXksIGNvbmZpZylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZ3JpZCBzZXR0aW5ncy4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdENvbHVtbnMoKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb2x1bW5Db21wb25lbnRzLmxlbmd0aCAhPT0gMCB8fCB0aGlzLmNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8vIFdhdGNoIGZvciBhZGRlZC9yZW1vdmVkIGNvbHVtbnM6XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNvbHVtbkNvbXBvbmVudHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVDb2x1bW5zKCkpXG4gICAgKTtcblxuICAgIC8vIFdhdGNoIGZvciBjb2x1bW4gaGVhZGluZyBjaGFuZ2VzOlxuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5mb3JFYWNoKChjb21wOiBTa3lHcmlkQ29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5oZWFkaW5nTW9kZWxDaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbkhlYWRpbmcoY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5kZXNjcmlwdGlvbk1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5pbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFycmF5c0VxdWFsKGFycmF5QTogYW55W10sIGFycmF5QjogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXJyYXlBLmxlbmd0aCA9PT0gYXJyYXlCLmxlbmd0aCAmJlxuICAgICAgYXJyYXlBLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheUJbaW5kZXhdKVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJza3ktZ3JpZFwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93VG9wU2Nyb2xsXCJcbiAgICBjbGFzcz1cInNreS1ncmlkLXRvcC1zY3JvbGwtY29udGFpbmVyXCJcbiAgICAoc2Nyb2xsKT1cIm9uVG9wU2Nyb2xsKCRldmVudClcIlxuICAgICN0b3BTY3JvbGxDb250YWluZXJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2t5LWdyaWQtdG9wLXNjcm9sbFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0VG9wU2Nyb2xsV2lkdGgoKVwiXG4gICAgPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWdyaWQtdGFibGUtY29udGFpbmVyXCJcbiAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlaWdodFwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICAoc2Nyb2xsKT1cIm9uR3JpZFNjcm9sbCgkZXZlbnQpXCJcbiAgICAjZ3JpZENvbnRhaW5lclxuICA+XG4gICAgPHRhYmxlIGNsYXNzPVwic2t5LWdyaWQtdGFibGVcIiBbbmdDbGFzc109XCJnZXRUYWJsZUNsYXNzTmFtZXMoKVwiICNncmlkVGFibGU+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0ciBbZHJhZ3VsYV09XCJkcmFndWxhR3JvdXBOYW1lXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAqbmdJZj1cImVuYWJsZU11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZyBza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwibWluQ29sV2lkdGhcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgIHt7ICdza3l1eF9ncmlkX211bHRpc2VsZWN0X3NlbGVjdF9yb3cnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIGRpc3BsYXllZENvbHVtbnM7XG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdDtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZyBza3ktZmllbGQtbGFiZWxcIlxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnREaXJlY3Rpb24oY29sdW1uKSB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtpZF09XCInc2t5LWdyaWQtJyArIGdyaWRJZCArICctY29sdW1uLScgKyBpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidza3ktZ3JpZC1jb2x1bW4tYWxpZ25tZW50LScgKyBjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3RhYkluZGV4XT1cImNvbHVtbi5pc1NvcnRhYmxlID8gMCA6IC0xXCJcbiAgICAgICAgICAgIChtb3VzZXVwKT1cInNvcnRCeUNvbHVtbihjb2x1bW4pXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJvblRvdWNoTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICNncmlkQ29sXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGFibGVIZWFkZXJDbGFzc05hbWVzKGNvbHVtbilcIlxuICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbi53aWR0aCAtIDFcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uLndpZHRoIC0gMVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbi5maWVsZCkgfCBhc3luYykgPT09ICdoaWRkZW4nXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRlci1jYXJldC1oaWRkZW4tc3BhY2luZ1wiXG4gICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgIDwhLS0gVGhlIG5vIHNwYWNpbmcgaGVyZSBpcyBpbnRlbnRpb25hbCB0byBhdm9pZCBleHRyYSBzcGFjZXMgZHVlIHRvIHRoZXNlIGJlaW5nIGlubGluZSBlbGVtZW50cyAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJza3ktZ3JpZC1oZWFkZXItdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgY29sdW1uLmhlYWRpbmc/LnRyaW0oKVxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNreS1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkaW5nLXNvcnRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgJ3NreS1ncmlkLWhlYWRpbmctc29ydC0nICtcbiAgICAgICAgICAgICAgICAgIChnZXRDYXJldFZpc2liaWxpdHkoY29sdW1uLmZpZWxkKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0Q2FyZXRJY29uTmFtZXMoY29sdW1uKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgICAgICAgPHNreS1oZWxwLWlubGluZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVscC1pbmxpbmUtc29ydC1oaWRkZW4nOlxuICAgICAgICAgICAgICAgICAgICBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uLmZpZWxkKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3NreVBvcG92ZXJdPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9za3ktaGVscC1pbmxpbmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiKGZpdCA9PT0gJ3dpZHRoJyAmJiAhbGFzdCkgfHwgZml0ID09PSAnc2Nyb2xsJ1wiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIldpZHRoIG9mIGNvbHVtblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtY29sdW1uLWlucHV0LWFyaWEtb25seVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJzbGlkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidza3ktZ3JpZC0nICsgZ3JpZElkICsgJy1jb2x1bW4tJyArIGlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWluXT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCJtYXhDb2xXaWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgW21pbl09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFttYXhdPVwibWF4Q29sV2lkdGhcIlxuICAgICAgICAgICAgICBbc3RlcF09XCJjb2x1bW5SZXNpemVTdGVwXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvblJlc2l6ZUhhbmRsZUJsdXIoKVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvblJlc2l6ZUhhbmRsZUZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd25SZXNpemVDb2woJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZVJlc2l6ZUNvbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgI2NvbFNpemVSYW5nZVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInNreS1ncmlkLXRib2R5XCI+XG4gICAgICAgIDx0clxuICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcm93XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzUm93SGlnaGxpZ2h0ZWQoaXRlbS5pZCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc2t5LWdyaWQtbXVsdGlzZWxlY3Qtc2VsZWN0ZWQtcm93JzogaXRlbS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgJ3NreS1ncmlkLW11bHRpc2VsZWN0LXJvdyc6IGVuYWJsZU11bHRpc2VsZWN0LFxuICAgICAgICAgICAgJ3NreS1ncmlkLXJvdy1oaWdobGlnaHQnOiBpc1Jvd0hpZ2hsaWdodGVkKGl0ZW0uaWQpXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3NreS1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWNlbGxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3NreS1ncmlkLWNvbHVtbi1hbGlnbm1lbnQtJyArIGNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNreS1ncmlkLWNlbGxcbiAgICAgICAgICAgICAgW3NreUhpZ2hsaWdodF09XCJcbiAgICAgICAgICAgICAgICAhY29sdW1uLmV4Y2x1ZGVGcm9tSGlnaGxpZ2h0aW5nID8gaGlnaGxpZ2h0VGV4dCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLnRlbXBsYXRlIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbZmllbGRTZWxlY3Rvcl09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW2NvbHVtbklkXT1cImNvbHVtbi5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NreS1ncmlkLWNlbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNob3dSZXNpemVCYXJcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGlkPVwic2t5LWdyaWQtcmVzaXplLWJhclwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICNyZXNpemVCYXJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj57e1xuICB2YWx1ZVxufX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LWl0ZW0gI2lubGluZURlbGV0ZVRlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgW2lkXT1cIidyb3ctZGVsZXRlLXJlZi0nICsgaXRlbS5pZFwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgaGVpZ2h0OiBnZXRSb3dIZWlnaHQoMCksXG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHdpZHRoOiB0YWJsZVdpZHRoICsgJ3B4J1xuICAgIH1cIlxuICAgICNpbmxpbmVEZWxldGVSZWZcbiAgPlxuICAgIDxza3ktaW5saW5lLWRlbGV0ZVxuICAgICAgW3BlbmRpbmddPVwiZ2V0Um93RGVsZXRlSXRlbShpdGVtLmlkKS5wZW5kaW5nXCJcbiAgICAgIChjYW5jZWxUcmlnZ2VyZWQpPVwiY2FuY2VsUm93RGVsZXRlKGl0ZW0uaWQpXCJcbiAgICAgIChkZWxldGVUcmlnZ2VyZWQpPVwiY29uZmlybVJvd0RlbGV0ZShpdGVtLmlkKVwiXG4gICAgPjwvc2t5LWlubGluZS1kZWxldGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
1034
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxzQkFBc0IsR0FNdkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGFBQWEsR0FFZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsU0FBUyxFQUNULEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILElBQUksRUFDSixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFNekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUNB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QVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUduRCx3QkFBd0I7c0JBRC9CLFNBQVM7dUJBQUMsZUFBZTtnQkFHbEIsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxXQUFXO2dCQUdkLDRCQUE0QjtzQkFEbkMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBR3ZCLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsV0FBVztnQkE0SWYsY0FBYztzQkFEcEIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QXBwV2luZG93UmVmLFxuICBTa3lMb2dTZXJ2aWNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5VUlDb25maWdTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQge1xuICBMaXN0SXRlbU1vZGVsLFxuICBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbCxcbn0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBEcmFndWxhU2VydmljZSB9IGZyb20gJ25nMi1kcmFndWxhJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFrZVdoaWxlLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUdyaWRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vZ3JpZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWRlc2NyaXB0aW9uLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1oZWFkaW5nLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taW5saW5lLWhlbHAtcG9wb3Zlci1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLXdpZHRoLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlJztcbmltcG9ydCB7IFNreUdyaWRNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlLXR5cGUnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3MgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jYW5jZWwtYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29uZmlnJztcbmltcG9ydCB7IFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncyB9IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29udGVudHMgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb250ZW50cyc7XG5pbXBvcnQgeyBTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1zZWxlY3RlZC1yb3dzLXNvdXJjZSc7XG5pbXBvcnQgeyBTa3lHcmlkVUlDb25maWcgfSBmcm9tICcuL3R5cGVzL2dyaWQtdWktY29uZmlnJztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgYFNreUdyaWRDb21wb25lbnRgIGFuZCBpdHMgZmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgZGF0YSBncmlkIGluc3RlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2RhdGEtZ3JpZFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRHJhZ3VsYVNlcnZpY2VdLFxuICBwcm92aWRlcnM6IFtTa3lHcmlkQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5R3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIENvbHVtbnMgYW5kIGNvbHVtbiBwcm9wZXJ0aWVzIGZvciB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29sdW1ucyhuZXdDb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+KSB7XG4gICAgY29uc3Qgb2xkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcbiAgICBpZiAob2xkQ29sdW1ucykge1xuICAgICAgdGhpcy50cmFuc2ZlckNvbHVtbldpZHRocyhvbGRDb2x1bW5zLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgdGhpcy5pc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmb3IgdGhlIGdyaWQuIEVhY2ggaXRlbSByZXF1aXJlcyBhbiBgaWRgIGFuZCBhIHByb3BlcnR5IHRoYXQgbWFwc1xuICAgKiB0byB0aGUgYGZpZWxkYCBvciBgaWRgIHByb3BlcnR5IG9mIGVhY2ggY29sdW1uIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRhdGE6IEFycmF5PGFueT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBtdWx0aXNlbGVjdCBmZWF0dXJlIHRvIGRpc3BsYXkgYSBjb2x1bW4gb2ZcbiAgICogY2hlY2tib3hlcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBncmlkLiBZb3UgY2FuIHNwZWNpZnkgYSB1bmlxdWUgSUQgd2l0aFxuICAgKiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5LCBidXQgbXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb25cbiAgICogdGhlIGBkYXRhYCBvYmplY3QuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlTXVsdGlzZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogSG93IHRoZSBncmlkIGZpdHMgdG8gaXRzIHBhcmVudC4gVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGB3aWR0aGAsXG4gICAqIHdoaWNoIGZpdHMgdGhlIGdyaWQgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGgsIGFuZCBgc2Nyb2xsYCwgd2hpY2ggYWxsb3dzIHRoZSBncmlkXG4gICAqIHRvIGV4Y2VlZCB0aGUgcGFyZW50J3Mgd2lkdGguIElmIHRoZSBncmlkIGRvZXMgbm90IGhhdmUgZW5vdWdoIGNvbHVtbnMgdG8gZmlsbFxuICAgKiB0aGUgcGFyZW50J3Mgd2lkdGgsIGl0IGFsd2F5cyBzdHJldGNoZXMgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGguXG4gICAqIEBkZWZhdWx0IFwid2lkdGhcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpdCA9ICd3aWR0aCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2l0aCB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNUb29sYmFyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gaGlnaGxpZ2h0IHdpdGhpbiB0aGUgZ3JpZC5cbiAgICogVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzZWFyY2guXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlnaGxpZ2h0VGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YWJsZSB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IG1hdGNoZXMgYSBwcm9wZXJ0eSBvbiB0aGUgYGRhdGFgIG9iamVjdC5cbiAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSB1c2VzIHRoZSBgaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG11bHRpc2VsZWN0Um93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3cgdG8gaGlnaGxpZ2h0LiBUaGUgSUQgbWF0Y2hlcyB0aGUgYGlkYCBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgYGRhdGFgIG9iamVjdC4gVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiB0aGUgZmx5b3V0IGNvbXBvbmVudCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dIaWdobGlnaHRlZElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQgYmFzZWQgb24gdGhlIGBpZGAgb3IgYGZpZWxkYCBwcm9wZXJ0aWVzXG4gICAqIG9mIHRoZSBjb2x1bW5zLiBJZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIGdyaWQgZGlzcGxheXMgYWxsIGNvbHVtbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkQ29sdW1uSWRzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgY29uc3QgY3VycmVudElkcyA9IHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnMoKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaWRzIGhhdmUgY2hhbmdlZC5cbiAgICBpZiAoIWN1cnJlbnRJZHMgfHwgIXZhbHVlIHx8ICF0aGlzLmFycmF5c0VxdWFsKHZhbHVlLCBjdXJyZW50SWRzKSkge1xuICAgICAgLy8gVGhpcyB2YXJpYWJsZSBlbnN1cmVzIHRoYXQgd2UgZG8gbm90IHNldCB1c2VyIGNvbmZpZyBvcHRpb25zIG9yIGZpcmUgdGhlIGNoYW5nZSBldmVudFxuICAgICAgLy8gb24gdGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgY29sdW1ucyBhcmUgc2V0IHVwXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkc1NldCkge1xuICAgICAgICB0aGlzLnNldFVzZXJDb25maWcoe1xuICAgICAgICAgIHNlbGVjdGVkQ29sdW1uSWRzOiB2YWx1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc0NoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzKTtcblxuICAgICAgICBpZiAodGhpcy5pc1Jlc2l6ZWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0VGFibGVXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc1NldCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ29sdW1uSWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0IG9mIElEcyBmb3IgdGhlIHJvd3MgdG8gc2VsZWN0IGluIGEgbXVsdGlzZWxlY3QgZ3JpZC5cbiAgICogVGhlIElEcyBtYXRjaCB0aGUgYGlkYCBwcm9wZXJ0aWVzIG9mIHRoZSBgZGF0YWAgb2JqZWN0cy5cbiAgICogUm93cyB3aXRoIElEcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlIGRlLXNlbGVjdGVkIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZFJvd0lkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlNlbGVjdGVkUm93SWRzQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93SWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJvd0lkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGtleSBmb3IgdGhlIFVJIENvbmZpZyBTZXJ2aWNlIHRvIHJldHJpZXZlIHN0b3JlZCBzZXR0aW5ncyBmcm9tIGEgZGF0YWJhc2UuXG4gICAqIFRoZSBVSSBDb25maWcgU2VydmljZSBzYXZlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB1c2VycyBhbmQgcmV0dXJuc1xuICAgKiBgc2VsZWN0ZWRDb2x1bW5JZHNgIHRvIHByZXNlcnZlIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgYW5kIHRoZSBwcmVmZXJyZWQgY29sdW1uIG9yZGVyLiBZb3UgIG11c3QgcHJvdmlkZSBgaWRgIHZhbHVlcyBmb3IgeW91ciBgc2t5LWdyaWQtY29sdW1uYCBlbGVtZW50cyBiZWNhdXNlIHRoZSBVSSBDb25maWcgU2VydmljZSBkZXBlbmRzIG9uIHRob3NlIHZhbHVlcyB0byBvcmdhbml6ZSBjb2x1bW5zIGJhc2VkIG9uIHVzZXIgc2V0dGluZ3MuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBVSSBDb25maWcgU2VydmljZSwgc2VlIFt0aGUgc3RpY2t5IHNldHRpbmdzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vZ2V0LXN0YXJ0ZWQvc3RpY2t5LXNldHRpbmdzKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXR0aW5nc0tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIGNhcmV0IGluIHRoZSBjb2x1bW4gdGhhdCB3YXMgdXNlZCB0byBzb3J0IHRoZSBncmlkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWxcbiAgICogd2hlbiB5b3UgcHJvZ3JhbW1hdGljYWxseSBzb3J0IGRhdGEgYW5kIHdhbnQgdG8gdmlzdWFsbHkgaW5kaWNhdGUgaG93IHRoZSBncmlkIHdhcyBzb3J0ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBhIGBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbGAgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqIC0gYGZpZWxkU2VsZWN0b3JgIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc29ydCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBzdHJpbmdgIHZhbHVlcy5cbiAgICogLSBgZGVzY2VuZGluZ2AgSW5kaWNhdGVzIHdoZXRoZXIgdG8gc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLiBUaGUgY2FyZXQgdGhhdCB2aXN1YWxseVxuICAgKiBpbmRpY2F0ZXMgdGhlIHNvcnQgb3JkZXIgcG9pbnRzIGRvd24gZm9yIGRlc2NlbmRpbmcgb3JkZXIgYW5kIHVwIGZvciBhc2NlbmRpbmcgb3JkZXIuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBgYm9vbGVhbmAgdmFsdWVzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkOiBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbDtcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBncmlkIGluIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB3aWR0aCBvZiBhIGNvbHVtbiBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2x1bW5XaWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgQXJyYXk8U2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2U+XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgc2VsZWN0aW9uIG9mIG11bHRpc2VsZWN0IGNoZWNrYm94ZXMgY2hhbmdlcy5cbiAgICogRW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgc2VsZWN0ZWQgcm93cyBiYXNlZCBvbiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5XG4gICAqIHRoYXQgdGhlIGNvbnN1bWVyIHByb3ZpZGVzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcm93RGVsZXRlQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkUm93RGVsZXRlQ2FuY2VsQXJncz4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGNoYW5nZSBvciB3aGVuIHRoZSBvcmRlciBvZiB0aGUgY29sdW1ucyBjaGFuZ2VzLlxuICAgKiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdCByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYWN0aXZlIHNvcnQgZmllbGQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oKTtcblxuICBwdWJsaWMgY29sdW1uUmVzaXplU3RlcCA9IDEwO1xuICBwdWJsaWMgY3VycmVudFNvcnRGaWVsZDogQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPjtcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnM6IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD47XG4gIHB1YmxpYyBkcmFndWxhR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBncmlkSWQ6IG51bWJlciA9ICsrbmV4dElkO1xuICBwdWJsaWMgcm93RGVsZXRlQ29uZmlnczogU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZ1tdID0gW107XG4gIHB1YmxpYyBpdGVtczogQXJyYXk8YW55PjtcbiAgcHVibGljIG1heENvbFdpZHRoID0gOTk5OTsgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLCBhcyB0aGUgaW5wdXQgcmFuZ2UgcGlja2VyIHdvbid0IHdvcmsgd2l0aG91dCBhIHZhbHVlLlxuICBwdWJsaWMgbWluQ29sV2lkdGggPSA1MDtcbiAgcHVibGljIHNob3dSZXNpemVCYXIgPSBmYWxzZTtcbiAgcHVibGljIHNob3dUb3BTY3JvbGwgPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IHRhYmxlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreUdyaWRDb2x1bW5Db21wb25lbnQpXG4gIHByaXZhdGUgY29sdW1uQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUdyaWRDb2x1bW5Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRDb2wnKVxuICBwcml2YXRlIGNvbHVtbkVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2NvbFNpemVSYW5nZScpXG4gIHByaXZhdGUgY29sdW1uUmFuZ2VJbnB1dEVsZW1lbnRSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2lubGluZURlbGV0ZVJlZicpXG4gIHByaXZhdGUgaW5saW5lRGVsZXRlUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZicsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHJpdmF0ZSBpbmxpbmVEZWxldGVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInKVxuICBwcml2YXRlIHRhYmxlQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZ3JpZFRhYmxlJylcbiAgcHJpdmF0ZSB0YWJsZUVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RvcFNjcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgdG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmVzaXplQmFyJylcbiAgcHJpdmF0ZSByZXNpemVCYXI6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBhY3RpdmVSZXNpemVDb2x1bW5JbmRleDogc3RyaW5nO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByb3dEZWxldGVDb250ZW50czogeyBbaWQ6IHN0cmluZ106IFNreUdyaWRSb3dEZWxldGVDb250ZW50cyB9ID0ge307XG4gIHByaXZhdGUgc3RhcnRDb2x1bW5XaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgc2Nyb2xsVHJpZ2dlcmVkID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB4UG9zU3RhcnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+O1xuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZmZpeFNlcnZpY2U6IFNreUFmZml4U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGRyYWd1bGFTZXJ2aWNlOiBEcmFndWxhU2VydmljZSxcbiAgICBwcml2YXRlIGdyaWRBZGFwdGVyOiBTa3lHcmlkQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogU2t5T3ZlcmxheVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBza3lXaW5kb3c6IFNreUFwcFdpbmRvd1JlZixcbiAgICBwcml2YXRlIHVpQ29uZmlnU2VydmljZTogU2t5VUlDb25maWdTZXJ2aWNlLFxuICAgIGxvZ2dlcjogU2t5TG9nU2VydmljZVxuICApIHtcbiAgICBsb2dnZXIuZGVwcmVjYXRlZCgnU2t5R3JpZENvbXBvbmVudCcsIHtcbiAgICAgIGRlcHJlY2F0aW9uTWFqb3JWZXJzaW9uOiA2LFxuICAgICAgbW9yZUluZm9Vcmw6ICdodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvZGF0YS1ncmlkJyxcbiAgICAgIHJlcGxhY2VtZW50UmVjb21tZW5kYXRpb246ICdVc2UgZGF0YSBncmlkIGluc3RlYWQuJyxcbiAgICB9KTtcblxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+KCk7XG4gICAgdGhpcy5pdGVtcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oe1xuICAgICAgZmllbGRTZWxlY3RvcjogJycsXG4gICAgICBkZXNjZW5kaW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmRyYWd1bGFHcm91cE5hbWUgPSBgc2t5LWdyaWRzLWdyb3VwLSR7dGhpcy5ncmlkSWR9YDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VTdHJlYW1cbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogU2t5R3JpZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzS2V5KSB7XG4gICAgICB0aGlzLmFwcGx5VXNlckNvbmZpZygpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRDb2x1bW5zKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGNvbHVtbiBkcmFnLWFuZC1kcm9wLlxuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuaW5pdGlhbGl6ZURyYWdBbmREcm9wKFxuICAgICAgdGhpcy5kcmFndWxhR3JvdXBOYW1lLFxuICAgICAgdGhpcy5kcmFndWxhU2VydmljZSxcbiAgICAgIChzZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPikgPT4ge1xuICAgICAgICB0aGlzLm9uSGVhZGVyRHJvcChzZWxlY3RlZENvbHVtbklkcyk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmRhdGEgJiYgdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcblxuICAgICAgLy8gVGhpcyBzZXQgdGltZW91dCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBkYXRhIGhhcyByZW5kZXJlZCBpbiB0aGUgZ3JpZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgY2xlYW5zIHVwIGFueSBsaW5nZXJpbmcgcm93IGRlbGV0ZXMgZm9yIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMucm93RGVsZXRlQ29udGVudHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcm93cyByZS1yZW5kZXIgdGh1cyBtZXNzaW5nIHVwIHRoZSBhZmZpeGVycy4gV2UgbXVzdCByZWFmZml4IHRoZW0gc28gdGhhdCB0aGluZ3NcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHJlbmRlciBjb3JyZWN0bHkuXG4gICAgICAgICAgICBjb25zdCByb3dFbGVtZW50OiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnW3NreS1jbXAtaWQ9XCInICsgaWQgKyAnXCJdJ1xuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXS5hZmZpeGVyLmFmZml4VG8ocm93RWxlbWVudCwge1xuICAgICAgICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlbWVudDogJ2Fib3ZlJyxcbiAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnQ6ICd0b3AnLFxuICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgIGVuYWJsZUF1dG9GaXQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuc29ydEZpZWxkKSB7XG4gICAgICB0aGlzLnNldFNvcnRIZWFkZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZS5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMucm93RGVsZXRlQ29udGVudHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kcmFndWxhU2VydmljZS5kZXN0cm95KHRoaXMuZHJhZ3VsYUdyb3VwTmFtZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9wU2Nyb2xsV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWJsZUNsYXNzTmFtZXMoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmZpdCAhPT0gJ3Njcm9sbCcpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtZml0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzVG9vbGJhcikge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1oYXMtdG9vbGJhcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltaXRlcihjbGFzc05hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIGdldFRhYmxlSGVhZGVyQ2xhc3NOYW1lcyhjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5sb2NrZWQpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtaGVhZGVyLWxvY2tlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltaXRlcihjbGFzc05hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIGdldENhcmV0SWNvbk5hbWVzKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgY29uc3QgaWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKGNvbHVtbi5maWVsZCkuc3Vic2NyaWJlKChzb3J0RGlyKSA9PiB7XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2FzYycpIHtcbiAgICAgICAgaWNvbk5hbWVzLnB1c2goJ2NhcmV0LXVwJyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydERpciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIGljb25OYW1lcy5wdXNoKCdjYXJldC1kb3duJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWl0ZXIoaWNvbk5hbWVzLCAnICcpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoa2V5ID09PSAnZW50ZXInIHx8IGtleSA9PT0gJyAnKSB7XG4gICAgICB0aGlzLnNvcnRCeUNvbHVtbihjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzb3J0QnlDb2x1bW4oY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSAmJiBjb2x1bW4uaXNTb3J0YWJsZSkge1xuICAgICAgdGhpcy5jdXJyZW50U29ydEZpZWxkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICBmaWVsZFNlbGVjdG9yOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWUsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgICAgIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbi5maWVsZCAmJlxuICAgICAgICAgICAgICBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcjogY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICAgIGRlc2NlbmRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb3J0RmllbGRDaGFuZ2UuZW1pdChzZWxlY3Rvcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQubmV4dChzZWxlY3Rvcik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb24oY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbkZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgICAgOiAnYXNjJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFyaWFTb3J0RGlyZWN0aW9uKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjZW5kaW5nJ1xuICAgICAgICAgICAgOiAnYXNjZW5kaW5nJ1xuICAgICAgICAgIDogY29sdW1uLmlzU29ydGFibGVcbiAgICAgICAgICA/ICdub25lJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uRmllbGQgPyAndmlzaWJsZScgOiAnaGlkZGVuJztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZCkucGlwZShcbiAgICAgIG1hcCgodmlzaWJpbGl0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSAnaGlkZGVuJztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk11bHRpc2VsZWN0Q2hlY2tib3hDaGFuZ2UoKSB7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2hlY2tib3hDaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbkhlYWRpbmcoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlKSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5Nb2RlbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkKSB8fFxuICAgICAgICAoY2hhbmdlLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5oZWFkaW5nID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSW5saW5lSGVscFBvcG92ZXIoXG4gICAgY2hhbmdlOiBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZVxuICApIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY2hhbmdlLmlkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmlkID09PSBjb2x1bW4uaWQpIHx8XG4gICAgICAgIChjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb3VuZENvbHVtbk1vZGVsKSB7XG4gICAgICBmb3VuZENvbHVtbk1vZGVsLmlubGluZUhlbHBQb3BvdmVyID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlOiBTa3lHcmlkQ29sdW1uRGVzY3JpcHRpb25Nb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCkgfHxcbiAgICAgICAgKGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuZGVzY3JpcHRpb24gPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiB7XG4gICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB2b2lkO1xuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkO1xuICAgIHBhZ2VYPzogbnVtYmVyO1xuICB9KTogdm9pZCB7XG4gICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiByZXNpemVkLCBpbml0aWFsaXplIGFsbCB0aGUgcmVzaXplIHdpZHRocy5cbiAgICBpZiAoIXRoaXMuaXNSZXNpemVkKSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5XaWR0aHMoKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQpO1xuXG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gdHJ1ZTtcbiAgICB0aGlzLnhQb3NTdGFydCA9IGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG5cbiAgICAvLyBTaG93IHZpc3VhbCBpbmRpY2F0b3Igb2Ygd2hlcmUgbW91c2UgaXMgZHJhZ2dpbmcgKHJlc2l6ZUJhcikuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihldmVudC5wYWdlWCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbW91c2VNb3ZlRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICBjb25zdCB0b3VjaE1vdmVFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNobW92ZScpO1xuXG4gICAgbWVyZ2UobW91c2VNb3ZlRXZlbnQsIHRvdWNoTW92ZUV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG1vdmVFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVNb3ZlKG1vdmVFdmVudCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IG1vdXNlVXBFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcbiAgICBjb25zdCB0b3VjaEVuZEV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKTtcblxuICAgIG1lcmdlKG1vdXNlVXBFdmVudCwgdG91Y2hFbmRFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGU7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlbmRFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVSZWxlYXNlKGVuZEV2ZW50KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93blJlc2l6ZUNvbChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcmVzaXplZCwgaW5pdGlhbGl6ZSBhbGwgdGhlIHJlc2l6ZSB3aWR0aHMuXG4gICAgaWYgKCF0aGlzLmlzUmVzaXplZCkge1xuICAgICAgdGhpcy5pbml0Q29sdW1uV2lkdGhzKCk7XG4gICAgICB0aGlzLmlzUmVzaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlUmVzaXplQ29sKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBOdW1iZXIoaW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IGRlbHRhWCA9IG5ld1ZhbHVlIC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgIHRoaXMucmVzaXplQ29sdW1uQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4LCBuZXdWYWx1ZSwgZGVsdGFYKTtcbiAgICBjb25zdCBsZWZ0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGxlZnQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy54UG9zU3RhcnQ7XG4gICAgY29uc3QgbmV3Q29sV2lkdGggPSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggKyBkZWx0YVg7XG5cbiAgICBpZiAobmV3Q29sV2lkdGggPD0gdGhpcy5taW5Db2xXaWR0aCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gdGhpcy5nZXRNYXhSYW5nZUJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnICYmIG5ld0NvbFdpZHRoID4gbWF4KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGV2ZW50LnBhZ2VYKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVGb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgbGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24obGVmdCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVSZWxlYXNlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQucGFnZVggLSB0aGlzLnhQb3NTdGFydDtcbiAgICBjb25zdCBuZXdDb2xXaWR0aCA9IHRoaXMuc3RhcnRDb2x1bW5XaWR0aCArIGRlbHRhWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCwgbmV3Q29sV2lkdGgsIGRlbHRhWCk7XG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dDbGljayhldmVudDogYW55LCBzZWxlY3RlZEl0ZW06IExpc3RJdGVtTW9kZWwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmVuYWJsZU11bHRpc2VsZWN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fFxuICAgICAgICAhdGhpcy5pc0ludGVyYWN0aXZlRWxlbWVudChldmVudClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZCA9ICFzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuUm93Q2xpY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5yb3dIaWdobGlnaHRlZElkKSB7XG4gICAgICByZXR1cm4gaWQgPT09IHRoaXMucm93SGlnaGxpZ2h0ZWRJZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0hlaWdodChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkQWRhcHRlci5nZXRSb3dIZWlnaHQodGhpcy50YWJsZUVsZW1lbnRSZWYsIGluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxSb3dEZWxldGUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IGlkXG4gICAgKTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNhbmNlbC5lbWl0KHsgaWQ6IGlkIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IGlkKS5wZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpcm0uZW1pdCh7IGlkOiBpZCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dEZWxldGVJdGVtKGlkOiBzdHJpbmcpOiBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoKHJvd0RlbGV0ZSkgPT4gcm93RGVsZXRlLmlkID09PSBpZCk7XG4gIH1cblxuICAvLyBQcmV2ZW50IHRvdWNoIGRldmljZXMgZnJvbSBpbmFkdmVydGVudGx5IHNjcm9sbGluZyBncmlkIHdoaWxlIGRyYWdnaW5nIGNvbHVtbnMuXG4gIHB1YmxpYyBvblRvdWNoTW92ZShldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvcFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRyaWdnZXJlZCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPVxuICAgICAgICAgIHRoaXMudG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uR3JpZFNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxUcmlnZ2VyZWQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dUb3BTY3JvbGwgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMgJiZcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGV0IGNvbHVtbnNXaWR0aFRvdGFsID0gMDtcbiAgICAgIGNvbnN0IHdpbmRvd1NpemUgPSB0aGlzLnNreVdpbmRvdy5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zaG93VG9wU2Nyb2xsKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb2wubmF0aXZlRWxlbWVudCkud2lkdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gY29sLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggfHwgb2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICB0aGlzLm1pbkNvbFdpZHRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2x1bW5zV2lkdGhUb3RhbCA9IGNvbHVtbnNXaWR0aFRvdGFsICsgd2lkdGg7XG4gICAgICAgICAgaWYgKGNvbHVtbnNXaWR0aFRvdGFsID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VG9wU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpc2VsZWN0U2VsZWN0QWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5TZWxlY3RBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdENsZWFyQWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2xlYXJBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSB7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlNlbGVjdEFsbDpcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdEFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQ2xlYXJBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDbGVhckFsbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlByb21wdERlbGV0ZVJvdzpcbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdykge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0NvbmZpZykge1xuICAgICAgICAgICAgZXhpc3RpbmdDb25maWcucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkLFxuICAgICAgICAgICAgICBwZW5kaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgICAgICAgZW5hYmxlU2Nyb2xsOiB0cnVlLFxuICAgICAgICAgICAgICBzaG93QmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICAgICAgICBlbmFibGVQb2ludGVyRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG92ZXJsYXkuYXR0YWNoVGVtcGxhdGUodGhpcy5pbmxpbmVEZWxldGVUZW1wbGF0ZVJlZiwge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuZGF0YS5maW5kKFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXZSBhcmUgbWFudWFsbHkgc2V0dGluZyB0aGUgei1pbmRleCBoZXJlIGJlY2F1c2Ugb3ZlcmxheXMgd2lsbCBhbHdheXMgYmUgb24gdG9wIG9mXG4gICAgICAgICAgICAgKiB0aGUgb21uaWJhci4gVGhpcyBtYW51YWwgc2V0dGluZyBpcyAxIGxlc3MgdGhhbiB0aGUgb21uaWJhcidzIHotaW5kZXggb2YgMTAwMC4gV2VcbiAgICAgICAgICAgICAqIGRpc2N1c3NlZCBjaGFuZ2luZyB0aGUgb3ZlcmxheSBzZXJ2aWNlIHRvIGFsbG93IGZvciB0aGlzIGJ1dCBkZWNpZGVkIGFnYWluc3QgdGhhdFxuICAgICAgICAgICAgICogY2hhbmdlIGF0IHRoaXMgdGltZSBkdWUgdG8gaXRzIG5pY2hlIG5hdHVyZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gJzk5OSc7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmxpbmVEZWxldGVSZWYgPSB0aGlzLmlubGluZURlbGV0ZVJlZnNcbiAgICAgICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoKGVsUmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmlkID09PVxuICAgICAgICAgICAgICAgICAgICAncm93LWRlbGV0ZS1yZWYtJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKGlubGluZURlbGV0ZVJlZik7XG5cbiAgICAgICAgICAgICAgY29uc3Qgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICdbc2t5LWNtcC1pZD1cIicgKyBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkICsgJ1wiXSdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZF0gPSB7XG4gICAgICAgICAgICAgICAgYWZmaXhlcjogYWZmaXhlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUobWVzc2FnZS5kYXRhLmFib3J0RGVsZXRlUm93LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb25IZWFkZXJEcm9wKG5ld0NvbHVtbklkczogQXJyYXk8c3RyaW5nPikge1xuICAgIC8vIHVwZGF0ZSBzZWxlY3RlZCBjb2x1bW5JZHNcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzU2V0ID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gbmV3Q29sdW1uSWRzO1xuXG4gICAgLy8gbWFyayBmb3IgY2hlY2sgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kub25QdXNoXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGlzcGxheWVkQ29sdW1ucyhyZXNwZWN0SGlkZGVuOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gc2V0dXAgZGlzcGxheWVkIGNvbHVtbnNcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbklkc1xuICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZClbMF07XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BlY3RIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICFjb2x1bW4uaGlkZGVuO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgLy8gVHJhbnNmb3JtIGRhdGEgaW50byBvYmplY3Qgd2l0aCBpZCBhbmQgZGF0YSBwcm9wZXJ0aWVzXG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhICYmXG4gICAgICB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5kYXRhWzBdLmlkICYmXG4gICAgICAhdGhpcy5kYXRhWzBdLmRhdGFcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Um93SWQpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZ2V0R3JpZERhdGFXaXRoU2VsZWN0ZWRSb3dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4gbmV3IExpc3RJdGVtTW9kZWwoaXRlbS5pZCwgaXRlbSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZERhdGFXaXRoU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGxldCBjaGVja2VkO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCB0aGlzLm11bHRpc2VsZWN0Um93SWQpKSB7XG4gICAgICAgIGNoZWNrZWQgPSBzZWxlY3RlZFJvd3MuaW5kZXhPZihpdGVtW3RoaXMubXVsdGlzZWxlY3RSb3dJZF0pID4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja2VkID0gc2VsZWN0ZWRSb3dzLmluZGV4T2YoaXRlbS5pZCkgPiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTGlzdEl0ZW1Nb2RlbChpdGVtLmlkLCBpdGVtLCBjaGVja2VkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZWxlY3RlZFJvd3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRSb3dJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLml0ZW1zW2ldLmlzU2VsZWN0ZWQgPVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaW5kZXhPZih0aGlzLml0ZW1zW2ldLmlkKSA+IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZC5uZXh0KFxuICAgICAgdGhpcy5zb3J0RmllbGQgfHwgeyBmaWVsZFNlbGVjdG9yOiAnJywgZGVzY2VuZGluZzogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbnNGcm9tQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcblxuICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgY29sdW1ucyBoYXZlIHJlbmRlcmVkIGluIHRoZSBncmlkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5CeUluZGV4KFxuICAgIGNvbHVtbkluZGV4OiBzdHJpbmcsXG4gICAgbmV3Q29sV2lkdGg6IG51bWJlcixcbiAgICBkZWx0YVg6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk1vZGVsQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBQcmV2ZW50IGFjY2lkZW50YWwgc2hyaW5rYWdlIGJlbG93IG1pbmltdW0gd2lkdGguXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGRlbHRhWCA9IGRlbHRhWCArIHRoaXMubWluQ29sV2lkdGggLSBuZXdDb2xXaWR0aDtcbiAgICAgIG5ld0NvbFdpZHRoID0gdGhpcy5taW5Db2xXaWR0aDtcbiAgICB9XG5cbiAgICAvLyBmaXQ9d2lkdGggYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIGxhc3QgY29sdW1uXG4gICAgLy8gZml0PXNjcm9sbCBhZGRzL3JlbW92ZXMgd2lkdGggZnJvbSB0aGUgdGFibGVcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcpIHtcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB0aGlzLmdldExhc3REaXNwbGF5ZWRDb2x1bW4oKTtcblxuICAgICAgLy8gUHJldmVudCBhY2NpZGVudGFsIGdyb3d0aCB0aGF0IHdvdWxkIGJ1bXAgbGFzdCBjb2x1bW4gb2ZmIHNjcmVlbi5cbiAgICAgIGNvbnN0IG1heCA9IHRoaXMuZ2V0TWF4UmFuZ2VCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICAgIGlmIChuZXdDb2xXaWR0aCA+IG1heCkge1xuICAgICAgICBuZXdDb2xXaWR0aCA9IG1heDtcbiAgICAgICAgZGVsdGFYID0gbWF4IC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgICAgfVxuICAgICAgY29sdW1uLndpZHRoID0gbmV3Q29sV2lkdGg7XG4gICAgICBsYXN0Q29sdW1uLndpZHRoID0gbGFzdENvbHVtbi53aWR0aCAtIGRlbHRhWDtcbiAgICAgIHRoaXMudXBkYXRlTWF4UmFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aCArIGRlbHRhWH1weGBcbiAgICAgICk7XG4gICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2xXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmNvbHVtbldpZHRoQ2hhbmdlLmVtaXQodGhpcy5nZXRDb2x1bW5XaWR0aE1vZGVsQ2hhbmdlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29sdW1uV2lkdGhzKCkge1xuICAgIC8vIEVzdGFibGlzaCB0YWJsZSB3aWR0aC5cbiAgICB0aGlzLnNob3dUb3BTY3JvbGwgPSB0cnVlO1xuXG4gICAgLy8gU2V0IGNvbHVtbiB3aWR0aHMgYmFzZWQgb24gdGhlIHdpZHRoIGluaXRpYWxseSBnaXZlbiBieSB0aGUgYnJvd3Nlci5cbiAgICAvLyBjb21wdXRlZFdpZHRoIHByZXZlbnRzIGFjY2lkZW50YWwgb3ZlcmZsb3cgZm9yIGJyb3dzZXJzIHdpdGggc3ViLXBpeGVsIHdpZHRocy5cbiAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkV2lkdGggPSBwYXJzZUZsb2F0KFxuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb2wubmF0aXZlRWxlbWVudCkud2lkdGhcbiAgICAgICk7XG4gICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGNvbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4KS53aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICBjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLm1pbkNvbFdpZHRoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gJ3Njcm9sbCcgdGFibGVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGFuZCBvdXRzaWRlIG9mIHRoZWlyIGNvbnN0cmFpbnRzLlxuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3Njcm9sbCcpIHtcbiAgICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsZW1lbnRSZWYsICdtaW4td2lkdGgnLCAnYXV0bycpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtYXggbGltaXRzIGZvciBpbnB1dCByYW5nZXMuXG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heFJhbmdlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZmVyQ29sdW1uV2lkdGhzKFxuICAgIG9sZENvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdLFxuICAgIG5ld0NvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdXG4gICkge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKG9sZENvbHVtbnMgJiYgbmV3Q29sdW1ucykge1xuICAgICAgZm9yIChjb25zdCBvbGRDb2x1bW4gb2Ygb2xkQ29sdW1ucykge1xuICAgICAgICBpZiAob2xkQ29sdW1uLndpZHRoKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdDb2x1bW4gPSBuZXdDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgICAobmV3Q29sdW1uKSA9PiBvbGRDb2x1bW4uaWQgPT09IG5ld0NvbHVtbi5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nQ29sdW1uICYmICFtYXRjaGluZ0NvbHVtbi53aWR0aCkge1xuICAgICAgICAgICAgbWF0Y2hpbmdDb2x1bW4ud2lkdGggPSBvbGRDb2x1bW4ud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSB7XG4gICAgY29uc3QgY29sdW1uV2lkdGhNb2RlbENoYW5nZSA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT4oKTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW5XaWR0aE1vZGVsQ2hhbmdlLnB1c2goe1xuICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1heFJhbmdlKCkge1xuICAgIGNvbnN0IGxlZnRvdmVyV2lkdGggPVxuICAgICAgdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCkud2lkdGggLSB0aGlzLm1pbkNvbFdpZHRoO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXhSYW5nZSA9IGNvbHVtbi53aWR0aCArIGxlZnRvdmVyV2lkdGg7XG4gICAgICBjb25zdCByYW5nZUlucHV0ID0gdGhpcy5nZXRSYW5nZUlucHV0QnlJbmRleChpbmRleCk7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQubWF4ID0gbmV3TWF4UmFuZ2U7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgbmV3TWF4UmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4ID0gY2xpY2tUYXJnZXQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4Jyk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgdGhpcy5zdGFydENvbHVtbldpZHRoID0gY29sdW1uLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYmxlV2lkdGgoKSB7XG4gICAgdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYGF1dG9gKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aH1weGBcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VJbnB1dEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJhbmdlSW5wdXRFbGVtZW50UmVmcy5maW5kKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleC50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zW051bWJlcihpbmRleCldO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXhSYW5nZUJ5SW5kZXgoaW5kZXg6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbHVtbkVsZW1lbnRSZWYgPSB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZpbmQoXG4gICAgICAodGgpID0+IHRoLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4JykgPT09IGluZGV4XG4gICAgKTtcbiAgICBjb25zdCByYW5nZUlucHV0ID0gY29sdW1uRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1ncmlkLWNvbHVtbi1pbnB1dC1hcmlhLW9ubHknXG4gICAgKTtcbiAgICByZXR1cm4gTnVtYmVyKHJhbmdlSW5wdXQubWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdERpc3BsYXllZENvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWxpbWl0ZXIodGV4dDogc3RyaW5nW10sIGRlbGltaXRlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHQuZmlsdGVyKCh2YWwpID0+IHZhbCkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Um93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb3dEZWxldGVDb250ZW50cyA9IHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJvd0RlbGV0ZUNvbnRlbnRzKSB7XG4gICAgICByb3dEZWxldGVDb250ZW50cy5hZmZpeGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuY2xvc2Uocm93RGVsZXRlQ29udGVudHMub3ZlcmxheSk7XG4gICAgICBkZWxldGUgdGhpcy5yb3dEZWxldGVDb250ZW50c1tpZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0ZWRSb3dzKHNvdXJjZTogU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogU2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlID0ge1xuICAgICAgc2VsZWN0ZWRSb3dJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCksXG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICB9O1xuICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgIH0pXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXRlbS5kYXRhLCB0aGlzLm11bHRpc2VsZWN0Um93SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBpdGVtLmRhdGFbdGhpcy5tdWx0aXNlbGVjdFJvd0lkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ludGVyYWN0aXZlRWxlbWVudChldmVudDogYW55KTogYW55IHtcbiAgICBjb25zdCBpbnRlcmFjdGl2ZUVsU2VsZWN0b3JzID0gYFxuICAgICAgYSxcbiAgICAgIGJ1dHRvbixcbiAgICAgIGlucHV0LFxuICAgICAgbGFiZWwsXG4gICAgICBvcHRpb24sXG4gICAgICBzZWxlY3QsXG4gICAgICB0ZXh0YXJlYSxcbiAgICAgIGRldGFpbHMsXG4gICAgICBkaWFsb2csXG4gICAgICBtZW51LFxuICAgICAgbWVudWl0ZW0sXG4gICAgICBzdW1tYXJ5YDtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoaW50ZXJhY3RpdmVFbFNlbGVjdG9ycyk7XG4gIH1cblxuICBwcml2YXRlIHNldFJlc2l6ZUJhclBvc2l0aW9uKHhQb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsID0gdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHJlc2l6ZUJhclggPVxuICAgICAgeFBvc2l0aW9uIC1cbiAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG4gICAgICBwYXJlbnRTY3JvbGw7XG4gICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnJlc2l6ZUJhciwgJ2xlZnQnLCByZXNpemVCYXJYICsgJ3B4Jyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VXNlckNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAgIC5nZXRDb25maWcodGhpcy5zZXR0aW5nc0tleSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAoY29uZmlnOiBTa3lHcmlkVUlDb25maWcpID0+IHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGNvbHVtbklkcyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBjdXJyZW50IGRhdGEgc2V0LlxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gY29uZmlnLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoaWQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBpZClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckNvbmZpZyhjb25maWc6IFNreUdyaWRVSUNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5nc0tleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAuc2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXksIGNvbmZpZylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZ3JpZCBzZXR0aW5ncy4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdENvbHVtbnMoKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb2x1bW5Db21wb25lbnRzLmxlbmd0aCAhPT0gMCB8fCB0aGlzLmNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8vIFdhdGNoIGZvciBhZGRlZC9yZW1vdmVkIGNvbHVtbnM6XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNvbHVtbkNvbXBvbmVudHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVDb2x1bW5zKCkpXG4gICAgKTtcblxuICAgIC8vIFdhdGNoIGZvciBjb2x1bW4gaGVhZGluZyBjaGFuZ2VzOlxuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5mb3JFYWNoKChjb21wOiBTa3lHcmlkQ29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5oZWFkaW5nTW9kZWxDaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbkhlYWRpbmcoY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5kZXNjcmlwdGlvbk1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5pbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFycmF5c0VxdWFsKGFycmF5QTogYW55W10sIGFycmF5QjogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXJyYXlBLmxlbmd0aCA9PT0gYXJyYXlCLmxlbmd0aCAmJlxuICAgICAgYXJyYXlBLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheUJbaW5kZXhdKVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJza3ktZ3JpZFwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93VG9wU2Nyb2xsXCJcbiAgICBjbGFzcz1cInNreS1ncmlkLXRvcC1zY3JvbGwtY29udGFpbmVyXCJcbiAgICAoc2Nyb2xsKT1cIm9uVG9wU2Nyb2xsKCRldmVudClcIlxuICAgICN0b3BTY3JvbGxDb250YWluZXJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2t5LWdyaWQtdG9wLXNjcm9sbFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0VG9wU2Nyb2xsV2lkdGgoKVwiXG4gICAgPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWdyaWQtdGFibGUtY29udGFpbmVyXCJcbiAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlaWdodFwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgICAoc2Nyb2xsKT1cIm9uR3JpZFNjcm9sbCgkZXZlbnQpXCJcbiAgICAjZ3JpZENvbnRhaW5lclxuICA+XG4gICAgPHRhYmxlIGNsYXNzPVwic2t5LWdyaWQtdGFibGVcIiBbbmdDbGFzc109XCJnZXRUYWJsZUNsYXNzTmFtZXMoKVwiICNncmlkVGFibGU+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0ciBbZHJhZ3VsYV09XCJkcmFndWxhR3JvdXBOYW1lXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAqbmdJZj1cImVuYWJsZU11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZyBza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwibWluQ29sV2lkdGhcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgIHt7ICdza3l1eF9ncmlkX211bHRpc2VsZWN0X3NlbGVjdF9yb3cnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIGRpc3BsYXllZENvbHVtbnM7XG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdDtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZyBza3ktZmllbGQtbGFiZWxcIlxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0QXJpYVNvcnREaXJlY3Rpb24oY29sdW1uKSB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtpZF09XCInc2t5LWdyaWQtJyArIGdyaWRJZCArICctY29sdW1uLScgKyBpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidza3ktZ3JpZC1jb2x1bW4tYWxpZ25tZW50LScgKyBjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3RhYkluZGV4XT1cImNvbHVtbi5pc1NvcnRhYmxlID8gMCA6IC0xXCJcbiAgICAgICAgICAgIChtb3VzZXVwKT1cInNvcnRCeUNvbHVtbihjb2x1bW4pXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJvblRvdWNoTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICNncmlkQ29sXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGFibGVIZWFkZXJDbGFzc05hbWVzKGNvbHVtbilcIlxuICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbi53aWR0aCAtIDFcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uLndpZHRoIC0gMVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbi5maWVsZCkgfCBhc3luYykgPT09ICdoaWRkZW4nXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRlci1jYXJldC1oaWRkZW4tc3BhY2luZ1wiXG4gICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgIDwhLS0gVGhlIG5vIHNwYWNpbmcgaGVyZSBpcyBpbnRlbnRpb25hbCB0byBhdm9pZCBleHRyYSBzcGFjZXMgZHVlIHRvIHRoZXNlIGJlaW5nIGlubGluZSBlbGVtZW50cyAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJza3ktZ3JpZC1oZWFkZXItdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgY29sdW1uLmhlYWRpbmc/LnRyaW0oKVxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNreS1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkaW5nLXNvcnRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgJ3NreS1ncmlkLWhlYWRpbmctc29ydC0nICtcbiAgICAgICAgICAgICAgICAgIChnZXRDYXJldFZpc2liaWxpdHkoY29sdW1uLmZpZWxkKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0Q2FyZXRJY29uTmFtZXMoY29sdW1uKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9za3ktaWNvbj5cbiAgICAgICAgICAgICAgPHNreS1oZWxwLWlubGluZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVscC1pbmxpbmUtc29ydC1oaWRkZW4nOlxuICAgICAgICAgICAgICAgICAgICBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uLmZpZWxkKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3NreVBvcG92ZXJdPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9za3ktaGVscC1pbmxpbmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiKGZpdCA9PT0gJ3dpZHRoJyAmJiAhbGFzdCkgfHwgZml0ID09PSAnc2Nyb2xsJ1wiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIldpZHRoIG9mIGNvbHVtblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtY29sdW1uLWlucHV0LWFyaWEtb25seVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJzbGlkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidza3ktZ3JpZC0nICsgZ3JpZElkICsgJy1jb2x1bW4tJyArIGlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWluXT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCJtYXhDb2xXaWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgW21pbl09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFttYXhdPVwibWF4Q29sV2lkdGhcIlxuICAgICAgICAgICAgICBbc3RlcF09XCJjb2x1bW5SZXNpemVTdGVwXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvblJlc2l6ZUhhbmRsZUJsdXIoKVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvblJlc2l6ZUhhbmRsZUZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd25SZXNpemVDb2woJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZVJlc2l6ZUNvbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgI2NvbFNpemVSYW5nZVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInNreS1ncmlkLXRib2R5XCI+XG4gICAgICAgIDx0clxuICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcm93XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzUm93SGlnaGxpZ2h0ZWQoaXRlbS5pZCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc2t5LWdyaWQtbXVsdGlzZWxlY3Qtc2VsZWN0ZWQtcm93JzogaXRlbS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgJ3NreS1ncmlkLW11bHRpc2VsZWN0LXJvdyc6IGVuYWJsZU11bHRpc2VsZWN0LFxuICAgICAgICAgICAgJ3NreS1ncmlkLXJvdy1oaWdobGlnaHQnOiBpc1Jvd0hpZ2hsaWdodGVkKGl0ZW0uaWQpXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3NreS1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWNlbGxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3NreS1ncmlkLWNvbHVtbi1hbGlnbm1lbnQtJyArIGNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNreS1ncmlkLWNlbGxcbiAgICAgICAgICAgICAgW3NreUhpZ2hsaWdodF09XCJcbiAgICAgICAgICAgICAgICAhY29sdW1uLmV4Y2x1ZGVGcm9tSGlnaGxpZ2h0aW5nID8gaGlnaGxpZ2h0VGV4dCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLnRlbXBsYXRlIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbZmllbGRTZWxlY3Rvcl09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW2NvbHVtbklkXT1cImNvbHVtbi5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NreS1ncmlkLWNlbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNob3dSZXNpemVCYXJcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGlkPVwic2t5LWdyaWQtcmVzaXplLWJhclwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICNyZXNpemVCYXJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj57e1xuICB2YWx1ZVxufX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LWl0ZW0gI2lubGluZURlbGV0ZVRlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgW2lkXT1cIidyb3ctZGVsZXRlLXJlZi0nICsgaXRlbS5pZFwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgaGVpZ2h0OiBnZXRSb3dIZWlnaHQoMCksXG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHdpZHRoOiB0YWJsZVdpZHRoICsgJ3B4J1xuICAgIH1cIlxuICAgICNpbmxpbmVEZWxldGVSZWZcbiAgPlxuICAgIDxza3ktaW5saW5lLWRlbGV0ZVxuICAgICAgW3BlbmRpbmddPVwiZ2V0Um93RGVsZXRlSXRlbShpdGVtLmlkKS5wZW5kaW5nXCJcbiAgICAgIChjYW5jZWxUcmlnZ2VyZWQpPVwiY2FuY2VsUm93RGVsZXRlKGl0ZW0uaWQpXCJcbiAgICAgIChkZWxldGVUcmlnZ2VyZWQpPVwiY29uZmlybVJvd0RlbGV0ZShpdGVtLmlkKVwiXG4gICAgPjwvc2t5LWlubGluZS1kZWxldGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1jb2x1bW4td2lkdGgtbW9kZWwtY2hhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2dyaWRzL3NyYy9saWIvbW9kdWxlcy9ncmlkL3R5cGVzL2dyaWQtY29sdW1uLXdpZHRoLW1vZGVsLWNoYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVwcmVjYXRlZCBgU2t5R3JpZENvbXBvbmVudGAgYW5kIGl0cyBmZWF0dXJlcyBhcmUgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBkYXRhIGdyaWQgaW5zdGVhZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvZGF0YS1ncmlkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBjb2x1bW4uXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpZWxkIG9mIHRoZSBjb2x1bW4uXG4gICAqL1xuICBmaWVsZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gaW4gcGl4ZWxzLlxuICAgKi9cbiAgd2lkdGg6IG51bWJlcjtcbn1cbiJdfQ==
|