@datagrok-libraries/utils 3.3.2 → 4.0.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.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/css/file-input.css +0 -32
  3. package/css/history-input.css +0 -27
  4. package/css/history-panel.css +0 -57
  5. package/css/pipeline-view.css +0 -13
  6. package/css/rich-function-view.css +0 -4
  7. package/src/computation-view.d.ts +0 -78
  8. package/src/computation-view.d.ts.map +0 -1
  9. package/src/computation-view.js +0 -157
  10. package/src/function-view.d.ts +0 -226
  11. package/src/function-view.d.ts.map +0 -1
  12. package/src/function-view.js +0 -384
  13. package/src/history-utils.d.ts +0 -65
  14. package/src/history-utils.d.ts.map +0 -1
  15. package/src/history-utils.js +0 -212
  16. package/src/pipeline-view.d.ts +0 -40
  17. package/src/pipeline-view.d.ts.map +0 -1
  18. package/src/pipeline-view.js +0 -178
  19. package/src/rich-function-view.d.ts +0 -55
  20. package/src/rich-function-view.d.ts.map +0 -1
  21. package/src/rich-function-view.js +0 -571
  22. package/src/shared-components/file-input.d.ts +0 -23
  23. package/src/shared-components/file-input.d.ts.map +0 -1
  24. package/src/shared-components/file-input.js +0 -133
  25. package/src/shared-components/history-input.d.ts +0 -26
  26. package/src/shared-components/history-input.d.ts.map +0 -1
  27. package/src/shared-components/history-input.js +0 -192
  28. package/src/shared-components/history-panel.d.ts +0 -65
  29. package/src/shared-components/history-panel.d.ts.map +0 -1
  30. package/src/shared-components/history-panel.js +0 -502
  31. package/src/shared-components/ui-utils.d.ts +0 -10
  32. package/src/shared-components/ui-utils.d.ts.map +0 -1
  33. package/src/shared-components/ui-utils.js +0 -19
  34. package/src/validation.d.ts +0 -56
  35. package/src/validation.d.ts.map +0 -1
  36. package/src/validation.js +0 -152
@@ -1,10 +0,0 @@
1
- import * as DG from 'datagrok-api/dg';
2
- import { FileInput } from './file-input';
3
- import { HistoryInput } from './history-input';
4
- import { HistoryPanel } from './history-panel';
5
- export declare namespace UiUtils {
6
- function fileInput(initialText?: string, initialValue?: File | null, onValueChanged?: Function | null, fileType?: string): FileInput;
7
- function historyInput(label: string, _funcName: string, _stringValueFunc: (currentRun: DG.FuncCall) => string, _visibleColumnsForGrid: Record<string, (currentRun: DG.FuncCall) => string>, _visibleColumnsForFilter?: string[]): HistoryInput;
8
- function historyPanel(objFunc: DG.Func): HistoryPanel;
9
- }
10
- //# sourceMappingURL=ui-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui-utils.d.ts","sourceRoot":"","sources":["ui-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAkB,SAAS,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,yBAAiB,OAAO,CAAC;IACvB,SAAgB,SAAS,CACvB,WAAW,SAAqB,EAChC,YAAY,GAAE,IAAI,GAAG,IAAW,EAChC,cAAc,GAAE,QAAQ,GAAG,IAAW,EACtC,QAAQ,SAAkB,aAG3B;IAED,SAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,EACrD,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,EAC3E,wBAAwB,GAAE,MAAM,EAAO,gBAGxC;IAED,SAAgB,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,gBAE5C;CACF"}
@@ -1,19 +0,0 @@
1
- import { EXCEL_BLOB_TYPE, FileInput } from './file-input';
2
- import { HistoryInput } from './history-input';
3
- import { HistoryPanel } from './history-panel';
4
- export var UiUtils;
5
- (function (UiUtils) {
6
- function fileInput(initialText = 'Drag-n-drop here', initialValue = null, onValueChanged = null, fileType = EXCEL_BLOB_TYPE) {
7
- return new FileInput(initialText, initialValue, onValueChanged, fileType);
8
- }
9
- UiUtils.fileInput = fileInput;
10
- function historyInput(label, _funcName, _stringValueFunc, _visibleColumnsForGrid, _visibleColumnsForFilter = []) {
11
- return new HistoryInput(label, _funcName, _stringValueFunc, _visibleColumnsForGrid, _visibleColumnsForFilter);
12
- }
13
- UiUtils.historyInput = historyInput;
14
- function historyPanel(objFunc) {
15
- return new HistoryPanel(objFunc);
16
- }
17
- UiUtils.historyPanel = historyPanel;
18
- })(UiUtils || (UiUtils = {}));
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsZUFBZSxFQUFFLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sS0FBVyxPQUFPLENBdUJ2QjtBQXZCRCxXQUFpQixPQUFPO0lBQ3RCLFNBQWdCLFNBQVMsQ0FDdkIsV0FBVyxHQUFHLGtCQUFrQixFQUNoQyxlQUE0QixJQUFJLEVBQ2hDLGlCQUFrQyxJQUFJLEVBQ3RDLFFBQVEsR0FBRyxlQUFlO1FBRTFCLE9BQU8sSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQVBlLGlCQUFTLFlBT3hCLENBQUE7SUFFRCxTQUFnQixZQUFZLENBQzFCLEtBQWEsRUFDYixTQUFpQixFQUNqQixnQkFBcUQsRUFDckQsc0JBQTJFLEVBQzNFLDJCQUFxQyxFQUFFO1FBRXZDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFSZSxvQkFBWSxlQVEzQixDQUFBO0lBRUQsU0FBZ0IsWUFBWSxDQUFDLE9BQWdCO1FBQzNDLE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUZlLG9CQUFZLGVBRTNCLENBQUE7QUFDSCxDQUFDLEVBdkJnQixPQUFPLEtBQVAsT0FBTyxRQXVCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtFWENFTF9CTE9CX1RZUEUsIEZpbGVJbnB1dH0gZnJvbSAnLi9maWxlLWlucHV0JztcbmltcG9ydCB7SGlzdG9yeUlucHV0fSBmcm9tICcuL2hpc3RvcnktaW5wdXQnO1xuaW1wb3J0IHtIaXN0b3J5UGFuZWx9IGZyb20gJy4vaGlzdG9yeS1wYW5lbCc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgVWlVdGlscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiBmaWxlSW5wdXQoXG4gICAgaW5pdGlhbFRleHQgPSAnRHJhZy1uLWRyb3AgaGVyZScsXG4gICAgaW5pdGlhbFZhbHVlOiBGaWxlIHwgbnVsbCA9IG51bGwsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGwsXG4gICAgZmlsZVR5cGUgPSBFWENFTF9CTE9CX1RZUEVcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBGaWxlSW5wdXQoaW5pdGlhbFRleHQsIGluaXRpYWxWYWx1ZSwgb25WYWx1ZUNoYW5nZWQsIGZpbGVUeXBlKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5SW5wdXQoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBfZnVuY05hbWU6IHN0cmluZyxcbiAgICBfc3RyaW5nVmFsdWVGdW5jOiAoY3VycmVudFJ1bjogREcuRnVuY0NhbGwpID0+IHN0cmluZyxcbiAgICBfdmlzaWJsZUNvbHVtbnNGb3JHcmlkOiBSZWNvcmQ8c3RyaW5nLCAoY3VycmVudFJ1bjogREcuRnVuY0NhbGwpID0+IHN0cmluZz4sXG4gICAgX3Zpc2libGVDb2x1bW5zRm9yRmlsdGVyOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIHJldHVybiBuZXcgSGlzdG9yeUlucHV0KGxhYmVsLCBfZnVuY05hbWUsIF9zdHJpbmdWYWx1ZUZ1bmMsIF92aXNpYmxlQ29sdW1uc0ZvckdyaWQsIF92aXNpYmxlQ29sdW1uc0ZvckZpbHRlcik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaGlzdG9yeVBhbmVsKG9iakZ1bmM6IERHLkZ1bmMpIHtcbiAgICByZXR1cm4gbmV3IEhpc3RvcnlQYW5lbChvYmpGdW5jKTtcbiAgfVxufVxuIl19
@@ -1,56 +0,0 @@
1
- import ExcelJS from 'exceljs';
2
- type ValidationSuccess = {
3
- isValid: true;
4
- chainedFuncs?: ValidatingFunc[];
5
- result?: any;
6
- };
7
- type ValidationFailure = {
8
- isValid: false;
9
- caption: string;
10
- content: HTMLElement | string;
11
- };
12
- type ValidationResult = ValidationSuccess | ValidationFailure;
13
- export type ValidatingFunc = ((arg: any) => Promise<ValidationResult>);
14
- type InitialValidatingFunc<InitialArgType> = ((arg: InitialArgType) => Promise<ValidationResult>);
15
- declare class Validation<InitialArgType> {
16
- validators: InitialValidatingFunc<InitialArgType>[];
17
- constructor(validators?: InitialValidatingFunc<InitialArgType>[]);
18
- validate(initialArg: InitialArgType): Promise<boolean>;
19
- }
20
- export declare namespace v8n {
21
- const isSheetExist: (sheetName: string, chainedFuncs?: ValidatingFunc[]) => (importedWb: ExcelJS.Workbook) => Promise<{
22
- isValid: boolean;
23
- caption: string;
24
- content: string;
25
- chainedFuncs?: undefined;
26
- result?: undefined;
27
- } | {
28
- isValid: true;
29
- chainedFuncs: ValidatingFunc[] | undefined;
30
- result: ExcelJS.Worksheet;
31
- caption?: undefined;
32
- content?: undefined;
33
- }>;
34
- const isColumnExist: (columnName: string, chainedFuncs?: ValidatingFunc[]) => (sheet: ExcelJS.Worksheet) => Promise<{
35
- isValid: boolean;
36
- caption: string;
37
- content: string;
38
- chainedFuncs?: undefined;
39
- } | {
40
- isValid: true;
41
- chainedFuncs: ValidatingFunc[] | undefined;
42
- caption?: undefined;
43
- content?: undefined;
44
- }>;
45
- const isExcelParsed: (chainedFuncs?: ValidatingFunc[]) => (file: File) => Promise<{
46
- isValid: true;
47
- chainedFuncs: ValidatingFunc[] | undefined;
48
- result: ExcelJS.Workbook;
49
- } | {
50
- isValid: boolean;
51
- caption: string;
52
- content: string;
53
- }>;
54
- }
55
- export default Validation;
56
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["validation.ts"],"names":[],"mappings":"AAKA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,KAAK,iBAAiB,GAAG;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAA;CAAC,CAAC;AACxF,KAAK,iBAAiB,GAAG;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAA;CAAC,CAAC;AAC1F,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACvE,KAAK,qBAAqB,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAElG,cAAM,UAAU,CAAC,cAAc;IAGpB,UAAU,EAAE,qBAAqB,CAAC,cAAc,CAAC,EAAE;gBAAnD,UAAU,GAAE,qBAAqB,CAAC,cAAc,CAAC,EAAO;IAKpD,QAAQ,CAAC,UAAU,EAAE,cAAc;CAkFjD;AAED,yBAAiB,GAAG,CAAC;IACZ,MAAM,YAAY,cAAe,MAAM,iBAAiB,cAAc,EAAE,kBAAwB,QAAQ,QAAQ;;;;;;;;;;;;MAiBtH,CAAC;IAEK,MAAM,aAAa,eAAgB,MAAM,iBAAiB,cAAc,EAAE,aAAmB,QAAQ,SAAS;;;;;;;;;;MAkBpH,CAAC;IAEK,MAAM,aAAa,kBAAmB,cAAc,EAAE,YAAkB,IAAI;;;;;;;;MAmBlF,CAAC;CACH;AAED,eAAe,UAAU,CAAC"}
package/src/validation.js DELETED
@@ -1,152 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import * as ui from 'datagrok-api/ui';
11
- import * as DG from 'datagrok-api/dg';
12
- import $ from 'cash-dom';
13
- import ExcelJS from 'exceljs';
14
- class Validation {
15
- constructor(
16
- // Validation functions to be stored and applied
17
- validators = []) {
18
- this.validators = validators;
19
- }
20
- validate(initialArg) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- const failedValidations = [];
23
- const checkCustomValidators = (validators, result) => __awaiter(this, void 0, void 0, function* () {
24
- for (const validator of validators) {
25
- const validationRes = yield validator(result);
26
- if (!validationRes.isValid)
27
- failedValidations.push(validationRes);
28
- else if (validationRes.chainedFuncs)
29
- yield checkCustomValidators(validationRes.chainedFuncs, validationRes.result);
30
- }
31
- });
32
- for (const validator of this.validators) {
33
- const validationRes = yield validator(initialArg);
34
- if (!validationRes.isValid)
35
- failedValidations.push(validationRes);
36
- else if (validationRes.chainedFuncs)
37
- yield checkCustomValidators(validationRes.chainedFuncs, validationRes.result);
38
- }
39
- if (failedValidations.length == 0)
40
- return true;
41
- const wizard = new DG.Wizard({ title: 'Data validation failed' });
42
- failedValidations.forEach((validation) => {
43
- wizard.page({
44
- caption: validation.caption,
45
- root: (validation.content instanceof HTMLElement ? validation.content : ui.markdown(validation.content)),
46
- });
47
- });
48
- wizard.onOK(() => { });
49
- const btnCancel = wizard.getButton('CANCEL');
50
- const btnBack = wizard.getButton('<<');
51
- const btnNext = wizard.getButton('>>');
52
- const btnOk = wizard.getButton('OK');
53
- const pagesLength = wizard.pages.length;
54
- const stepCounter = ui.divText('1/' + pagesLength);
55
- stepCounter.style.position = 'absolute';
56
- stepCounter.style.left = '12px';
57
- stepCounter.style.color = 'var(--grey-5)';
58
- wizard.captionHost.style.fontSize = '20px';
59
- wizard.captionHost.style.fontWeight = '400';
60
- wizard.captionHost.style.margin = '6px 0';
61
- $(wizard.root).find('.d4-command-bar').append(stepCounter);
62
- $(btnBack).html('BACK');
63
- $(btnNext).html('NEXT');
64
- $(btnOk).addClass('disabled');
65
- btnCancel.style.display = 'none';
66
- btnBack.addEventListener('click', () => {
67
- const curIndex = wizard.pageIndex + 1;
68
- const pageIndex = wizard.pages.length;
69
- wizard.captionHost.style.fontSize = '20px';
70
- wizard.captionHost.style.fontWeight = '400';
71
- wizard.captionHost.style.margin = '6px 0';
72
- if (!wizard.completable)
73
- $(btnOk).addClass('disabled');
74
- stepCounter.textContent = curIndex + '/' + pageIndex;
75
- });
76
- btnNext.addEventListener('click', () => {
77
- const curIndex = wizard.pageIndex + 1;
78
- const pageIndex = wizard.pages.length;
79
- wizard.captionHost.style.fontSize = '20px';
80
- wizard.captionHost.style.fontWeight = '400';
81
- wizard.captionHost.style.margin = '6px 0';
82
- if (wizard.completable)
83
- $(btnOk).removeClass('disabled');
84
- stepCounter.textContent = curIndex + '/' + pageIndex;
85
- });
86
- wizard.show();
87
- return false;
88
- });
89
- }
90
- }
91
- export var v8n;
92
- (function (v8n) {
93
- v8n.isSheetExist = (sheetName, chainedFuncs) => (importedWb) => __awaiter(this, void 0, void 0, function* () {
94
- const datasetWs = importedWb.worksheets.find((ws) => ws.name === sheetName);
95
- if (!datasetWs) {
96
- return {
97
- isValid: false,
98
- caption: `Sheet named '${sheetName}' is not found`,
99
- content: `Sheet name should be exactly \`${sheetName}\` to be parsed.
100
- \n
101
- Please double-check:
102
- - No extra spaces are in the sheet name
103
- - Capitalization is the same as in the template
104
- \n
105
- ${importedWb.worksheets.length > 0 ? `Found sheets: \`${importedWb.worksheets.map((ws) => ws.name).join('`,`')}\`` : `No columns have found.`}
106
- `
107
- };
108
- }
109
- return { isValid: true, chainedFuncs, result: datasetWs };
110
- });
111
- v8n.isColumnExist = (columnName, chainedFuncs) => (sheet) => __awaiter(this, void 0, void 0, function* () {
112
- const vals = sheet.getRow(1).values;
113
- if (!vals.includes(columnName)) {
114
- return {
115
- isValid: false,
116
- caption: `No column "${columnName}" in "${sheet.name}" sheet`,
117
- content: `Column name should be exactly \`${columnName}\` to be parsed.
118
- \n
119
- Please double-check:
120
- - Column names are in the first row of the sheet
121
- - No extra spaces are in the cell
122
- - Capitalization is the same as in the template
123
- \n
124
- ${vals.length > 0 ? `Found columns: \`${vals.filter((val) => val !== '').join('`,`')}\`` : `No columns have found.`}
125
- `
126
- };
127
- }
128
- return { isValid: true, chainedFuncs };
129
- });
130
- v8n.isExcelParsed = (chainedFuncs) => (file) => __awaiter(this, void 0, void 0, function* () {
131
- const importedWb = new ExcelJS.Workbook();
132
- return importedWb.xlsx.load(yield file.arrayBuffer())
133
- .then((workbook) => __awaiter(this, void 0, void 0, function* () {
134
- return { isValid: true, chainedFuncs, result: workbook };
135
- }))
136
- .catch(() => {
137
- return {
138
- isValid: false,
139
- caption: 'File is failed to parse',
140
- content: `Please make sure:
141
- - XLSX format is used (not XLS or XLSM)
142
- - File should not be corrupted
143
- \n
144
- XLS could be converted to XLSX using Excel's export functionality. \n
145
- If the file is corrupted, it will not open in Excel.
146
- `,
147
- };
148
- });
149
- });
150
- })(v8n || (v8n = {}));
151
- export default Validation;
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFROUIsTUFBTSxVQUFVO0lBQ2Q7SUFDRSxnREFBZ0Q7SUFDekMsYUFBc0QsRUFBRTtRQUF4RCxlQUFVLEdBQVYsVUFBVSxDQUE4QztJQUdqRSxDQUFDO0lBRVksUUFBUSxDQUFDLFVBQTBCOztZQUM5QyxNQUFNLGlCQUFpQixHQUFHLEVBQXlCLENBQUM7WUFDcEQsTUFBTSxxQkFBcUIsR0FBRyxDQUFPLFVBQTRCLEVBQUUsTUFBVyxFQUFFLEVBQUU7Z0JBQ2hGLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO3dCQUN4QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQ25DLElBQUksYUFBYSxDQUFDLFlBQVk7d0JBQUUsTUFBTSxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDcEg7WUFDSCxDQUFDLENBQUEsQ0FBQztZQUVGLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDdkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTztvQkFDeEIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FB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b0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyx3QkFBd0I7U0FDekc7YUFDRixDQUFDO1NBQ0g7UUFDRCxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQVksRUFBRSxZQUFZLEVBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUEsQ0FBQztJQUVXLGlCQUFhLEdBQUcsQ0FBQyxZQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFPLElBQVUsRUFBRSxFQUFFO1FBQ3JGLE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDbEQsSUFBSSxDQUFDLENBQU8sUUFBUSxFQUFFLEVBQUU7WUFDdkIsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUEsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSx5QkFBeUI7Z0JBQ2xDLE9BQU8sRUFBRTs7Ozs7O1dBTVI7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUEsQ0FBQztBQUNKLENBQUMsRUE1RGdCLEdBQUcsS0FBSCxHQUFHLFFBNERuQjtBQUVELGVBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xuXG50eXBlIFZhbGlkYXRpb25TdWNjZXNzID0ge2lzVmFsaWQ6IHRydWUsIGNoYWluZWRGdW5jcz86IFZhbGlkYXRpbmdGdW5jW10sIHJlc3VsdD86IGFueX07XG50eXBlIFZhbGlkYXRpb25GYWlsdXJlID0ge2lzVmFsaWQ6IGZhbHNlLCBjYXB0aW9uOiBzdHJpbmcsIGNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgc3RyaW5nfTtcbnR5cGUgVmFsaWRhdGlvblJlc3VsdCA9IFZhbGlkYXRpb25TdWNjZXNzIHwgVmFsaWRhdGlvbkZhaWx1cmU7XG5leHBvcnQgdHlwZSBWYWxpZGF0aW5nRnVuYyA9ICgoYXJnOiBhbnkpID0+IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4pO1xudHlwZSBJbml0aWFsVmFsaWRhdGluZ0Z1bmM8SW5pdGlhbEFyZ1R5cGU+ID0gKChhcmc6IEluaXRpYWxBcmdUeXBlKSA9PiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+KTtcblxuY2xhc3MgVmFsaWRhdGlvbjxJbml0aWFsQXJnVHlwZT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAvLyBWYWxpZGF0aW9uIGZ1bmN0aW9ucyB0byBiZSBzdG9yZWQgYW5kIGFwcGxpZWRcbiAgICBwdWJsaWMgdmFsaWRhdG9yczogSW5pdGlhbFZhbGlkYXRpbmdGdW5jPEluaXRpYWxBcmdUeXBlPltdID0gW11cbiAgKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShpbml0aWFsQXJnOiBJbml0aWFsQXJnVHlwZSkge1xuICAgIGNvbnN0IGZhaWxlZFZhbGlkYXRpb25zID0gW10gYXMgVmFsaWRhdGlvbkZhaWx1cmVbXTtcbiAgICBjb25zdCBjaGVja0N1c3RvbVZhbGlkYXRvcnMgPSBhc3luYyAodmFsaWRhdG9yczogVmFsaWRhdGluZ0Z1bmNbXSwgcmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlcyA9IGF3YWl0IHZhbGlkYXRvcihyZXN1bHQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXMuaXNWYWxpZClcbiAgICAgICAgICBmYWlsZWRWYWxpZGF0aW9ucy5wdXNoKHZhbGlkYXRpb25SZXMpO1xuICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uUmVzLmNoYWluZWRGdW5jcykgYXdhaXQgY2hlY2tDdXN0b21WYWxpZGF0b3JzKHZhbGlkYXRpb25SZXMuY2hhaW5lZEZ1bmNzLCB2YWxpZGF0aW9uUmVzLnJlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHRoaXMudmFsaWRhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlcyA9IGF3YWl0IHZhbGlkYXRvcihpbml0aWFsQXJnKTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlcy5pc1ZhbGlkKVxuICAgICAgICBmYWlsZWRWYWxpZGF0aW9ucy5wdXNoKHZhbGlkYXRpb25SZXMpO1xuICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblJlcy5jaGFpbmVkRnVuY3MpIGF3YWl0IGNoZWNrQ3VzdG9tVmFsaWRhdG9ycyh2YWxpZGF0aW9uUmVzLmNoYWluZWRGdW5jcywgdmFsaWRhdGlvblJlcy5yZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRWYWxpZGF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB3aXphcmQgPSBuZXcgREcuV2l6YXJkKHt0aXRsZTogJ0RhdGEgdmFsaWRhdGlvbiBmYWlsZWQnfSk7XG5cbiAgICBmYWlsZWRWYWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZGF0aW9uKSA9PiB7XG4gICAgICB3aXphcmQucGFnZSh7XG4gICAgICAgIGNhcHRpb246IHZhbGlkYXRpb24uY2FwdGlvbixcbiAgICAgICAgcm9vdDogKHZhbGlkYXRpb24uY29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdmFsaWRhdGlvbi5jb250ZW50IDogdWkubWFya2Rvd24odmFsaWRhdGlvbi5jb250ZW50KSkgYXMgSFRNTERpdkVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB3aXphcmQub25PSygoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBidG5DYW5jZWwgPSB3aXphcmQuZ2V0QnV0dG9uKCdDQU5DRUwnKTtcbiAgICBjb25zdCBidG5CYWNrID0gd2l6YXJkLmdldEJ1dHRvbignPDwnKTtcbiAgICBjb25zdCBidG5OZXh0ID0gd2l6YXJkLmdldEJ1dHRvbignPj4nKTtcbiAgICBjb25zdCBidG5PayA9IHdpemFyZC5nZXRCdXR0b24oJ09LJyk7XG5cbiAgICBjb25zdCBwYWdlc0xlbmd0aCA9IHdpemFyZC5wYWdlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBzdGVwQ291bnRlciA9IHVpLmRpdlRleHQoJzEvJytwYWdlc0xlbmd0aCk7XG4gICAgc3RlcENvdW50ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHN0ZXBDb3VudGVyLnN0eWxlLmxlZnQgPSAnMTJweCc7XG4gICAgc3RlcENvdW50ZXIuc3R5bGUuY29sb3IgPSAndmFyKC0tZ3JleS01KSc7XG5cbiAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XG4gICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUubWFyZ2luID0gJzZweCAwJztcblxuICAgICQod2l6YXJkLnJvb3QpLmZpbmQoJy5kNC1jb21tYW5kLWJhcicpLmFwcGVuZChzdGVwQ291bnRlcik7XG4gICAgJChidG5CYWNrKS5odG1sKCdCQUNLJyk7XG4gICAgJChidG5OZXh0KS5odG1sKCdORVhUJyk7XG4gICAgJChidG5PaykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgYnRuQ2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICBidG5CYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PntcbiAgICAgIGNvbnN0IGN1ckluZGV4ID0gd2l6YXJkLnBhZ2VJbmRleCsxO1xuICAgICAgY29uc3QgcGFnZUluZGV4ID0gd2l6YXJkLnBhZ2VzLmxlbmd0aDtcblxuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgIHdpemFyZC5jYXB0aW9uSG9zdC5zdHlsZS5tYXJnaW4gPSAnNnB4IDAnO1xuXG4gICAgICBpZiAoIXdpemFyZC5jb21wbGV0YWJsZSlcbiAgICAgICAgJChidG5PaykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICAgIHN0ZXBDb3VudGVyLnRleHRDb250ZW50ID0gY3VySW5kZXgrJy8nK3BhZ2VJbmRleDtcbiAgICB9KTtcblxuICAgIGJ0bk5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+e1xuICAgICAgY29uc3QgY3VySW5kZXggPSB3aXphcmQucGFnZUluZGV4KzE7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSB3aXphcmQucGFnZXMubGVuZ3RoO1xuXG4gICAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XG4gICAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFdlaWdodCA9ICc0MDAnO1xuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLm1hcmdpbiA9ICc2cHggMCc7XG5cbiAgICAgIGlmICh3aXphcmQuY29tcGxldGFibGUpXG4gICAgICAgICQoYnRuT2spLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgc3RlcENvdW50ZXIudGV4dENvbnRlbnQgPSBjdXJJbmRleCsnLycrcGFnZUluZGV4O1xuICAgIH0pO1xuXG4gICAgd2l6YXJkLnNob3coKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSB2OG4ge1xuICBleHBvcnQgY29uc3QgaXNTaGVldEV4aXN0ID0gKHNoZWV0TmFtZTogc3RyaW5nLCBjaGFpbmVkRnVuY3M/OiBWYWxpZGF0aW5nRnVuY1tdKSA9PiBhc3luYyAoaW1wb3J0ZWRXYjogRXhjZWxKUy5Xb3JrYm9vaykgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRXcyA9IGltcG9ydGVkV2Iud29ya3NoZWV0cy5maW5kKCh3cykgPT4gd3MubmFtZSA9PT0gc2hlZXROYW1lKTtcbiAgICBpZiAoIWRhdGFzZXRXcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGNhcHRpb246IGBTaGVldCBuYW1lZCAnJHtzaGVldE5hbWV9JyBpcyBub3QgZm91bmRgLFxuICAgICAgICBjb250ZW50OiBgU2hlZXQgbmFtZSBzaG91bGQgYmUgZXhhY3RseSBcXGAke3NoZWV0TmFtZX1cXGAgdG8gYmUgcGFyc2VkLiBcblxcbiAgIFxuUGxlYXNlIGRvdWJsZS1jaGVjazpcbi0gTm8gZXh0cmEgc3BhY2VzIGFyZSBpbiB0aGUgc2hlZXQgbmFtZVxuLSBDYXBpdGFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgdGVtcGxhdGVcblxcblxuJHtpbXBvcnRlZFdiLndvcmtzaGVldHMubGVuZ3RoID4gMCA/IGBGb3VuZCBzaGVldHM6IFxcYCR7aW1wb3J0ZWRXYi53b3Jrc2hlZXRzLm1hcCgod3MpID0+IHdzLm5hbWUpLmpvaW4oJ2AsYCcpfVxcYGA6IGBObyBjb2x1bW5zIGhhdmUgZm91bmQuYH0gXG4gICAgICAgIGBcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7aXNWYWxpZDogdHJ1ZSBhcyB0cnVlLCBjaGFpbmVkRnVuY3MsIHJlc3VsdDogZGF0YXNldFdzfTtcbiAgfTtcblxuICBleHBvcnQgY29uc3QgaXNDb2x1bW5FeGlzdCA9IChjb2x1bW5OYW1lOiBzdHJpbmcsIGNoYWluZWRGdW5jcz86IFZhbGlkYXRpbmdGdW5jW10pID0+IGFzeW5jIChzaGVldDogRXhjZWxKUy5Xb3Jrc2hlZXQpID0+IHtcbiAgICBjb25zdCB2YWxzID0gc2hlZXQuZ2V0Um93KDEpLnZhbHVlcyBhcyBFeGNlbEpTLkNlbGxWYWx1ZVtdO1xuICAgIGlmICghdmFscy5pbmNsdWRlcyhjb2x1bW5OYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGNhcHRpb246IGBObyBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgaW4gXCIke3NoZWV0Lm5hbWV9XCIgc2hlZXRgLFxuICAgICAgICBjb250ZW50OiBgQ29sdW1uIG5hbWUgc2hvdWxkIGJlIGV4YWN0bHkgXFxgJHtjb2x1bW5OYW1lfVxcYCB0byBiZSBwYXJzZWQuIFxuXFxuXG5QbGVhc2UgZG91YmxlLWNoZWNrOlxuLSBDb2x1bW4gbmFtZXMgYXJlIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHNoZWV0XG4tIE5vIGV4dHJhIHNwYWNlcyBhcmUgaW4gdGhlIGNlbGxcbi0gQ2FwaXRhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHRlbXBsYXRlXG5cXG5cbiR7dmFscy5sZW5ndGggPiAwID8gYEZvdW5kIGNvbHVtbnM6IFxcYCR7dmFscy5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSAnJykuam9pbignYCxgJyl9XFxgYDogYE5vIGNvbHVtbnMgaGF2ZSBmb3VuZC5gfSBcbiAgICAgICAgYFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtpc1ZhbGlkOiB0cnVlIGFzIHRydWUsIGNoYWluZWRGdW5jc307XG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGlzRXhjZWxQYXJzZWQgPSAoY2hhaW5lZEZ1bmNzPzogVmFsaWRhdGluZ0Z1bmNbXSkgPT4gYXN5bmMgKGZpbGU6IEZpbGUpID0+IHtcbiAgICBjb25zdCBpbXBvcnRlZFdiID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcbiAgICByZXR1cm4gaW1wb3J0ZWRXYi54bHN4LmxvYWQoYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgLnRoZW4oYXN5bmMgKHdvcmtib29rKSA9PiB7XG4gICAgICAgIHJldHVybiB7aXNWYWxpZDogdHJ1ZSBhcyB0cnVlLCBjaGFpbmVkRnVuY3MsIHJlc3VsdDogd29ya2Jvb2t9O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgY2FwdGlvbjogJ0ZpbGUgaXMgZmFpbGVkIHRvIHBhcnNlJyxcbiAgICAgICAgICBjb250ZW50OiBgUGxlYXNlIG1ha2Ugc3VyZTpcbi0gWExTWCBmb3JtYXQgaXMgdXNlZCAobm90IFhMUyBvciBYTFNNKVxuLSBGaWxlIHNob3VsZCBub3QgYmUgY29ycnVwdGVkXG5cXG5cblhMUyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gWExTWCB1c2luZyBFeGNlbCdzIGV4cG9ydCBmdW5jdGlvbmFsaXR5LiBcXG5cbklmIHRoZSBmaWxlIGlzIGNvcnJ1cHRlZCwgaXQgd2lsbCBub3Qgb3BlbiBpbiBFeGNlbC4gXG4gICAgICAgICAgYCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBWYWxpZGF0aW9uO1xuIl19