@skyux/ag-grid 8.7.2 → 9.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/documentation.json +207 -207
- package/{esm2020 → esm2022}/lib/modules/ag-grid/ag-grid-adapter.service.mjs +8 -11
- package/esm2022/lib/modules/ag-grid/ag-grid-data-manager-adapter.directive.mjs +240 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/ag-grid-row-delete.component.mjs +6 -6
- package/esm2022/lib/modules/ag-grid/ag-grid-row-delete.directive.mjs +268 -0
- package/esm2022/lib/modules/ag-grid/ag-grid-wrapper.component.mjs +259 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/ag-grid.module.mjs +51 -51
- package/esm2022/lib/modules/ag-grid/ag-grid.service.mjs +457 -0
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-autocomplete/cell-editor-autocomplete.component.mjs +72 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-autocomplete/cell-editor-autocomplete.module.mjs +9 -9
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-currency/cell-editor-currency.component.mjs +95 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-currency/cell-editor-currency.module.mjs +9 -9
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-datepicker/cell-editor-datepicker.component.mjs +119 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-datepicker/cell-editor-datepicker.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-lookup/cell-editor-lookup.component.mjs +109 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-lookup/cell-editor-lookup.module.mjs +13 -13
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-number/cell-editor-number.component.mjs +77 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-number/cell-editor-number.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-editors/cell-editor-text/cell-editor-text.component.mjs +75 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-editors/cell-editor-text/cell-editor-text.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency-validator.component.mjs +42 -0
- package/esm2022/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency.component.mjs +49 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency.module.mjs +15 -15
- package/esm2022/lib/modules/ag-grid/cell-renderers/cell-renderer-lookup/cell-renderer-lookup.component.mjs +31 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-renderers/cell-renderer-lookup/cell-renderer-lookup.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-renderers/cell-renderer-row-selector/cell-renderer-row-selector.component.mjs +78 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-renderers/cell-renderer-row-selector/cell-renderer-row-selector.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-renderers/cell-renderer-validator-tooltip/cell-renderer-validator-tooltip.component.mjs +38 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-renderers/cell-renderer-validator-tooltip/cell-renderer-validator-tooltip.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/cell-validator/ag-grid-cell-validator-tooltip.component.mjs +88 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/cell-validator/ag-grid-cell-validator.module.mjs +5 -5
- package/esm2022/lib/modules/ag-grid/header/header-group.component.mjs +97 -0
- package/esm2022/lib/modules/ag-grid/header/header.component.mjs +144 -0
- package/{esm2020 → esm2022}/lib/modules/ag-grid/types/header-group-info.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/ag-grid/types/header-info.mjs +4 -4
- package/esm2022/lib/modules/shared/sky-ag-grid-resources.module.mjs +74 -0
- package/fesm2022/skyux-ag-grid.mjs +3025 -0
- package/fesm2022/skyux-ag-grid.mjs.map +1 -0
- package/lib/modules/ag-grid/ag-grid-data-manager-adapter.directive.d.ts +1 -1
- package/lib/modules/ag-grid/ag-grid-row-delete.directive.d.ts +1 -1
- package/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency-validator.component.d.ts +1 -1
- package/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency.component.d.ts +1 -1
- package/lib/modules/ag-grid/cell-renderers/cell-renderer-validator-tooltip/cell-renderer-validator-tooltip.component.d.ts +1 -1
- package/lib/modules/ag-grid/cell-validator/ag-grid-cell-validator-tooltip.component.d.ts +1 -1
- package/package.json +19 -25
- package/esm2020/lib/modules/ag-grid/ag-grid-data-manager-adapter.directive.mjs +0 -233
- package/esm2020/lib/modules/ag-grid/ag-grid-row-delete.directive.mjs +0 -264
- package/esm2020/lib/modules/ag-grid/ag-grid-wrapper.component.mjs +0 -247
- package/esm2020/lib/modules/ag-grid/ag-grid.service.mjs +0 -453
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-autocomplete/cell-editor-autocomplete.component.mjs +0 -75
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-currency/cell-editor-currency.component.mjs +0 -98
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-datepicker/cell-editor-datepicker.component.mjs +0 -122
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-lookup/cell-editor-lookup.component.mjs +0 -112
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-number/cell-editor-number.component.mjs +0 -80
- package/esm2020/lib/modules/ag-grid/cell-editors/cell-editor-text/cell-editor-text.component.mjs +0 -78
- package/esm2020/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency-validator.component.mjs +0 -45
- package/esm2020/lib/modules/ag-grid/cell-renderers/cell-renderer-currency/cell-renderer-currency.component.mjs +0 -52
- package/esm2020/lib/modules/ag-grid/cell-renderers/cell-renderer-lookup/cell-renderer-lookup.component.mjs +0 -34
- package/esm2020/lib/modules/ag-grid/cell-renderers/cell-renderer-row-selector/cell-renderer-row-selector.component.mjs +0 -80
- package/esm2020/lib/modules/ag-grid/cell-renderers/cell-renderer-validator-tooltip/cell-renderer-validator-tooltip.component.mjs +0 -41
- package/esm2020/lib/modules/ag-grid/cell-validator/ag-grid-cell-validator-tooltip.component.mjs +0 -90
- package/esm2020/lib/modules/ag-grid/header/header-group.component.mjs +0 -95
- package/esm2020/lib/modules/ag-grid/header/header.component.mjs +0 -141
- package/esm2020/lib/modules/shared/sky-ag-grid-resources.module.mjs +0 -74
- package/fesm2015/skyux-ag-grid.mjs +0 -2996
- package/fesm2015/skyux-ag-grid.mjs.map +0 -1
- package/fesm2020/skyux-ag-grid.mjs +0 -3012
- package/fesm2020/skyux-ag-grid.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/apply-lookup-properties-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/icons/icon-map.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/ag-grid-row-delete-cancel-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/ag-grid-row-delete-config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/ag-grid-row-delete-confirm-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/ag-grid-row-delete-contents.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/autocomplete-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-class.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-autocomplete-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-currency-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-datepicker-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-initial-action.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-lookup-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-number-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-text-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-editor-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-renderer-currency-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-renderer-lookup-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-renderer-validator-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/cell-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/currency-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/datepicker-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/header-class.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/header-group-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/header-params.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/lookup-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/number-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/sky-grid-options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/text-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/ag-grid/types/validator-properties.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-ag-grid.mjs +0 -0
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
var _SkyAgGridService_instances, _SkyAgGridService_keyMap, _SkyAgGridService_ngUnsubscribe, _SkyAgGridService_currentTheme, _SkyAgGridService_agGridAdapterService, _SkyAgGridService_resources, _SkyAgGridService_mergeGridOptions, _SkyAgGridService_getDefaultGridOptions, _SkyAgGridService_onCellFocused, _SkyAgGridService_getDefaultEditableGridOptions, _SkyAgGridService_dateFormatter, _SkyAgGridService_getIconTemplate, _SkyAgGridService_suppressTab, _SkyAgGridService_getRowHeight;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Injectable, Optional } from '@angular/core';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { takeUntil } from 'rxjs/operators';
|
|
6
|
-
import { applySkyLookupPropertiesDefaults } from './apply-lookup-properties-defaults';
|
|
7
|
-
import { SkyAgGridCellEditorAutocompleteComponent } from './cell-editors/cell-editor-autocomplete/cell-editor-autocomplete.component';
|
|
8
|
-
import { SkyAgGridCellEditorCurrencyComponent } from './cell-editors/cell-editor-currency/cell-editor-currency.component';
|
|
9
|
-
import { SkyAgGridCellEditorDatepickerComponent } from './cell-editors/cell-editor-datepicker/cell-editor-datepicker.component';
|
|
10
|
-
import { SkyAgGridCellEditorLookupComponent } from './cell-editors/cell-editor-lookup/cell-editor-lookup.component';
|
|
11
|
-
import { SkyAgGridCellEditorNumberComponent } from './cell-editors/cell-editor-number/cell-editor-number.component';
|
|
12
|
-
import { SkyAgGridCellEditorTextComponent } from './cell-editors/cell-editor-text/cell-editor-text.component';
|
|
13
|
-
import { SkyAgGridCellRendererCurrencyValidatorComponent } from './cell-renderers/cell-renderer-currency/cell-renderer-currency-validator.component';
|
|
14
|
-
import { SkyAgGridCellRendererCurrencyComponent } from './cell-renderers/cell-renderer-currency/cell-renderer-currency.component';
|
|
15
|
-
import { SkyAgGridCellRendererLookupComponent } from './cell-renderers/cell-renderer-lookup/cell-renderer-lookup.component';
|
|
16
|
-
import { SkyAgGridCellRendererRowSelectorComponent } from './cell-renderers/cell-renderer-row-selector/cell-renderer-row-selector.component';
|
|
17
|
-
import { SkyAgGridCellRendererValidatorTooltipComponent } from './cell-renderers/cell-renderer-validator-tooltip/cell-renderer-validator-tooltip.component';
|
|
18
|
-
import { SkyAgGridHeaderGroupComponent } from './header/header-group.component';
|
|
19
|
-
import { SkyAgGridHeaderComponent } from './header/header.component';
|
|
20
|
-
import { iconMap } from './icons/icon-map';
|
|
21
|
-
import { SkyCellClass } from './types/cell-class';
|
|
22
|
-
import { SkyCellType } from './types/cell-type';
|
|
23
|
-
import { SkyHeaderClass } from './types/header-class';
|
|
24
|
-
import * as i0 from "@angular/core";
|
|
25
|
-
import * as i1 from "./ag-grid-adapter.service";
|
|
26
|
-
import * as i2 from "@skyux/theme";
|
|
27
|
-
import * as i3 from "@skyux/i18n";
|
|
28
|
-
function autocompleteComparator(value1, value2) {
|
|
29
|
-
if (value1 && value2) {
|
|
30
|
-
if (value1.name > value2.name) {
|
|
31
|
-
return 1;
|
|
32
|
-
}
|
|
33
|
-
if (value1.name < value2.name) {
|
|
34
|
-
return -1;
|
|
35
|
-
}
|
|
36
|
-
return 0;
|
|
37
|
-
}
|
|
38
|
-
return value1 ? 1 : -1;
|
|
39
|
-
}
|
|
40
|
-
function autocompleteFormatter(params) {
|
|
41
|
-
return params.value && params.value.name;
|
|
42
|
-
}
|
|
43
|
-
function dateComparator(date1, date2) {
|
|
44
|
-
let date1value = date1;
|
|
45
|
-
let date2value = date2;
|
|
46
|
-
if (typeof date1value === 'string') {
|
|
47
|
-
date1value = new Date(date1);
|
|
48
|
-
}
|
|
49
|
-
if (typeof date2value === 'string') {
|
|
50
|
-
date2value = new Date(date2);
|
|
51
|
-
}
|
|
52
|
-
if (date1value && date2value) {
|
|
53
|
-
if (date1value > date2value) {
|
|
54
|
-
return 1;
|
|
55
|
-
}
|
|
56
|
-
if (date1value < date2value) {
|
|
57
|
-
return -1;
|
|
58
|
-
}
|
|
59
|
-
return 0;
|
|
60
|
-
}
|
|
61
|
-
return date1value ? 1 : -1;
|
|
62
|
-
}
|
|
63
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
-
function getValidatorCellRendererSelector(component, fallback) {
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
-
return (params) => {
|
|
67
|
-
if (params.colDef &&
|
|
68
|
-
typeof params.colDef.cellRendererParams?.skyComponentProperties
|
|
69
|
-
?.validator === 'function') {
|
|
70
|
-
if (!params.colDef.cellRendererParams.skyComponentProperties.validator(params.value, params.data, params.rowIndex)) {
|
|
71
|
-
return {
|
|
72
|
-
component,
|
|
73
|
-
params: {
|
|
74
|
-
...params.colDef.cellRendererParams,
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return fallback;
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
let rowNodeId = -1;
|
|
83
|
-
/**
|
|
84
|
-
* `SkyAgGridService` provides methods to get AG Grid `gridOptions` to ensure grids match SKY UX functionality. The `gridOptions` can be overridden, and include registered SKY UX column types.
|
|
85
|
-
*/
|
|
86
|
-
export class SkyAgGridService {
|
|
87
|
-
constructor(agGridAdapterService, themeSvc, resources) {
|
|
88
|
-
_SkyAgGridService_instances.add(this);
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
-
_SkyAgGridService_keyMap.set(this, new WeakMap());
|
|
91
|
-
_SkyAgGridService_ngUnsubscribe.set(this, new Subject());
|
|
92
|
-
_SkyAgGridService_currentTheme.set(this, undefined);
|
|
93
|
-
_SkyAgGridService_agGridAdapterService.set(this, void 0);
|
|
94
|
-
_SkyAgGridService_resources.set(this, void 0);
|
|
95
|
-
__classPrivateFieldSet(this, _SkyAgGridService_agGridAdapterService, agGridAdapterService, "f");
|
|
96
|
-
__classPrivateFieldSet(this, _SkyAgGridService_resources, resources, "f");
|
|
97
|
-
/*istanbul ignore else*/
|
|
98
|
-
if (themeSvc) {
|
|
99
|
-
themeSvc.settingsChange
|
|
100
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAgGridService_ngUnsubscribe, "f")))
|
|
101
|
-
.subscribe((settingsChange) => {
|
|
102
|
-
__classPrivateFieldSet(this, _SkyAgGridService_currentTheme, settingsChange.currentSettings, "f");
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
ngOnDestroy() {
|
|
107
|
-
__classPrivateFieldGet(this, _SkyAgGridService_ngUnsubscribe, "f").next();
|
|
108
|
-
__classPrivateFieldGet(this, _SkyAgGridService_ngUnsubscribe, "f").complete();
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Returns [AG Grid `gridOptions`](https://www.ag-grid.com/javascript-grid-properties/) with default SKY UX options, styling, and cell renderers registered for read-only grids.
|
|
112
|
-
* @param args
|
|
113
|
-
* @returns
|
|
114
|
-
*/
|
|
115
|
-
getGridOptions(args) {
|
|
116
|
-
const defaultGridOptions = __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getDefaultGridOptions).call(this, args);
|
|
117
|
-
const mergedGridOptions = __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_mergeGridOptions).call(this, defaultGridOptions, args.gridOptions);
|
|
118
|
-
return mergedGridOptions;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Returns [AG Grid `gridOptions`](https://www.ag-grid.com/javascript-grid-properties/) with default SKY UX options, styling, and cell editors registered for editable grids.
|
|
122
|
-
* @param args
|
|
123
|
-
* @returns
|
|
124
|
-
*/
|
|
125
|
-
getEditableGridOptions(args) {
|
|
126
|
-
const defaultGridOptions = __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getDefaultEditableGridOptions).call(this, args);
|
|
127
|
-
const mergedGridOptions = __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_mergeGridOptions).call(this, defaultGridOptions, args.gridOptions);
|
|
128
|
-
return mergedGridOptions;
|
|
129
|
-
}
|
|
130
|
-
getHeaderHeight() {
|
|
131
|
-
return __classPrivateFieldGet(this, _SkyAgGridService_currentTheme, "f")?.theme?.name === 'modern' ? 60 : 37;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
_SkyAgGridService_keyMap = new WeakMap(), _SkyAgGridService_ngUnsubscribe = new WeakMap(), _SkyAgGridService_currentTheme = new WeakMap(), _SkyAgGridService_agGridAdapterService = new WeakMap(), _SkyAgGridService_resources = new WeakMap(), _SkyAgGridService_instances = new WeakSet(), _SkyAgGridService_mergeGridOptions = function _SkyAgGridService_mergeGridOptions(defaultGridOptions, providedGridOptions) {
|
|
135
|
-
const mergedGridOptions = {
|
|
136
|
-
...defaultGridOptions,
|
|
137
|
-
...providedGridOptions,
|
|
138
|
-
components: {
|
|
139
|
-
...providedGridOptions.components,
|
|
140
|
-
// Apply default components last to prevent consumers from overwriting our component types.
|
|
141
|
-
...defaultGridOptions.components,
|
|
142
|
-
},
|
|
143
|
-
columnTypes: {
|
|
144
|
-
...providedGridOptions.columnTypes,
|
|
145
|
-
// apply default second to prevent consumers from overwriting our default column types
|
|
146
|
-
...defaultGridOptions.columnTypes,
|
|
147
|
-
},
|
|
148
|
-
defaultColDef: {
|
|
149
|
-
...defaultGridOptions.defaultColDef,
|
|
150
|
-
...providedGridOptions.defaultColDef,
|
|
151
|
-
// allow consumers to override all defaultColDef properties except cellClassRules, which we reserve for styling
|
|
152
|
-
cellClassRules: defaultGridOptions.defaultColDef?.cellClassRules,
|
|
153
|
-
},
|
|
154
|
-
defaultColGroupDef: {
|
|
155
|
-
...defaultGridOptions.defaultColGroupDef,
|
|
156
|
-
...providedGridOptions.defaultColGroupDef,
|
|
157
|
-
},
|
|
158
|
-
icons: {
|
|
159
|
-
...defaultGridOptions.icons,
|
|
160
|
-
...providedGridOptions.icons,
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
// Prefer `getRowNodeId` over `getNodeId` if set by the consumer, for backward compatibility.
|
|
164
|
-
if (mergedGridOptions.getRowNodeId) {
|
|
165
|
-
delete mergedGridOptions.getRowId;
|
|
166
|
-
}
|
|
167
|
-
return mergedGridOptions;
|
|
168
|
-
}, _SkyAgGridService_getDefaultGridOptions = function _SkyAgGridService_getDefaultGridOptions(args) {
|
|
169
|
-
// cellClassRules can be functions or string expressions
|
|
170
|
-
const cellClassRuleTrueExpression = () => true;
|
|
171
|
-
function getEditableFn(isUneditable) {
|
|
172
|
-
return function (params) {
|
|
173
|
-
let isEditable = params.colDef.editable;
|
|
174
|
-
if (typeof isEditable === 'function') {
|
|
175
|
-
const column = params.columnApi.getColumn(params.colDef.field);
|
|
176
|
-
isEditable = isEditable({
|
|
177
|
-
...params,
|
|
178
|
-
column,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
return isUneditable ? !isEditable : !!isEditable;
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
const editableCellClassRules = {
|
|
185
|
-
[SkyCellClass.Editable]: getEditableFn(),
|
|
186
|
-
[SkyCellClass.Uneditable]: getEditableFn(true),
|
|
187
|
-
};
|
|
188
|
-
function getValidatorFn() {
|
|
189
|
-
return function (param) {
|
|
190
|
-
if (param.colDef &&
|
|
191
|
-
typeof param.colDef.cellRendererParams?.skyComponentProperties
|
|
192
|
-
?.validator === 'function') {
|
|
193
|
-
return !param.colDef.cellRendererParams.skyComponentProperties.validator(param.value, param.data, param.rowIndex);
|
|
194
|
-
}
|
|
195
|
-
return false;
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
const validatorCellClassRules = {
|
|
199
|
-
[SkyCellClass.Invalid]: getValidatorFn(),
|
|
200
|
-
};
|
|
201
|
-
const defaultSkyGridOptions = {
|
|
202
|
-
columnTypes: {
|
|
203
|
-
[SkyCellType.Autocomplete]: {
|
|
204
|
-
cellClassRules: {
|
|
205
|
-
[SkyCellClass.Autocomplete]: cellClassRuleTrueExpression,
|
|
206
|
-
...editableCellClassRules,
|
|
207
|
-
},
|
|
208
|
-
cellEditor: SkyAgGridCellEditorAutocompleteComponent,
|
|
209
|
-
valueFormatter: autocompleteFormatter,
|
|
210
|
-
comparator: autocompleteComparator,
|
|
211
|
-
minWidth: 185,
|
|
212
|
-
},
|
|
213
|
-
[SkyCellType.Currency]: {
|
|
214
|
-
cellClassRules: {
|
|
215
|
-
[SkyCellClass.Currency]: cellClassRuleTrueExpression,
|
|
216
|
-
...validatorCellClassRules,
|
|
217
|
-
...editableCellClassRules,
|
|
218
|
-
},
|
|
219
|
-
cellRendererSelector: getValidatorCellRendererSelector('sky-ag-grid-cell-renderer-currency-validator', { component: 'sky-ag-grid-cell-renderer-currency' }),
|
|
220
|
-
cellEditor: SkyAgGridCellEditorCurrencyComponent,
|
|
221
|
-
headerClass: SkyHeaderClass.RightAligned,
|
|
222
|
-
minWidth: 185,
|
|
223
|
-
},
|
|
224
|
-
[SkyCellType.Date]: {
|
|
225
|
-
cellClassRules: {
|
|
226
|
-
[SkyCellClass.Date]: cellClassRuleTrueExpression,
|
|
227
|
-
...editableCellClassRules,
|
|
228
|
-
},
|
|
229
|
-
cellEditor: SkyAgGridCellEditorDatepickerComponent,
|
|
230
|
-
comparator: dateComparator,
|
|
231
|
-
minWidth: __classPrivateFieldGet(this, _SkyAgGridService_currentTheme, "f")?.theme?.name === 'modern' ? 180 : 160,
|
|
232
|
-
valueFormatter: (params) => __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_dateFormatter).call(this, params, args.locale),
|
|
233
|
-
},
|
|
234
|
-
[SkyCellType.Lookup]: {
|
|
235
|
-
cellClassRules: {
|
|
236
|
-
[SkyCellClass.Lookup]: cellClassRuleTrueExpression,
|
|
237
|
-
...editableCellClassRules,
|
|
238
|
-
},
|
|
239
|
-
cellEditor: SkyAgGridCellEditorLookupComponent,
|
|
240
|
-
cellRenderer: SkyAgGridCellRendererLookupComponent,
|
|
241
|
-
valueFormatter: (params) => {
|
|
242
|
-
const lookupProperties = applySkyLookupPropertiesDefaults(params);
|
|
243
|
-
return (params.value || [])
|
|
244
|
-
.map((value) => {
|
|
245
|
-
return value[lookupProperties.descriptorProperty];
|
|
246
|
-
})
|
|
247
|
-
.filter((value) => value !== '' && value !== undefined)
|
|
248
|
-
.join('; ');
|
|
249
|
-
},
|
|
250
|
-
minWidth: 185,
|
|
251
|
-
},
|
|
252
|
-
[SkyCellType.Number]: {
|
|
253
|
-
cellClassRules: {
|
|
254
|
-
[SkyCellClass.Number]: cellClassRuleTrueExpression,
|
|
255
|
-
...validatorCellClassRules,
|
|
256
|
-
...editableCellClassRules,
|
|
257
|
-
},
|
|
258
|
-
cellRendererSelector: getValidatorCellRendererSelector('sky-ag-grid-cell-renderer-validator-tooltip'),
|
|
259
|
-
cellEditor: SkyAgGridCellEditorNumberComponent,
|
|
260
|
-
headerClass: SkyHeaderClass.RightAligned,
|
|
261
|
-
},
|
|
262
|
-
[SkyCellType.RowSelector]: {
|
|
263
|
-
cellClassRules: {
|
|
264
|
-
[SkyCellClass.RowSelector]: cellClassRuleTrueExpression,
|
|
265
|
-
[SkyCellClass.Uneditable]: cellClassRuleTrueExpression,
|
|
266
|
-
},
|
|
267
|
-
cellRenderer: SkyAgGridCellRendererRowSelectorComponent,
|
|
268
|
-
headerName: '',
|
|
269
|
-
minWidth: 55,
|
|
270
|
-
maxWidth: 55,
|
|
271
|
-
sortable: false,
|
|
272
|
-
width: 55,
|
|
273
|
-
},
|
|
274
|
-
[SkyCellType.Text]: {
|
|
275
|
-
cellClassRules: {
|
|
276
|
-
[SkyCellClass.Text]: cellClassRuleTrueExpression,
|
|
277
|
-
...validatorCellClassRules,
|
|
278
|
-
...editableCellClassRules,
|
|
279
|
-
},
|
|
280
|
-
cellEditor: SkyAgGridCellEditorTextComponent,
|
|
281
|
-
cellRendererSelector: getValidatorCellRendererSelector('sky-ag-grid-cell-renderer-validator-tooltip'),
|
|
282
|
-
},
|
|
283
|
-
[SkyCellType.Validator]: {
|
|
284
|
-
cellClassRules: {
|
|
285
|
-
...validatorCellClassRules,
|
|
286
|
-
...editableCellClassRules,
|
|
287
|
-
},
|
|
288
|
-
cellRendererSelector: getValidatorCellRendererSelector('sky-ag-grid-cell-renderer-validator-tooltip'),
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
defaultColDef: {
|
|
292
|
-
cellClassRules: editableCellClassRules,
|
|
293
|
-
headerComponent: SkyAgGridHeaderComponent,
|
|
294
|
-
minWidth: 100,
|
|
295
|
-
resizable: true,
|
|
296
|
-
sortable: true,
|
|
297
|
-
suppressHeaderKeyboardEvent: (keypress) => keypress.event.code === 'Tab',
|
|
298
|
-
suppressKeyboardEvent: (keypress) => __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_suppressTab).call(this, keypress),
|
|
299
|
-
},
|
|
300
|
-
defaultColGroupDef: {
|
|
301
|
-
headerGroupComponent: SkyAgGridHeaderGroupComponent,
|
|
302
|
-
},
|
|
303
|
-
domLayout: 'autoHeight',
|
|
304
|
-
ensureDomOrder: true,
|
|
305
|
-
enterMovesDownAfterEdit: true,
|
|
306
|
-
components: {
|
|
307
|
-
'sky-ag-grid-cell-renderer-currency': SkyAgGridCellRendererCurrencyComponent,
|
|
308
|
-
'sky-ag-grid-cell-renderer-currency-validator': SkyAgGridCellRendererCurrencyValidatorComponent,
|
|
309
|
-
'sky-ag-grid-cell-renderer-validator-tooltip': SkyAgGridCellRendererValidatorTooltipComponent,
|
|
310
|
-
},
|
|
311
|
-
getRowId: (params) => {
|
|
312
|
-
const dataId = params.data.id;
|
|
313
|
-
if (dataId !== undefined) {
|
|
314
|
-
return `${params.data.id}`;
|
|
315
|
-
}
|
|
316
|
-
if (!__classPrivateFieldGet(this, _SkyAgGridService_keyMap, "f").has(params.data)) {
|
|
317
|
-
__classPrivateFieldGet(this, _SkyAgGridService_keyMap, "f").set(params.data, `${rowNodeId--}`);
|
|
318
|
-
}
|
|
319
|
-
return __classPrivateFieldGet(this, _SkyAgGridService_keyMap, "f").get(params.data);
|
|
320
|
-
},
|
|
321
|
-
getRowClass: (params) => {
|
|
322
|
-
if (params.node.id) {
|
|
323
|
-
return `sky-ag-grid-row-${params.node.id}`;
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
return undefined;
|
|
327
|
-
}
|
|
328
|
-
},
|
|
329
|
-
headerHeight: this.getHeaderHeight(),
|
|
330
|
-
icons: {
|
|
331
|
-
sortDescending: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'sortDescending'),
|
|
332
|
-
sortAscending: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'sortAscending'),
|
|
333
|
-
columnMoveMove: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'columnMoveMove'),
|
|
334
|
-
columnMoveHide: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'columnMoveHide'),
|
|
335
|
-
columnMoveLeft: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'columnMoveLeft'),
|
|
336
|
-
columnMoveRight: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'columnMoveRight'),
|
|
337
|
-
columnMovePin: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getIconTemplate).call(this, 'columnMovePin'),
|
|
338
|
-
},
|
|
339
|
-
onCellFocused: () => __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_onCellFocused).call(this),
|
|
340
|
-
rowHeight: __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getRowHeight).call(this),
|
|
341
|
-
getRowHeight: () => __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getRowHeight).call(this),
|
|
342
|
-
rowMultiSelectWithClick: true,
|
|
343
|
-
rowSelection: 'multiple',
|
|
344
|
-
singleClickEdit: true,
|
|
345
|
-
sortingOrder: ['desc', 'asc', null],
|
|
346
|
-
suppressRowClickSelection: true,
|
|
347
|
-
suppressDragLeaveHidesColumns: true,
|
|
348
|
-
};
|
|
349
|
-
const columnTypes = defaultSkyGridOptions.columnTypes;
|
|
350
|
-
columnTypes[SkyCellType.CurrencyValidator] = {
|
|
351
|
-
...columnTypes[SkyCellType.Currency],
|
|
352
|
-
cellRendererParams: {
|
|
353
|
-
skyComponentProperties: {
|
|
354
|
-
validator: (value) => {
|
|
355
|
-
return !!`${value || ''}`.match(/^[^0-9]*(\d+[,.]?)+\d*[^0-9]*$/);
|
|
356
|
-
},
|
|
357
|
-
validatorMessage: 'Please enter a valid currency',
|
|
358
|
-
},
|
|
359
|
-
},
|
|
360
|
-
};
|
|
361
|
-
/*istanbul ignore else*/
|
|
362
|
-
if (__classPrivateFieldGet(this, _SkyAgGridService_resources, "f")) {
|
|
363
|
-
__classPrivateFieldGet(this, _SkyAgGridService_resources, "f")
|
|
364
|
-
.getString('sky_ag_grid_cell_renderer_currency_validator_message')
|
|
365
|
-
.subscribe((value) => {
|
|
366
|
-
columnTypes[SkyCellType.CurrencyValidator].cellRendererParams.skyComponentProperties.validatorMessage = value;
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
columnTypes[SkyCellType.NumberValidator] = {
|
|
370
|
-
...columnTypes[SkyCellType.Validator],
|
|
371
|
-
...columnTypes[SkyCellType.Number],
|
|
372
|
-
cellClassRules: {
|
|
373
|
-
...columnTypes[SkyCellType.Validator].cellClassRules,
|
|
374
|
-
...columnTypes[SkyCellType.Number].cellClassRules,
|
|
375
|
-
},
|
|
376
|
-
cellRendererParams: {
|
|
377
|
-
skyComponentProperties: {
|
|
378
|
-
validator: (value) => {
|
|
379
|
-
return !!value && !isNaN(parseFloat(value));
|
|
380
|
-
},
|
|
381
|
-
validatorMessage: 'Please enter a valid number',
|
|
382
|
-
},
|
|
383
|
-
},
|
|
384
|
-
};
|
|
385
|
-
/*istanbul ignore else*/
|
|
386
|
-
if (__classPrivateFieldGet(this, _SkyAgGridService_resources, "f")) {
|
|
387
|
-
__classPrivateFieldGet(this, _SkyAgGridService_resources, "f")
|
|
388
|
-
.getString('sky_ag_grid_cell_renderer_number_validator_message')
|
|
389
|
-
.subscribe((value) => {
|
|
390
|
-
columnTypes[SkyCellType.NumberValidator].cellRendererParams.skyComponentProperties.validatorMessage = value;
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
return defaultSkyGridOptions;
|
|
394
|
-
}, _SkyAgGridService_onCellFocused = function _SkyAgGridService_onCellFocused() {
|
|
395
|
-
const currentElement = __classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").getFocusedElement();
|
|
396
|
-
__classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").focusOnFocusableChildren(currentElement);
|
|
397
|
-
}, _SkyAgGridService_getDefaultEditableGridOptions = function _SkyAgGridService_getDefaultEditableGridOptions(args) {
|
|
398
|
-
const defaultGridOptions = __classPrivateFieldGet(this, _SkyAgGridService_instances, "m", _SkyAgGridService_getDefaultGridOptions).call(this, args);
|
|
399
|
-
defaultGridOptions.rowSelection = undefined;
|
|
400
|
-
return defaultGridOptions;
|
|
401
|
-
}, _SkyAgGridService_dateFormatter = function _SkyAgGridService_dateFormatter(params, locale = 'en-us') {
|
|
402
|
-
const dateConfig = { year: 'numeric', month: '2-digit', day: '2-digit' };
|
|
403
|
-
let date = params.value;
|
|
404
|
-
if (date && typeof date === 'string') {
|
|
405
|
-
date = new Date(params.value);
|
|
406
|
-
}
|
|
407
|
-
const formattedDate = date &&
|
|
408
|
-
date.toLocaleDateString &&
|
|
409
|
-
date.toLocaleDateString(locale, dateConfig);
|
|
410
|
-
if (date && date.getTime && !isNaN(date.getTime())) {
|
|
411
|
-
return formattedDate;
|
|
412
|
-
}
|
|
413
|
-
return '';
|
|
414
|
-
}, _SkyAgGridService_getIconTemplate = function _SkyAgGridService_getIconTemplate(iconName) {
|
|
415
|
-
return () => {
|
|
416
|
-
const icon = iconMap[iconName];
|
|
417
|
-
if (__classPrivateFieldGet(this, _SkyAgGridService_currentTheme, "f")?.theme.name === 'modern' && icon.skyIcon) {
|
|
418
|
-
return `<i aria-hidden="true" class="sky-i-${icon.skyIcon}"></i>`;
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
return `<i aria-hidden="true" class="fa fa-${icon.faIcon}"></i>`;
|
|
422
|
-
}
|
|
423
|
-
};
|
|
424
|
-
}, _SkyAgGridService_suppressTab = function _SkyAgGridService_suppressTab(params) {
|
|
425
|
-
if (params.event.code === 'Tab') {
|
|
426
|
-
if (params.editing) {
|
|
427
|
-
const currentlyFocusedEl = __classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").getFocusedElement();
|
|
428
|
-
// inline cell editors have the 'ag-cell' class, while popup editors have the 'ag-popup-editor' class
|
|
429
|
-
const cellEl = __classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").getElementOrParentWithClass(currentlyFocusedEl, 'ag-cell');
|
|
430
|
-
const popupEl = __classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").getElementOrParentWithClass(currentlyFocusedEl, 'ag-popup-editor');
|
|
431
|
-
const parentEl = cellEl || popupEl;
|
|
432
|
-
const nextFocusableElementInCell = __classPrivateFieldGet(this, _SkyAgGridService_agGridAdapterService, "f").getNextFocusableElement(currentlyFocusedEl, parentEl, params.event.shiftKey);
|
|
433
|
-
return !!nextFocusableElementInCell;
|
|
434
|
-
}
|
|
435
|
-
return true;
|
|
436
|
-
}
|
|
437
|
-
return false;
|
|
438
|
-
}, _SkyAgGridService_getRowHeight = function _SkyAgGridService_getRowHeight() {
|
|
439
|
-
return __classPrivateFieldGet(this, _SkyAgGridService_currentTheme, "f")?.theme?.name === 'modern' ? 60 : 38;
|
|
440
|
-
};
|
|
441
|
-
SkyAgGridService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAgGridService, deps: [{ token: i1.SkyAgGridAdapterService }, { token: i2.SkyThemeService, optional: true }, { token: i3.SkyLibResourcesService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
442
|
-
SkyAgGridService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAgGridService, providedIn: 'any' });
|
|
443
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAgGridService, decorators: [{
|
|
444
|
-
type: Injectable,
|
|
445
|
-
args: [{
|
|
446
|
-
providedIn: 'any',
|
|
447
|
-
}]
|
|
448
|
-
}], ctorParameters: function () { return [{ type: i1.SkyAgGridAdapterService }, { type: i2.SkyThemeService, decorators: [{
|
|
449
|
-
type: Optional
|
|
450
|
-
}] }, { type: i3.SkyLibResourcesService, decorators: [{
|
|
451
|
-
type: Optional
|
|
452
|
-
}] }]; } });
|
|
453
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FnLWdyaWQvc3JjL2xpYi9tb2R1bGVzL2FnLWdyaWQvYWctZ3JpZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFlaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEYsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sNEVBQTRFLENBQUM7QUFDdEksT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDMUgsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDaEksT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDOUcsT0FBTyxFQUFFLCtDQUErQyxFQUFFLE1BQU0sb0ZBQW9GLENBQUM7QUFDckosT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDbEksT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDNUgsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sa0ZBQWtGLENBQUM7QUFDN0ksT0FBTyxFQUFFLDhDQUE4QyxFQUFFLE1BQU0sNEZBQTRGLENBQUM7QUFDNUosT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlD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LGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQztZQUVuQyxNQUFNLDBCQUEwQixHQUM5Qix1QkFBQSxJQUFJLDhDQUFzQixDQUFDLHVCQUF1QixDQUNoRCxrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUN0QixDQUFDO1lBQ0osT0FBTyxDQUFDLENBQUMsMEJBQTBCLENBQUM7U0FDckM7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0lBR0MsT0FBTyx1QkFBQSxJQUFJLHNDQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2hFLENBQUM7NkdBdGNVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBRmYsS0FBSzsyRkFFTixnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCOzswQkFXSSxRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcbmltcG9ydCB7IFNreVRoZW1lU2VydmljZSwgU2t5VGhlbWVTZXR0aW5ncyB9IGZyb20gJ0Bza3l1eC90aGVtZSc7XG5cbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sRGVmLFxuICBFZGl0YWJsZUNhbGxiYWNrUGFyYW1zLFxuICBHcmlkT3B0aW9ucyxcbiAgSUNlbGxSZW5kZXJlclBhcmFtcyxcbiAgUm93Q2xhc3NQYXJhbXMsXG4gIFN1cHByZXNzSGVhZGVyS2V5Ym9hcmRFdmVudFBhcmFtcyxcbiAgU3VwcHJlc3NLZXlib2FyZEV2ZW50UGFyYW1zLFxuICBWYWx1ZUZvcm1hdHRlclBhcmFtcyxcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lBZ0dyaWRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vYWctZ3JpZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgYXBwbHlTa3lMb29rdXBQcm9wZXJ0aWVzRGVmYXVsdHMgfSBmcm9tICcuL2FwcGx5LWxvb2t1cC1wcm9wZXJ0aWVzLWRlZmF1bHRzJztcbmltcG9ydCB7IFNreUFnR3JpZENlbGxFZGl0b3JBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtZWRpdG9ycy9jZWxsLWVkaXRvci1hdXRvY29tcGxldGUvY2VsbC1lZGl0b3ItYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lBZ0dyaWRDZWxsRWRpdG9yQ3VycmVuY3lDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtZWRpdG9ycy9jZWxsLWVkaXRvci1jdXJyZW5jeS9jZWxsLWVkaXRvci1jdXJyZW5jeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5QWdHcmlkQ2VsbEVkaXRvckRhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtZWRpdG9ycy9jZWxsLWVkaXRvci1kYXRlcGlja2VyL2NlbGwtZWRpdG9yLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUFnR3JpZENlbGxFZGl0b3JMb29rdXBDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtZWRpdG9ycy9jZWxsLWVkaXRvci1sb29rdXAvY2VsbC1lZGl0b3ItbG9va3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lBZ0dyaWRDZWxsRWRpdG9yTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi9jZWxsLWVkaXRvcnMvY2VsbC1lZGl0b3ItbnVtYmVyL2NlbGwtZWRpdG9yLW51bWJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5QWdHcmlkQ2VsbEVkaXRvclRleHRDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtZWRpdG9ycy9jZWxsLWVkaXRvci10ZXh0L2NlbGwtZWRpdG9yLXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUFnR3JpZENlbGxSZW5kZXJlckN1cnJlbmN5VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jZWxsLXJlbmRlcmVycy9jZWxsLXJlbmRlcmVyLWN1cnJlbmN5L2NlbGwtcmVuZGVyZXItY3VycmVuY3ktdmFsaWRhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lBZ0dyaWRDZWxsUmVuZGVyZXJDdXJyZW5jeUNvbXBvbmVudCB9IGZyb20gJy4vY2VsbC1yZW5kZXJlcnMvY2VsbC1yZW5kZXJlci1jdXJyZW5jeS9jZWxsLXJlbmRlcmVyLWN1cnJlbmN5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lBZ0dyaWRDZWxsUmVuZGVyZXJMb29rdXBDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItbG9va3VwL2NlbGwtcmVuZGVyZXItbG9va3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lBZ0dyaWRDZWxsUmVuZGVyZXJSb3dTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4vY2VsbC1yZW5kZXJlcnMvY2VsbC1yZW5kZXJlci1yb3ctc2VsZWN0b3IvY2VsbC1yZW5kZXJlci1yb3ctc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUFnR3JpZENlbGxSZW5kZXJlclZhbGlkYXRvclRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItdmFsaWRhdG9yLXRvb2x0aXAvY2VsbC1yZW5kZXJlci12YWxpZGF0b3ItdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5QWdHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlci9oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUFnR3JpZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vaGVhZGVyL2hlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbk1hcFR5cGUsIGljb25NYXAgfSBmcm9tICcuL2ljb25zL2ljb24tbWFwJztcbmltcG9ydCB7IFNreUNlbGxDbGFzcyB9IGZyb20gJy4vdHlwZXMvY2VsbC1jbGFzcyc7XG5pbXBvcnQgeyBTa3lDZWxsVHlwZSB9IGZyb20gJy4vdHlwZXMvY2VsbC10eXBlJztcbmltcG9ydCB7IFNreUhlYWRlckNsYXNzIH0gZnJvbSAnLi90eXBlcy9oZWFkZXItY2xhc3MnO1xuaW1wb3J0IHsgU2t5R2V0R3JpZE9wdGlvbnNBcmdzIH0gZnJvbSAnLi90eXBlcy9za3ktZ3JpZC1vcHRpb25zJztcblxuZnVuY3Rpb24gYXV0b2NvbXBsZXRlQ29tcGFyYXRvcihcbiAgdmFsdWUxOiB7IG5hbWU6IHN0cmluZyB9LFxuICB2YWx1ZTI6IHsgbmFtZTogc3RyaW5nIH1cbik6IG51bWJlciB7XG4gIGlmICh2YWx1ZTEgJiYgdmFsdWUyKSB7XG4gICAgaWYgKHZhbHVlMS5uYW1lID4gdmFsdWUyLm5hbWUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZTEubmFtZSA8IHZhbHVlMi5uYW1lKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdmFsdWUxID8gMSA6IC0xO1xufVxuXG5mdW5jdGlvbiBhdXRvY29tcGxldGVGb3JtYXR0ZXIocGFyYW1zOiBWYWx1ZUZvcm1hdHRlclBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXJhbXMudmFsdWUgJiYgcGFyYW1zLnZhbHVlLm5hbWU7XG59XG5cbmZ1bmN0aW9uIGRhdGVDb21wYXJhdG9yKGRhdGUxOiBEYXRlIHwgc3RyaW5nLCBkYXRlMjogRGF0ZSB8IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBkYXRlMXZhbHVlID0gZGF0ZTE7XG4gIGxldCBkYXRlMnZhbHVlID0gZGF0ZTI7XG5cbiAgaWYgKHR5cGVvZiBkYXRlMXZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGRhdGUxdmFsdWUgPSBuZXcgRGF0ZShkYXRlMSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGUydmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgZGF0ZTJ2YWx1ZSA9IG5ldyBEYXRlKGRhdGUyKTtcbiAgfVxuXG4gIGlmIChkYXRlMXZhbHVlICYmIGRhdGUydmFsdWUpIHtcbiAgICBpZiAoZGF0ZTF2YWx1ZSA+IGRhdGUydmFsdWUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmIChkYXRlMXZhbHVlIDwgZGF0ZTJ2YWx1ZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIGRhdGUxdmFsdWUgPyAxIDogLTE7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBnZXRWYWxpZGF0b3JDZWxsUmVuZGVyZXJTZWxlY3Rvcihjb21wb25lbnQ6IHN0cmluZywgZmFsbGJhY2s/OiBhbnkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiBhbnkgPT4ge1xuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xEZWYgJiZcbiAgICAgIHR5cGVvZiBwYXJhbXMuY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcz8uc2t5Q29tcG9uZW50UHJvcGVydGllc1xuICAgICAgICA/LnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmNvbERlZi5jZWxsUmVuZGVyZXJQYXJhbXMuc2t5Q29tcG9uZW50UHJvcGVydGllcy52YWxpZGF0b3IoXG4gICAgICAgICAgcGFyYW1zLnZhbHVlLFxuICAgICAgICAgIHBhcmFtcy5kYXRhLFxuICAgICAgICAgIHBhcmFtcy5yb3dJbmRleFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAuLi5wYXJhbXMuY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH07XG59XG5cbmxldCByb3dOb2RlSWQgPSAtMTtcblxuLyoqXG4gKiBgU2t5QWdHcmlkU2VydmljZWAgcHJvdmlkZXMgbWV0aG9kcyB0byBnZXQgQUcgR3JpZCBgZ3JpZE9wdGlvbnNgIHRvIGVuc3VyZSBncmlkcyBtYXRjaCBTS1kgVVggZnVuY3Rpb25hbGl0eS4gVGhlIGBncmlkT3B0aW9uc2AgY2FuIGJlIG92ZXJyaWRkZW4sIGFuZCBpbmNsdWRlIHJlZ2lzdGVyZWQgU0tZIFVYIGNvbHVtbiB0eXBlcy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAnYW55Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2t5QWdHcmlkU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICNrZXlNYXAgPSBuZXcgV2Vha01hcDxhbnksIHN0cmluZz4oKTtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAjY3VycmVudFRoZW1lOiBTa3lUaGVtZVNldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAjYWdHcmlkQWRhcHRlclNlcnZpY2U6IFNreUFnR3JpZEFkYXB0ZXJTZXJ2aWNlO1xuICAjcmVzb3VyY2VzOiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFnR3JpZEFkYXB0ZXJTZXJ2aWNlOiBTa3lBZ0dyaWRBZGFwdGVyU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSB0aGVtZVN2Yz86IFNreVRoZW1lU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSByZXNvdXJjZXM/OiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuI2FnR3JpZEFkYXB0ZXJTZXJ2aWNlID0gYWdHcmlkQWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jcmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKHRoZW1lU3ZjKSB7XG4gICAgICB0aGVtZVN2Yy5zZXR0aW5nc0NoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHNldHRpbmdzQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgdGhpcy4jY3VycmVudFRoZW1lID0gc2V0dGluZ3NDaGFuZ2UuY3VycmVudFNldHRpbmdzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgW0FHIEdyaWQgYGdyaWRPcHRpb25zYF0oaHR0cHM6Ly93d3cuYWctZ3JpZC5jb20vamF2YXNjcmlwdC1ncmlkLXByb3BlcnRpZXMvKSB3aXRoIGRlZmF1bHQgU0tZIFVYIG9wdGlvbnMsIHN0eWxpbmcsIGFuZCBjZWxsIHJlbmRlcmVycyByZWdpc3RlcmVkIGZvciByZWFkLW9ubHkgZ3JpZHMuXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0R3JpZE9wdGlvbnMoYXJnczogU2t5R2V0R3JpZE9wdGlvbnNBcmdzKTogR3JpZE9wdGlvbnMge1xuICAgIGNvbnN0IGRlZmF1bHRHcmlkT3B0aW9ucyA9IHRoaXMuI2dldERlZmF1bHRHcmlkT3B0aW9ucyhhcmdzKTtcbiAgICBjb25zdCBtZXJnZWRHcmlkT3B0aW9ucyA9IHRoaXMuI21lcmdlR3JpZE9wdGlvbnMoXG4gICAgICBkZWZhdWx0R3JpZE9wdGlvbnMsXG4gICAgICBhcmdzLmdyaWRPcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiBtZXJnZWRHcmlkT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIFtBRyBHcmlkIGBncmlkT3B0aW9uc2BdKGh0dHBzOi8vd3d3LmFnLWdyaWQuY29tL2phdmFzY3JpcHQtZ3JpZC1wcm9wZXJ0aWVzLykgd2l0aCBkZWZhdWx0IFNLWSBVWCBvcHRpb25zLCBzdHlsaW5nLCBhbmQgY2VsbCBlZGl0b3JzIHJlZ2lzdGVyZWQgZm9yIGVkaXRhYmxlIGdyaWRzLlxuICAgKiBAcGFyYW0gYXJnc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGdldEVkaXRhYmxlR3JpZE9wdGlvbnMoYXJnczogU2t5R2V0R3JpZE9wdGlvbnNBcmdzKTogR3JpZE9wdGlvbnMge1xuICAgIGNvbnN0IGRlZmF1bHRHcmlkT3B0aW9ucyA9IHRoaXMuI2dldERlZmF1bHRFZGl0YWJsZUdyaWRPcHRpb25zKGFyZ3MpO1xuICAgIGNvbnN0IG1lcmdlZEdyaWRPcHRpb25zID0gdGhpcy4jbWVyZ2VHcmlkT3B0aW9ucyhcbiAgICAgIGRlZmF1bHRHcmlkT3B0aW9ucyxcbiAgICAgIGFyZ3MuZ3JpZE9wdGlvbnNcbiAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlZEdyaWRPcHRpb25zO1xuICB9XG5cbiAgcHVibGljIGdldEhlYWRlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50VGhlbWU/LnRoZW1lPy5uYW1lID09PSAnbW9kZXJuJyA/IDYwIDogMzc7XG4gIH1cblxuICAjbWVyZ2VHcmlkT3B0aW9ucyhcbiAgICBkZWZhdWx0R3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zLFxuICAgIHByb3ZpZGVkR3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zXG4gICk6IEdyaWRPcHRpb25zIHtcbiAgICBjb25zdCBtZXJnZWRHcmlkT3B0aW9uczogR3JpZE9wdGlvbnMgPSB7XG4gICAgICAuLi5kZWZhdWx0R3JpZE9wdGlvbnMsXG4gICAgICAuLi5wcm92aWRlZEdyaWRPcHRpb25zLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAuLi5wcm92aWRlZEdyaWRPcHRpb25zLmNvbXBvbmVudHMsXG4gICAgICAgIC8vIEFwcGx5IGRlZmF1bHQgY29tcG9uZW50cyBsYXN0IHRvIHByZXZlbnQgY29uc3VtZXJzIGZyb20gb3ZlcndyaXRpbmcgb3VyIGNvbXBvbmVudCB0eXBlcy5cbiAgICAgICAgLi4uZGVmYXVsdEdyaWRPcHRpb25zLmNvbXBvbmVudHMsXG4gICAgICB9LFxuICAgICAgY29sdW1uVHlwZXM6IHtcbiAgICAgICAgLi4ucHJvdmlkZWRHcmlkT3B0aW9ucy5jb2x1bW5UeXBlcyxcbiAgICAgICAgLy8gYXBwbHkgZGVmYXVsdCBzZWNvbmQgdG8gcHJldmVudCBjb25zdW1lcnMgZnJvbSBvdmVyd3JpdGluZyBvdXIgZGVmYXVsdCBjb2x1bW4gdHlwZXNcbiAgICAgICAgLi4uZGVmYXVsdEdyaWRPcHRpb25zLmNvbHVtblR5cGVzLFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRDb2xEZWY6IHtcbiAgICAgICAgLi4uZGVmYXVsdEdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICAgIC4uLnByb3ZpZGVkR3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgICAgLy8gYWxsb3cgY29uc3VtZXJzIHRvIG92ZXJyaWRlIGFsbCBkZWZhdWx0Q29sRGVmIHByb3BlcnRpZXMgZXhjZXB0IGNlbGxDbGFzc1J1bGVzLCB3aGljaCB3ZSByZXNlcnZlIGZvciBzdHlsaW5nXG4gICAgICAgIGNlbGxDbGFzc1J1bGVzOiBkZWZhdWx0R3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZj8uY2VsbENsYXNzUnVsZXMsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvbEdyb3VwRGVmOiB7XG4gICAgICAgIC4uLmRlZmF1bHRHcmlkT3B0aW9ucy5kZWZhdWx0Q29sR3JvdXBEZWYsXG4gICAgICAgIC4uLnByb3ZpZGVkR3JpZE9wdGlvbnMuZGVmYXVsdENvbEdyb3VwRGVmLFxuICAgICAgfSxcbiAgICAgIGljb25zOiB7XG4gICAgICAgIC4uLmRlZmF1bHRHcmlkT3B0aW9ucy5pY29ucyxcbiAgICAgICAgLi4ucHJvdmlkZWRHcmlkT3B0aW9ucy5pY29ucyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFByZWZlciBgZ2V0Um93Tm9kZUlkYCBvdmVyIGBnZXROb2RlSWRgIGlmIHNldCBieSB0aGUgY29uc3VtZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXJnZWRHcmlkT3B0aW9ucy5nZXRSb3dOb2RlSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRHcmlkT3B0aW9ucy5nZXRSb3dJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkR3JpZE9wdGlvbnM7XG4gIH1cblxuICAjZ2V0RGVmYXVsdEdyaWRPcHRpb25zKGFyZ3M6IFNreUdldEdyaWRPcHRpb25zQXJncyk6IEdyaWRPcHRpb25zIHtcbiAgICAvLyBjZWxsQ2xhc3NSdWxlcyBjYW4gYmUgZnVuY3Rpb25zIG9yIHN0cmluZyBleHByZXNzaW9uc1xuICAgIGNvbnN0IGNlbGxDbGFzc1J1bGVUcnVlRXhwcmVzc2lvbiA9ICgpOiBib29sZWFuID0+IHRydWU7XG5cbiAgICBmdW5jdGlvbiBnZXRFZGl0YWJsZUZuKFxuICAgICAgaXNVbmVkaXRhYmxlPzogYm9vbGVhblxuICAgICk6IChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4gYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0VkaXRhYmxlID0gcGFyYW1zLmNvbERlZi5lZGl0YWJsZTtcblxuICAgICAgICBpZiAodHlwZW9mIGlzRWRpdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSBwYXJhbXMuY29sdW1uQXBpLmdldENvbHVtbihwYXJhbXMuY29sRGVmLmZpZWxkKTtcbiAgICAgICAgICBpc0VkaXRhYmxlID0gaXNFZGl0YWJsZSh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgfSBhcyBFZGl0YWJsZUNhbGxiYWNrUGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1VuZWRpdGFibGUgPyAhaXNFZGl0YWJsZSA6ICEhaXNFZGl0YWJsZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdGFibGVDZWxsQ2xhc3NSdWxlcyA9IHtcbiAgICAgIFtTa3lDZWxsQ2xhc3MuRWRpdGFibGVdOiBnZXRFZGl0YWJsZUZuKCksXG4gICAgICBbU2t5Q2VsbENsYXNzLlVuZWRpdGFibGVdOiBnZXRFZGl0YWJsZUZuKHRydWUpLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRWYWxpZGF0b3JGbigpOiAocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwYXJhbTogQ2VsbENsYXNzUGFyYW1zKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYXJhbS5jb2xEZWYgJiZcbiAgICAgICAgICB0eXBlb2YgcGFyYW0uY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcz8uc2t5Q29tcG9uZW50UHJvcGVydGllc1xuICAgICAgICAgICAgPy52YWxpZGF0b3IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuICFwYXJhbS5jb2xEZWYuY2VsbFJlbmRlcmVyUGFyYW1zLnNreUNvbXBvbmVudFByb3BlcnRpZXMudmFsaWRhdG9yKFxuICAgICAgICAgICAgcGFyYW0udmFsdWUsXG4gICAgICAgICAgICBwYXJhbS5kYXRhLFxuICAgICAgICAgICAgcGFyYW0ucm93SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yQ2VsbENsYXNzUnVsZXMgPSB7XG4gICAgICBbU2t5Q2VsbENsYXNzLkludmFsaWRdOiBnZXRWYWxpZGF0b3JGbigpLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0U2t5R3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zID0ge1xuICAgICAgY29sdW1uVHlwZXM6IHtcbiAgICAgICAgW1NreUNlbGxUeXBlLkF1dG9jb21wbGV0ZV06IHtcbiAgICAgICAgICBjZWxsQ2xhc3NSdWxlczoge1xuICAgICAgICAgICAgW1NreUNlbGxDbGFzcy5BdXRvY29tcGxldGVdOiBjZWxsQ2xhc3NSdWxlVHJ1ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAuLi5lZGl0YWJsZUNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2VsbEVkaXRvcjogU2t5QWdHcmlkQ2VsbEVkaXRvckF1dG9jb21wbGV0ZUNvbXBvbmVudCxcbiAgICAgICAgICB2YWx1ZUZvcm1hdHRlcjogYXV0b2NvbXBsZXRlRm9ybWF0dGVyLFxuICAgICAgICAgIGNvbXBhcmF0b3I6IGF1dG9jb21wbGV0ZUNvbXBhcmF0b3IsXG4gICAgICAgICAgbWluV2lkdGg6IDE4NSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NreUNlbGxUeXBlLkN1cnJlbmN5XToge1xuICAgICAgICAgIGNlbGxDbGFzc1J1bGVzOiB7XG4gICAgICAgICAgICBbU2t5Q2VsbENsYXNzLkN1cnJlbmN5XTogY2VsbENsYXNzUnVsZVRydWVFeHByZXNzaW9uLFxuICAgICAgICAgICAgLi4udmFsaWRhdG9yQ2VsbENsYXNzUnVsZXMsXG4gICAgICAgICAgICAuLi5lZGl0YWJsZUNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2VsbFJlbmRlcmVyU2VsZWN0b3I6IGdldFZhbGlkYXRvckNlbGxSZW5kZXJlclNlbGVjdG9yKFxuICAgICAgICAgICAgJ3NreS1hZy1ncmlkLWNlbGwtcmVuZGVyZXItY3VycmVuY3ktdmFsaWRhdG9yJyxcbiAgICAgICAgICAgIHsgY29tcG9uZW50OiAnc2t5LWFnLWdyaWQtY2VsbC1yZW5kZXJlci1jdXJyZW5jeScgfVxuICAgICAgICAgICksXG4gICAgICAgICAgY2VsbEVkaXRvcjogU2t5QWdHcmlkQ2VsbEVkaXRvckN1cnJlbmN5Q29tcG9uZW50LFxuICAgICAgICAgIGhlYWRlckNsYXNzOiBTa3lIZWFkZXJDbGFzcy5SaWdodEFsaWduZWQsXG4gICAgICAgICAgbWluV2lkdGg6IDE4NSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NreUNlbGxUeXBlLkRhdGVdOiB7XG4gICAgICAgICAgY2VsbENsYXNzUnVsZXM6IHtcbiAgICAgICAgICAgIFtTa3lDZWxsQ2xhc3MuRGF0ZV06IGNlbGxDbGFzc1J1bGVUcnVlRXhwcmVzc2lvbixcbiAgICAgICAgICAgIC4uLmVkaXRhYmxlQ2VsbENsYXNzUnVsZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjZWxsRWRpdG9yOiBTa3lBZ0dyaWRDZWxsRWRpdG9yRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICBjb21wYXJhdG9yOiBkYXRlQ29tcGFyYXRvcixcbiAgICAgICAgICBtaW5XaWR0aDogdGhpcy4jY3VycmVudFRoZW1lPy50aGVtZT8ubmFtZSA9PT0gJ21vZGVybicgPyAxODAgOiAxNjAsXG4gICAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXM6IFZhbHVlRm9ybWF0dGVyUGFyYW1zKSA9PlxuICAgICAgICAgICAgdGhpcy4jZGF0ZUZvcm1hdHRlcihwYXJhbXMsIGFyZ3MubG9jYWxlKSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NreUNlbGxUeXBlLkxvb2t1cF06IHtcbiAgICAgICAgICBjZWxsQ2xhc3NSdWxlczoge1xuICAgICAgICAgICAgW1NreUNlbGxDbGFzcy5Mb29rdXBdOiBjZWxsQ2xhc3NSdWxlVHJ1ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAuLi5lZGl0YWJsZUNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2VsbEVkaXRvcjogU2t5QWdHcmlkQ2VsbEVkaXRvckxvb2t1cENvbXBvbmVudCxcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IFNreUFnR3JpZENlbGxSZW5kZXJlckxvb2t1cENvbXBvbmVudCxcbiAgICAgICAgICB2YWx1ZUZvcm1hdHRlcjogKHBhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9va3VwUHJvcGVydGllcyA9IGFwcGx5U2t5TG9va3VwUHJvcGVydGllc0RlZmF1bHRzKHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gKHBhcmFtcy52YWx1ZSB8fCBbXSlcbiAgICAgICAgICAgICAgLm1hcCgodmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW2xvb2t1cFByb3BlcnRpZXMuZGVzY3JpcHRvclByb3BlcnR5IGFzIHN0cmluZ107XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtaW5XaWR0aDogMTg1LFxuICAgICAgICB9LFxuICAgICAgICBbU2t5Q2VsbFR5cGUuTnVtYmVyXToge1xuICAgICAgICAgIGNlbGxDbGFzc1J1bGVzOiB7XG4gICAgICAgICAgICBbU2t5Q2VsbENsYXNzLk51bWJlcl06IGNlbGxDbGFzc1J1bGVUcnVlRXhwcmVzc2lvbixcbiAgICAgICAgICAgIC4uLnZhbGlkYXRvckNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgICAgLi4uZWRpdGFibGVDZWxsQ2xhc3NSdWxlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNlbGxSZW5kZXJlclNlbGVjdG9yOiBnZXRWYWxpZGF0b3JDZWxsUmVuZGVyZXJTZWxlY3RvcihcbiAgICAgICAgICAgICdza3ktYWctZ3JpZC1jZWxsLXJlbmRlcmVyLXZhbGlkYXRvci10b29sdGlwJ1xuICAgICAgICAgICksXG4gICAgICAgICAgY2VsbEVkaXRvcjogU2t5QWdHcmlkQ2VsbEVkaXRvck51bWJlckNvbXBvbmVudCxcbiAgICAgICAgICBoZWFkZXJDbGFzczogU2t5SGVhZGVyQ2xhc3MuUmlnaHRBbGlnbmVkLFxuICAgICAgICB9LFxuICAgICAgICBbU2t5Q2VsbFR5cGUuUm93U2VsZWN0b3JdOiB7XG4gICAgICAgICAgY2VsbENsYXNzUnVsZXM6IHtcbiAgICAgICAgICAgIFtTa3lDZWxsQ2xhc3MuUm93U2VsZWN0b3JdOiBjZWxsQ2xhc3NSdWxlVHJ1ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICBbU2t5Q2VsbENsYXNzLlVuZWRpdGFibGVdOiBjZWxsQ2xhc3NSdWxlVHJ1ZUV4cHJlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IFNreUFnR3JpZENlbGxSZW5kZXJlclJvd1NlbGVjdG9yQ29tcG9uZW50LFxuICAgICAgICAgIGhlYWRlck5hbWU6ICcnLFxuICAgICAgICAgIG1pbldpZHRoOiA1NSxcbiAgICAgICAgICBtYXhXaWR0aDogNTUsXG4gICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgIHdpZHRoOiA1NSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NreUNlbGxUeXBlLlRleHRdOiB7XG4gICAgICAgICAgY2VsbENsYXNzUnVsZXM6IHtcbiAgICAgICAgICAgIFtTa3lDZWxsQ2xhc3MuVGV4dF06IGNlbGxDbGFzc1J1bGVUcnVlRXhwcmVzc2lvbixcbiAgICAgICAgICAgIC4uLnZhbGlkYXRvckNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgICAgLi4uZWRpdGFibGVDZWxsQ2xhc3NSdWxlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNlbGxFZGl0b3I6IFNreUFnR3JpZENlbGxFZGl0b3JUZXh0Q29tcG9uZW50LFxuICAgICAgICAgIGNlbGxSZW5kZXJlclNlbGVjdG9yOiBnZXRWYWxpZGF0b3JDZWxsUmVuZGVyZXJTZWxlY3RvcihcbiAgICAgICAgICAgICdza3ktYWctZ3JpZC1jZWxsLXJlbmRlcmVyLXZhbGlkYXRvci10b29sdGlwJ1xuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIFtTa3lDZWxsVHlwZS5WYWxpZGF0b3JdOiB7XG4gICAgICAgICAgY2VsbENsYXNzUnVsZXM6IHtcbiAgICAgICAgICAgIC4uLnZhbGlkYXRvckNlbGxDbGFzc1J1bGVzLFxuICAgICAgICAgICAgLi4uZWRpdGFibGVDZWxsQ2xhc3NSdWxlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNlbGxSZW5kZXJlclNlbGVjdG9yOiBnZXRWYWxpZGF0b3JDZWxsUmVuZGVyZXJTZWxlY3RvcihcbiAgICAgICAgICAgICdza3ktYWctZ3JpZC1jZWxsLXJlbmRlcmVyLXZhbGlkYXRvci10b29sdGlwJ1xuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvbERlZjoge1xuICAgICAgICBjZWxsQ2xhc3NSdWxlczogZWRpdGFibGVDZWxsQ2xhc3NSdWxlcyxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50OiBTa3lBZ0dyaWRIZWFkZXJDb21wb25lbnQsXG4gICAgICAgIG1pbldpZHRoOiAxMDAsXG4gICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAgIHN1cHByZXNzSGVhZGVyS2V5Ym9hcmRFdmVudDogKFxuICAgICAgICAgIGtleXByZXNzOiBTdXBwcmVzc0hlYWRlcktleWJvYXJkRXZlbnRQYXJhbXNcbiAgICAgICAgKSA9PiBrZXlwcmVzcy5ldmVudC5jb2RlID09PSAnVGFiJyxcbiAgICAgICAgc3VwcHJlc3NLZXlib2FyZEV2ZW50OiAoa2V5cHJlc3M6IFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcykgPT5cbiAgICAgICAgICB0aGlzLiNzdXBwcmVzc1RhYihrZXlwcmVzcyksXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvbEdyb3VwRGVmOiB7XG4gICAgICAgIGhlYWRlckdyb3VwQ29tcG9uZW50OiBTa3lBZ0dyaWRIZWFkZXJHcm91cENvbXBvbmVudCxcbiAgICAgIH0sXG4gICAgICBkb21MYXlvdXQ6ICdhdXRvSGVpZ2h0JyxcbiAgICAgIGVuc3VyZURvbU9yZGVyOiB0cnVlLFxuICAgICAgZW50ZXJNb3Zlc0Rvd25BZnRlckVkaXQ6IHRydWUsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICdza3ktYWctZ3JpZC1jZWxsLXJlbmRlcmVyLWN1cnJlbmN5JzpcbiAgICAgICAgICBTa3lBZ0dyaWRDZWxsUmVuZGVyZXJDdXJyZW5jeUNvbXBvbmVudCxcbiAgICAgICAgJ3NreS1hZy1ncmlkLWNlbGwtcmVuZGVyZXItY3VycmVuY3ktdmFsaWRhdG9yJzpcbiAgICAgICAgICBTa3lBZ0dyaWRDZWxsUmVuZGVyZXJDdXJyZW5jeVZhbGlkYXRvckNvbXBvbmVudCxcbiAgICAgICAgJ3NreS1hZy1ncmlkLWNlbGwtcmVuZGVyZXItdmFsaWRhdG9yLXRvb2x0aXAnOlxuICAgICAgICAgIFNreUFnR3JpZENlbGxSZW5kZXJlclZhbGlkYXRvclRvb2x0aXBDb21wb25lbnQsXG4gICAgICB9LFxuICAgICAgZ2V0Um93SWQ6IChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUlkID0gcGFyYW1zLmRhdGEuaWQ7XG4gICAgICAgIGlmIChkYXRhSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwYXJhbXMuZGF0YS5pZH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4ja2V5TWFwLmhhcyhwYXJhbXMuZGF0YSkpIHtcbiAgICAgICAgICB0aGlzLiNrZXlNYXAuc2V0KHBhcmFtcy5kYXRhLCBgJHtyb3dOb2RlSWQtLX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4ja2V5TWFwLmdldChwYXJhbXMuZGF0YSkgYXMgc3RyaW5nO1xuICAgICAgfSxcbiAgICAgIGdldFJvd0NsYXNzOiAocGFyYW1zOiBSb3dDbGFzc1BhcmFtcykgPT4ge1xuICAgICAgICBpZiAocGFyYW1zLm5vZGUuaWQpIHtcbiAgICAgICAgICByZXR1cm4gYHNreS1hZy1ncmlkLXJvdy0ke3BhcmFtcy5ub2RlLmlkfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhlYWRlckhlaWdodDogdGhpcy5nZXRIZWFkZXJIZWlnaHQoKSxcbiAgICAgIGljb25zOiB7XG4gICAgICAgIHNvcnREZXNjZW5kaW5nOiB0aGlzLiNnZXRJY29uVGVtcGxhdGUoJ3NvcnREZXNjZW5kaW5nJyksXG4gICAgICAgIHNvcnRBc2NlbmRpbmc6IHRoaXMuI2dldEljb25UZW1wbGF0ZSgnc29ydEFzY2VuZGluZycpLFxuICAgICAgICBjb2x1bW5Nb3ZlTW92ZTogdGhpcy4jZ2V0SWNvblRlbXBsYXRlKCdjb2x1bW5Nb3ZlTW92ZScpLFxuICAgICAgICBjb2x1bW5Nb3ZlSGlkZTogdGhpcy4jZ2V0SWNvblRlbXBsYXRlKCdjb2x1bW5Nb3ZlSGlkZScpLFxuICAgICAgICBjb2x1bW5Nb3ZlTGVmdDogdGhpcy4jZ2V0SWNvblRlbXBsYXRlKCdjb2x1bW5Nb3ZlTGVmdCcpLFxuICAgICAgICBjb2x1bW5Nb3ZlUmlnaHQ6IHRoaXMuI2dldEljb25UZW1wbGF0ZSgnY29sdW1uTW92ZVJpZ2h0JyksXG4gICAgICAgIGNvbHVtbk1vdmVQaW46IHRoaXMuI2dldEljb25UZW1wbGF0ZSgnY29sdW1uTW92ZVBpbicpLFxuICAgICAgfSxcbiAgICAgIG9uQ2VsbEZvY3VzZWQ6ICgpID0+IHRoaXMuI29uQ2VsbEZvY3VzZWQoKSxcbiAgICAgIHJvd0hlaWdodDogdGhpcy4jZ2V0Um93SGVpZ2h0KCksXG4gICAgICBnZXRSb3dIZWlnaHQ6ICgpID0+IHRoaXMuI2dldFJvd0hlaWdodCgpLFxuICAgICAgcm93TXVsdGlTZWxlY3RXaXRoQ2xpY2s6IHRydWUsXG4gICAgICByb3dTZWxlY3Rpb246ICdtdWx0aXBsZScsXG4gICAgICBzaW5nbGVDbGlja0VkaXQ6IHRydWUsXG4gICAgICBzb3J0aW5nT3JkZXI6IFsnZGVzYycsICdhc2MnLCBudWxsXSxcbiAgICAgIHN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb246IHRydWUsXG4gICAgICBzdXBwcmVzc0RyYWdMZWF2ZUhpZGVzQ29sdW1uczogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29sdW1uVHlwZXMgPSBkZWZhdWx0U2t5R3JpZE9wdGlvbnMuY29sdW1uVHlwZXMgYXMgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgQ29sRGVmXG4gICAgPjtcblxuICAgIGNvbHVtblR5cGVzW1NreUNlbGxUeXBlLkN1cnJlbmN5VmFsaWRhdG9yXSA9IHtcbiAgICAgIC4uLmNvbHVtblR5cGVzW1NreUNlbGxUeXBlLkN1cnJlbmN5XSxcbiAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xuICAgICAgICBza3lDb21wb25lbnRQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhYCR7dmFsdWUgfHwgJyd9YC5tYXRjaCgvXlteMC05XSooXFxkK1ssLl0/KStcXGQqW14wLTldKiQvKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRvck1lc3NhZ2U6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBjdXJyZW5jeScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKHRoaXMuI3Jlc291cmNlcykge1xuICAgICAgdGhpcy4jcmVzb3VyY2VzXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreV9hZ19ncmlkX2NlbGxfcmVuZGVyZXJfY3VycmVuY3lfdmFsaWRhdG9yX21lc3NhZ2UnKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbHVtblR5cGVzW1xuICAgICAgICAgICAgU2t5Q2VsbFR5cGUuQ3VycmVuY3lWYWxpZGF0b3JcbiAgICAgICAgICBdLmNlbGxSZW5kZXJlclBhcmFtcy5za3lDb21wb25lbnRQcm9wZXJ0aWVzLnZhbGlkYXRvck1lc3NhZ2UgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29sdW1uVHlwZXNbU2t5Q2VsbFR5cGUuTnVtYmVyVmFsaWRhdG9yXSA9IHtcbiAgICAgIC4uLmNvbHVtblR5cGVzW1NreUNlbGxUeXBlLlZhbGlkYXRvcl0sXG4gICAgICAuLi5jb2x1bW5UeXBlc1tTa3lDZWxsVHlwZS5OdW1iZXJdLFxuICAgICAgY2VsbENsYXNzUnVsZXM6IHtcbiAgICAgICAgLi4uY29sdW1uVHlwZXNbU2t5Q2VsbFR5cGUuVmFsaWRhdG9yXS5jZWxsQ2xhc3NSdWxlcyxcbiAgICAgICAgLi4uY29sdW1uVHlwZXNbU2t5Q2VsbFR5cGUuTnVtYmVyXS5jZWxsQ2xhc3NSdWxlcyxcbiAgICAgIH0sXG4gICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHtcbiAgICAgICAgc2t5Q29tcG9uZW50UHJvcGVydGllczoge1xuICAgICAgICAgIHZhbGlkYXRvcjogKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhIXZhbHVlICYmICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0b3JNZXNzYWdlOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbHNlKi9cbiAgICBpZiAodGhpcy4jcmVzb3VyY2VzKSB7XG4gICAgICB0aGlzLiNyZXNvdXJjZXNcbiAgICAgICAgLmdldFN0cmluZygnc2t5X2FnX2dyaWRfY2VsbF9yZW5kZXJlcl9udW1iZXJfdmFsaWRhdG9yX21lc3NhZ2UnKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbHVtblR5cGVzW1xuICAgICAgICAgICAgU2t5Q2VsbFR5cGUuTnVtYmVyVmFsaWRhdG9yXG4gICAgICAgICAgXS5jZWxsUmVuZGVyZXJQYXJhbXMuc2t5Q29tcG9uZW50UHJvcGVydGllcy52YWxpZGF0b3JNZXNzYWdlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0U2t5R3JpZE9wdGlvbnM7XG4gIH1cblxuICAjb25DZWxsRm9jdXNlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRoaXMuI2FnR3JpZEFkYXB0ZXJTZXJ2aWNlLmdldEZvY3VzZWRFbGVtZW50KCk7XG5cbiAgICB0aGlzLiNhZ0dyaWRBZGFwdGVyU2VydmljZS5mb2N1c09uRm9jdXNhYmxlQ2hpbGRyZW4oY3VycmVudEVsZW1lbnQpO1xuICB9XG5cbiAgI2dldERlZmF1bHRFZGl0YWJsZUdyaWRPcHRpb25zKGFyZ3M6IFNreUdldEdyaWRPcHRpb25zQXJncyk6IEdyaWRPcHRpb25zIHtcbiAgICBjb25zdCBkZWZhdWx0R3JpZE9wdGlvbnMgPSB0aGlzLiNnZXREZWZhdWx0R3JpZE9wdGlvbnMoYXJncyk7XG5cbiAgICBkZWZhdWx0R3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIGRlZmF1bHRHcmlkT3B0aW9ucztcbiAgfVxuXG4gICNkYXRlRm9ybWF0dGVyKFxuICAgIHBhcmFtczogVmFsdWVGb3JtYXR0ZXJQYXJhbXMsXG4gICAgbG9jYWxlOiBzdHJpbmcgPSAnZW4tdXMnXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZUNvbmZpZyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JyB9O1xuICAgIGxldCBkYXRlOiBEYXRlID0gcGFyYW1zLnZhbHVlO1xuXG4gICAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRlID0gbmV3IERhdGUocGFyYW1zLnZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlID1cbiAgICAgIGRhdGUgJiZcbiAgICAgIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nICYmXG4gICAgICBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIGRhdGVDb25maWcgYXMgSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMpO1xuXG4gICAgaWYgKGRhdGUgJiYgZGF0ZS5nZXRUaW1lICYmICFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gICNnZXRJY29uVGVtcGxhdGUoaWNvbk5hbWU6IGtleW9mIEljb25NYXBUeXBlKTogKCkgPT4gc3RyaW5nIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaWNvbiA9IGljb25NYXBbaWNvbk5hbWVdO1xuICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUaGVtZT8udGhlbWUubmFtZSA9PT0gJ21vZGVybicgJiYgaWNvbi5za3lJY29uKSB7XG4gICAgICAgIHJldHVybiBgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJza3ktaS0ke2ljb24uc2t5SWNvbn1cIj48L2k+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJmYSBmYS0ke2ljb24uZmFJY29ufVwiPjwvaT5gO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAjc3VwcHJlc3NUYWIocGFyYW1zOiBTdXBwcmVzc0tleWJvYXJkRXZlbnRQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAocGFyYW1zLmV2ZW50LmNvZGUgPT09ICdUYWInKSB7XG4gICAgICBpZiAocGFyYW1zLmVkaXRpbmcpIHtcbiAgICAgICAgY29uc3QgY3VycmVudGx5Rm9jdXNlZEVsID1cbiAgICAgICAgICB0aGlzLiNhZ0dyaWRBZGFwdGVyU2VydmljZS5nZXRGb2N1c2VkRWxlbWVudCgpO1xuICAgICAgICAvLyBpbmxpbmUgY2VsbCBlZGl0b3JzIGhhdmUgdGhlICdhZy1jZWxsJyBjbGFzcywgd2hpbGUgcG9wdXAgZWRpdG9ycyBoYXZlIHRoZSAnYWctcG9wdXAtZWRpdG9yJyBjbGFzc1xuICAgICAgICBjb25zdCBjZWxsRWwgPSB0aGlzLiNhZ0dyaWRBZGFwdGVyU2VydmljZS5nZXRFbGVtZW50T3JQYXJlbnRXaXRoQ2xhc3MoXG4gICAgICAgICAgY3VycmVudGx5Rm9jdXNlZEVsLFxuICAgICAgICAgICdhZy1jZWxsJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy4jYWdHcmlkQWRhcHRlclNlcnZpY2UuZ2V0RWxlbWVudE9yUGFyZW50V2l0aENsYXNzKFxuICAgICAgICAgIGN1cnJlbnRseUZvY3VzZWRFbCxcbiAgICAgICAgICAnYWctcG9wdXAtZWRpdG9yJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYXJlbnRFbCA9IGNlbGxFbCB8fCBwb3B1cEVsO1xuXG4gICAgICAgIGNvbnN0IG5leHRGb2N1c2FibGVFbGVtZW50SW5DZWxsID1cbiAgICAgICAgICB0aGlzLiNhZ0dyaWRBZGFwdGVyU2VydmljZS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudChcbiAgICAgICAgICAgIGN1cnJlbnRseUZvY3VzZWRFbCxcbiAgICAgICAgICAgIHBhcmVudEVsLFxuICAgICAgICAgICAgcGFyYW1zLmV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICEhbmV4dEZvY3VzYWJsZUVsZW1lbnRJbkNlbGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgI2dldFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50VGhlbWU/LnRoZW1lPy5uYW1lID09PSAnbW9kZXJuJyA/IDYwIDogMzg7XG4gIH1cbn1cbiJdfQ==
|