@datagrok-libraries/utils 4.3.3 → 4.3.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # utils changelog
2
2
 
3
+ ## 4.3.4 (2024-09-25)
4
+
5
+ ### New features
6
+
7
+ * utils lib: Add setActive and onValueChanged for ActiveFiles for dialog history
8
+
3
9
  ## 4.2.30 (2024-09-06)
4
10
 
5
11
  - Preparing 1.21.1 release
@@ -22,7 +28,7 @@ Invocation time refactoring
22
28
 
23
29
  ## 4.2.25 (2024-08-15)
24
30
 
25
- Added invocation time to tests
31
+ Added invocation time to tests
26
32
 
27
33
  ## 4.2.24 (2024-08-09)
28
34
 
@@ -46,8 +52,7 @@ Optimize linesrenderer for short lines and no mouseover checking conditions. add
46
52
 
47
53
  ## 4.2.19 (2024-08-02)
48
54
 
49
- Fix benchmark timeout
50
-
55
+ Fix benchmark timeout
51
56
 
52
57
  ## 4.2.18 (2024-08-02)
53
58
 
@@ -63,7 +68,7 @@ Fixed core tests output to the Test Manager app
63
68
 
64
69
  ## 4.2.15 (2024-07-30)
65
70
 
66
- Removed Unhadled exception test for benchmarks
71
+ Removed Unhadled exception test for benchmarks
67
72
 
68
73
  ## 4.2.14 (2024-07-29)
69
74
 
@@ -151,7 +156,8 @@ Fix the lastError problem in the test engine.
151
156
 
152
157
  ### Features
153
158
 
154
- * [#2687](https://github.com/datagrok-ai/public/issues/2687): Forms viewer: Added an option to adjust the size of the molecule.
159
+ * [#2687](https://github.com/datagrok-ai/public/issues/2687): Forms viewer: Added an option to adjust the size of the
160
+ molecule.
155
161
  * Lowered line threshold for scatterplot lines renderer.
156
162
 
157
163
  ## 4.1.43 (2024-02-15)
@@ -175,7 +181,7 @@ Fix the lastError problem in the test engine.
175
181
 
176
182
  * Added to testViewer support options.awaitViewer
177
183
 
178
- ### Bug fixes
184
+ ### Bug fixes
179
185
 
180
186
  * Fixed testViewer for element selector
181
187
 
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "email": "aparamonov@datagrok.ai"
9
9
  },
10
10
  "fullName": "Utils",
11
- "version": "4.3.3",
11
+ "version": "4.3.4",
12
12
  "description": "Common utilities",
13
13
  "dependencies": {
14
14
  "cash-dom": "^8.1.1",
@@ -7,16 +7,24 @@ export declare class ActiveFiles {
7
7
  readonly path: string;
8
8
  readonly userStorageName: string;
9
9
  /**file extension to filter files in file open dialog*/ readonly ext: string;
10
+ protected readonly options?: {
11
+ onValueChanged: (value: string[]) => void;
12
+ } | undefined;
10
13
  private settings?;
11
14
  protected constructor(path: string, userStorageName: string,
12
- /**file extension to filter files in file open dialog*/ ext?: string);
15
+ /**file extension to filter files in file open dialog*/ ext?: string, options?: {
16
+ onValueChanged: (value: string[]) => void;
17
+ } | undefined);
13
18
  getUserSettings(): Promise<FilesSettings>;
14
19
  setUserSettings(value: FilesSettings): void;
15
20
  protected getAllAvailable(): Promise<string[]>;
16
21
  getActive(): Promise<string[]>;
22
+ setActive(value: string[]): void;
17
23
  protected createInput(available: string, isChecked: boolean): DG.InputBase<boolean>;
18
24
  protected getInputs(): Promise<DG.InputBase<boolean>[]>;
19
25
  getForm(): Promise<HTMLDivElement>;
26
+ protected inputs: Map<string, DG.InputBase<boolean>> | null;
27
+ protected fireOnValueChanged(): void;
20
28
  private updateSelectionStatus;
21
29
  private availableRemove;
22
30
  private getNewAvailable;
@@ -1 +1 @@
1
- {"version":3,"file":"active-files-base.d.ts","sourceRoot":"","sources":["active-files-base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,qBAAa,WAAW;aAIJ,IAAI,EAAE,MAAM;aACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,UAAgB,GAAG,EAAE,MAAM;IALpF,OAAO,CAAC,QAAQ,CAAC,CAAgB;IAEjC,SAAS,aACS,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,CAAgB,GAAG,GAAE,MAAe;IAMvF,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC;IAa/C,eAAe,CAAC,KAAK,EAAE,aAAa;cAKpB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASvC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ3C,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;cAiBnE,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAahD,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;YAgBjC,qBAAqB;YAgBrB,eAAe;YAUf,eAAe;CAa9B"}
1
+ {"version":3,"file":"active-files-base.d.ts","sourceRoot":"","sources":["active-files-base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,qBAAa,WAAW;aAIJ,IAAI,EAAE,MAAM;aACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,UAAiB,GAAG,EAAE,MAAM;IACnF,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;gCAA4B,MAAM,EAAE,KAAK,IAAI;;IAN1E,OAAO,CAAC,QAAQ,CAAC,CAAgB;IAEjC,SAAS,aACS,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,CAAiB,GAAG,GAAE,MAAe,EACzE,OAAO,CAAC;gCAA4B,MAAM,EAAE,KAAK,IAAI;iBAAE;IAMtE,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC;IAa/C,eAAe,CAAC,KAAK,EAAE,aAAa;cAKpB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASvC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQpC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAOvC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;cAiBnE,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAgBhD,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAoB/C,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAQ;IAEnE,SAAS,CAAC,kBAAkB,IAAI,IAAI;YAKtB,qBAAqB;YAiBrB,eAAe;YAYf,eAAe;CAa9B"}
@@ -10,12 +10,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import * as grok from 'datagrok-api/grok';
11
11
  import * as ui from 'datagrok-api/ui';
12
12
  import * as DG from 'datagrok-api/dg';
13
+ import wu from 'wu';
13
14
  export class ActiveFiles {
14
15
  constructor(path, userStorageName,
15
- /**file extension to filter files in file open dialog*/ ext = '.csv') {
16
+ /**file extension to filter files in file open dialog*/ ext = '.csv', options) {
16
17
  this.path = path;
17
18
  this.userStorageName = userStorageName;
18
19
  this.ext = ext;
20
+ this.options = options;
21
+ this.inputs = null;
19
22
  if ('/' !== this.path[this.path.length - 1])
20
23
  this.path += '/';
21
24
  if ('.' !== this.ext[0])
@@ -53,6 +56,12 @@ export class ActiveFiles {
53
56
  return (yield this.getAllAvailable()).filter((available) => !settings.excluded.includes(available));
54
57
  });
55
58
  }
59
+ setActive(value) {
60
+ const valueSet = new Set(value);
61
+ for (const [file, input] of this.inputs.entries()) {
62
+ input.value = valueSet.has(file);
63
+ }
64
+ }
56
65
  createInput(available, isChecked) {
57
66
  const cb = ui.input.bool(available, {
58
67
  value: isChecked,
@@ -69,13 +78,16 @@ export class ActiveFiles {
69
78
  }
70
79
  getInputs() {
71
80
  return __awaiter(this, void 0, void 0, function* () {
81
+ this.inputs = new Map();
72
82
  const all = yield this.getAllAvailable();
73
83
  const active = yield this.getActive();
74
84
  const inputs = new Array(all.length);
75
85
  for (let i = 0; i < all.length; i++) {
76
86
  const isChecked = active.includes(all[i]);
77
87
  inputs[i] = this.createInput(all[i], isChecked);
88
+ this.inputs.set(all[i], inputs[i]);
78
89
  }
90
+ this.fireOnValueChanged();
79
91
  return inputs;
80
92
  });
81
93
  }
@@ -88,31 +100,42 @@ export class ActiveFiles {
88
100
  ui.button('ADD', () => __awaiter(this, void 0, void 0, function* () {
89
101
  let newAvailable = '';
90
102
  newAvailable = yield this.getNewAvailable();
91
- if (newAvailable !== '')
92
- inputsDiv.append(this.createInput(newAvailable, true).root);
103
+ if (newAvailable !== '') {
104
+ const newInput = this.createInput(newAvailable, true);
105
+ inputsDiv.append(newInput.root);
106
+ this.inputs.set(newAvailable, newInput);
107
+ this.fireOnValueChanged();
108
+ }
93
109
  }))
94
110
  ]);
95
111
  return formDiv;
96
112
  });
97
113
  }
98
- updateSelectionStatus(available, newisChecked) {
114
+ fireOnValueChanged() {
115
+ var _a;
116
+ (_a = this.options) === null || _a === void 0 ? void 0 : _a.onValueChanged(wu(this.inputs.entries()).filter(([_, i]) => i.value).map(([a, _]) => a).toArray());
117
+ }
118
+ updateSelectionStatus(available, newIsChecked) {
99
119
  return __awaiter(this, void 0, void 0, function* () {
100
120
  const settings = yield this.getUserSettings();
101
- const oldisChecked = !settings.excluded.includes(available);
102
- if (oldisChecked === newisChecked)
121
+ const oldIsChecked = !settings.excluded.includes(available);
122
+ if (oldIsChecked === newIsChecked)
103
123
  return;
104
- if (newisChecked) {
124
+ if (newIsChecked) {
105
125
  const index = settings.excluded.indexOf(available);
106
126
  if (index > -1)
107
127
  settings.excluded.splice(index, 1);
108
128
  }
109
129
  else
110
130
  settings.excluded.push(available);
131
+ this.fireOnValueChanged();
111
132
  this.setUserSettings(settings);
112
133
  });
113
134
  }
114
135
  availableRemove(available) {
115
136
  return __awaiter(this, void 0, void 0, function* () {
137
+ this.inputs.delete(available);
138
+ this.fireOnValueChanged();
116
139
  const settings = yield this.getUserSettings();
117
140
  const index = settings.excluded.indexOf(available);
118
141
  if (index > -1)
@@ -138,4 +161,4 @@ export class ActiveFiles {
138
161
  });
139
162
  }
140
163
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWZpbGVzLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhY3RpdmUtZmlsZXMtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU90QyxNQUFNLE9BQU8sV0FBVztJQUd0QixZQUNrQixJQUFZLEVBQ1osZUFBdUI7SUFDdkMsdURBQXVELENBQWdCLE1BQWMsTUFBTTtRQUYzRSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osb0JBQWUsR0FBZixlQUFlLENBQVE7UUFDZ0MsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFFM0YsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckQsQ0FBQztJQUVLLGVBQWU7O1lBQ25CLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXZCLE1BQU0sTUFBTSxHQUF1QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEs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QUMsQ0FBQztRQUM1RCxDQUFDO0tBQUE7SUFFYSxlQUFlOztZQUMzQixPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUM3QyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztvQkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNoQixJQUFJLEVBQUUsQ0FBTyxZQUFZLEVBQUUsRUFBRTt3QkFDM0IsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2hELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBUSxDQUFDLENBQUM7d0JBQ2pHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEIsQ0FBQyxDQUFBO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5leHBvcnQgdHlwZSBGaWxlc1NldHRpbmdzID0ge1xuICBleGNsdWRlZDogc3RyaW5nW10sXG4gIGV4cGxpY2l0OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZlRmlsZXMge1xuICBwcml2YXRlIHNldHRpbmdzPzogRmlsZXNTZXR0aW5ncztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXNlclN0b3JhZ2VOYW1lOiBzdHJpbmcsXG4gICAgLyoqZmlsZSBleHRlbnNpb24gdG8gZmlsdGVyIGZpbGVzIGluIGZpbGUgb3BlbiBkaWFsb2cqL3B1YmxpYyByZWFkb25seSBleHQ6IHN0cmluZyA9ICcuY3N2J1xuICApIHtcbiAgICBpZiAoJy8nICE9PSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdKSB0aGlzLnBhdGggKz0gJy8nO1xuICAgIGlmICgnLicgIT09IHRoaXMuZXh0WzBdKSB0aGlzLmV4dCA9ICcuJyArIHRoaXMuZXh0O1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8RmlsZXNTZXR0aW5ncz4ge1xuICAgIGlmICh0aGlzLnNldHRpbmdzKVxuICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG5cbiAgICBjb25zdCByZXNTdHI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdyb2sudXNlclNldHRpbmdzLmdldFZhbHVlKHRoaXMudXNlclN0b3JhZ2VOYW1lLCAnU2V0dGluZ3MnKTtcbiAgICBjb25zdCByZXMgPSByZXNTdHIgPyBKU09OLnBhcnNlKHJlc1N0cikgOiB7ZXhjbHVkZWQ6IFtdLCBleHBsaWNpdDogW119O1xuXG4gICAgcmVzLmV4cGxpY2l0ID0gcmVzLmV4cGxpY2l0IGluc3RhbmNlb2YgQXJyYXkgPyByZXMuZXhwbGljaXQgOiBbXTtcbiAgICByZXMuZXhjbHVkZWQgPSByZXMuZXhjbHVkZWQgaW5zdGFuY2VvZiBBcnJheSA/IHJlcy5leGNsdWRlZCA6IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MgPSByZXM7XG4gIH1cblxuICBzZXRVc2VyU2V0dGluZ3ModmFsdWU6IEZpbGVzU2V0dGluZ3MpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gdmFsdWU7XG4gICAgZ3Jvay51c2VyU2V0dGluZ3MuYWRkKHRoaXMudXNlclN0b3JhZ2VOYW1lLCAnU2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFsbEF2YWlsYWJsZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IGdyb2suZGFwaS5maWxlcy5saXN0KHRoaXMucGF0aCk7XG4gICAgY29uc3QgcGF0aHMgPSBsaXN0Lm1hcCgoZmlsZUluZm8pID0+IHtcbiAgICAgIHJldHVybiBmaWxlSW5mby5mdWxsUGF0aC5yZXBsYWNlKGAke3RoaXMucGF0aH1gLCAnJyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWN0aXZlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgaWYgKHNldHRpbmdzLmV4cGxpY2l0Lmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc2V0dGluZ3MuZXhwbGljaXQ7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0QWxsQXZhaWxhYmxlKCkpLmZpbHRlcigoYXZhaWxhYmxlKSA9PiAhc2V0dGluZ3MuZXhjbHVkZWQuaW5jbHVkZXMoYXZhaWxhYmxlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXQoYXZhaWxhYmxlOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbik6IERHLklucHV0QmFzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2IgPSB1aS5pbnB1dC5ib29sKGF2YWlsYWJsZSwge1xuICAgICAgdmFsdWU6IGlzQ2hlY2tlZCxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWUpID0+IHRoaXMudXBkYXRlU2VsZWN0aW9uU3RhdHVzKGF2YWlsYWJsZSwgdmFsdWUpXG4gICAgfSkgYXMgREcuSW5wdXRCYXNlPGJvb2xlYW4+O1xuICAgIGNiLmFkZE9wdGlvbnModWkuYnV0dG9uKHVpLmljb25GQSgndHJhc2gnKSwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVtRGlhbG9nID0gdWkuZGlhbG9nKHt0aXRsZTogJ1dhcm5pbmcnfSkuYWRkKHVpLmRpdlRleHQoYERlbGV0ZSBmaWxlICcke2F2YWlsYWJsZX0nP2ApKS5vbk9LKCgpID0+IHtcbiAgICAgICAgY2Iucm9vdC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVSZW1vdmUoYXZhaWxhYmxlKTsgLy9hc3luY1xuICAgICAgfSk7XG5cbiAgICAgIHJlbURpYWxvZy5zaG93KCk7XG4gICAgfSwgYERlbGV0ZSAke2F2YWlsYWJsZX1gKSk7XG5cbiAgICByZXR1cm4gY2I7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRzKCk6IFByb21pc2U8REcuSW5wdXRCYXNlPGJvb2xlYW4+W10+IHtcbiAgICBjb25zdCBhbGwgPSBhd2FpdCB0aGlzLmdldEFsbEF2YWlsYWJsZSgpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgY29uc3QgaW5wdXRzOiBERy5JbnB1dEJhc2U8Ym9vbGVhbj5bXSA9IG5ldyBBcnJheTxERy5JbnB1dEJhc2U8Ym9vbGVhbj4+KGFsbC5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGFjdGl2ZS5pbmNsdWRlcyhhbGxbaV0pO1xuICAgICAgaW5wdXRzW2ldID0gdGhpcy5jcmVhdGVJbnB1dChhbGxbaV0sIGlzQ2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGb3JtKCk6IFByb21pc2U8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICBjb25zdCBpbnB1dHMgPSBhd2FpdCB0aGlzLmdldElucHV0cygpO1xuICAgIGNvbnN0IGlucHV0c0RpdiA9IHVpLmRpdlYoaW5wdXRzKTtcbiAgICBjb25zdCBmb3JtRGl2ID0gdWkuZGl2ViggW1xuICAgICAgaW5wdXRzRGl2LFxuICAgICAgdWkuYnV0dG9uKCdBREQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBuZXdBdmFpbGFibGU6IHN0cmluZyA9ICcnO1xuICAgICAgICBuZXdBdmFpbGFibGUgPSBhd2FpdCB0aGlzLmdldE5ld0F2YWlsYWJsZSgpO1xuICAgICAgICBpZiAobmV3QXZhaWxhYmxlICE9PSAnJylcbiAgICAgICAgICBpbnB1dHNEaXYuYXBwZW5kKHRoaXMuY3JlYXRlSW5wdXQobmV3QXZhaWxhYmxlLCB0cnVlKS5yb290KTtcbiAgICAgIH0pXG4gICAgXSk7XG5cbiAgICByZXR1cm4gZm9ybURpdjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlU2VsZWN0aW9uU3RhdHVzKGF2YWlsYWJsZTogc3RyaW5nLCBuZXdpc0NoZWNrZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgY29uc3Qgb2xkaXNDaGVja2VkID0gIXNldHRpbmdzLmV4Y2x1ZGVkLmluY2x1ZGVzKGF2YWlsYWJsZSk7XG4gICAgaWYgKG9sZGlzQ2hlY2tlZCA9PT0gbmV3aXNDaGVja2VkKVxuICAgICAgcmV0dXJuO1xuXG4gICAgaWYgKG5ld2lzQ2hlY2tlZCkge1xuICAgICAgY29uc3QgaW5kZXggPSBzZXR0aW5ncy5leGNsdWRlZC5pbmRleE9mKGF2YWlsYWJsZSk7XG4gICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgc2V0dGluZ3MuZXhjbHVkZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9IGVsc2VcbiAgICAgIHNldHRpbmdzLmV4Y2x1ZGVkLnB1c2goYXZhaWxhYmxlKTtcblxuICAgIHRoaXMuc2V0VXNlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXZhaWxhYmxlUmVtb3ZlKGF2YWlsYWJsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xuICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MuZXhjbHVkZWQuaW5kZXhPZihhdmFpbGFibGUpO1xuICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgc2V0dGluZ3MuZXhjbHVkZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNldFVzZXJTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgYXdhaXQgZ3Jvay5kYXBpLmZpbGVzLmRlbGV0ZSh0aGlzLnBhdGggKyBhdmFpbGFibGUpO1xuICAgIGdyb2suc2hlbGwuaW5mbyhgRmlsZSAke2F2YWlsYWJsZX0gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TmV3QXZhaWxhYmxlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgREcuVXRpbHMub3BlbkZpbGUoe1xuICAgICAgICBhY2NlcHQ6IHRoaXMuZXh0LFxuICAgICAgICBvcGVuOiBhc3luYyAoc2VsZWN0ZWRGaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IHNlbGVjdGVkRmlsZS5uYW1lO1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHNlbGVjdGVkRmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgIGF3YWl0IGdyb2suZGFwaS5maWxlcy53cml0ZSh0aGlzLnBhdGggKyBgJHtzZWxlY3RlZEZpbGUubmFtZX1gLCAobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSkgYXMgYW55KTtcbiAgICAgICAgICByZXNvbHZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWZpbGVzLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhY3RpdmUtZmlsZXMtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFPcEIsTUFBTSxPQUFPLFdBQVc7SUFHdEIsWUFDa0IsSUFBWSxFQUNaLGVBQXVCO0lBQ3ZDLHVEQUF1RCxDQUFpQixNQUFjLE1BQU0sRUFDekUsT0FBdUQ7UUFIMUQsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBQ2lDLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQ3pFLFlBQU8sR0FBUCxPQUFPLENBQWdEO1FBcUdsRSxXQUFNLEdBQThDLElBQUksQ0FBQztRQW5HakUsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckQsQ0FBQztJQUVLLGVBQWU7O1lBQ25CLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXZCLE1BQU0sTUFBTSxHQUF1QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sR0FBRyxH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QztZQUMvQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzVELENBQUM7S0FBQTtJQUVhLGVBQWU7O1lBQzNCLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzdDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2hCLElBQUksRUFBRSxDQUFPLFlBQVksRUFBRSxFQUFFO3dCQUMzQixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDaEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFRLENBQUMsQ0FBQzt3QkFDakcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQixDQUFDLENBQUE7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB3dSBmcm9tICd3dSc7XG5cbmV4cG9ydCB0eXBlIEZpbGVzU2V0dGluZ3MgPSB7XG4gIGV4Y2x1ZGVkOiBzdHJpbmdbXSxcbiAgZXhwbGljaXQ6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVGaWxlcyB7XG4gIHByaXZhdGUgc2V0dGluZ3M/OiBGaWxlc1NldHRpbmdzO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1c2VyU3RvcmFnZU5hbWU6IHN0cmluZyxcbiAgICAvKipmaWxlIGV4dGVuc2lvbiB0byBmaWx0ZXIgZmlsZXMgaW4gZmlsZSBvcGVuIGRpYWxvZyovIHB1YmxpYyByZWFkb25seSBleHQ6IHN0cmluZyA9ICcuY3N2JyxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucz86IHsgb25WYWx1ZUNoYW5nZWQ6ICh2YWx1ZTogc3RyaW5nW10pID0+IHZvaWQgfVxuICApIHtcbiAgICBpZiAoJy8nICE9PSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdKSB0aGlzLnBhdGggKz0gJy8nO1xuICAgIGlmICgnLicgIT09IHRoaXMuZXh0WzBdKSB0aGlzLmV4dCA9ICcuJyArIHRoaXMuZXh0O1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8RmlsZXNTZXR0aW5ncz4ge1xuICAgIGlmICh0aGlzLnNldHRpbmdzKVxuICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG5cbiAgICBjb25zdCByZXNTdHI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdyb2sudXNlclNldHRpbmdzLmdldFZhbHVlKHRoaXMudXNlclN0b3JhZ2VOYW1lLCAnU2V0dGluZ3MnKTtcbiAgICBjb25zdCByZXMgPSByZXNTdHIgPyBKU09OLnBhcnNlKHJlc1N0cikgOiB7ZXhjbHVkZWQ6IFtdLCBleHBsaWNpdDogW119O1xuXG4gICAgcmVzLmV4cGxpY2l0ID0gcmVzLmV4cGxpY2l0IGluc3RhbmNlb2YgQXJyYXkgPyByZXMuZXhwbGljaXQgOiBbXTtcbiAgICByZXMuZXhjbHVkZWQgPSByZXMuZXhjbHVkZWQgaW5zdGFuY2VvZiBBcnJheSA/IHJlcy5leGNsdWRlZCA6IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MgPSByZXM7XG4gIH1cblxuICBzZXRVc2VyU2V0dGluZ3ModmFsdWU6IEZpbGVzU2V0dGluZ3MpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gdmFsdWU7XG4gICAgZ3Jvay51c2VyU2V0dGluZ3MuYWRkKHRoaXMudXNlclN0b3JhZ2VOYW1lLCAnU2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFsbEF2YWlsYWJsZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IGdyb2suZGFwaS5maWxlcy5saXN0KHRoaXMucGF0aCk7XG4gICAgY29uc3QgcGF0aHMgPSBsaXN0Lm1hcCgoZmlsZUluZm8pID0+IHtcbiAgICAgIHJldHVybiBmaWxlSW5mby5mdWxsUGF0aC5yZXBsYWNlKGAke3RoaXMucGF0aH1gLCAnJyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWN0aXZlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgaWYgKHNldHRpbmdzLmV4cGxpY2l0Lmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc2V0dGluZ3MuZXhwbGljaXQ7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0QWxsQXZhaWxhYmxlKCkpLmZpbHRlcigoYXZhaWxhYmxlKSA9PiAhc2V0dGluZ3MuZXhjbHVkZWQuaW5jbHVkZXMoYXZhaWxhYmxlKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlKHZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlU2V0ID0gbmV3IFNldCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBbZmlsZSwgaW5wdXRdIG9mIHRoaXMuaW5wdXRzIS5lbnRyaWVzKCkpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gdmFsdWVTZXQuaGFzKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dChhdmFpbGFibGU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogREcuSW5wdXRCYXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjYiA9IHVpLmlucHV0LmJvb2woYXZhaWxhYmxlLCB7XG4gICAgICB2YWx1ZTogaXNDaGVja2VkLFxuICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh2YWx1ZSkgPT4gdGhpcy51cGRhdGVTZWxlY3Rpb25TdGF0dXMoYXZhaWxhYmxlLCB2YWx1ZSlcbiAgICB9KSBhcyBERy5JbnB1dEJhc2U8Ym9vbGVhbj47XG4gICAgY2IuYWRkT3B0aW9ucyh1aS5idXR0b24odWkuaWNvbkZBKCd0cmFzaCcpLCAoKSA9PiB7XG4gICAgICBjb25zdCByZW1EaWFsb2cgPSB1aS5kaWFsb2coe3RpdGxlOiAnV2FybmluZyd9KS5hZGQodWkuZGl2VGV4dChgRGVsZXRlIGZpbGUgJyR7YXZhaWxhYmxlfSc/YCkpLm9uT0soKCkgPT4ge1xuICAgICAgICBjYi5yb290LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVJlbW92ZShhdmFpbGFibGUpOyAvL2FzeW5jXG4gICAgICB9KTtcblxuICAgICAgcmVtRGlhbG9nLnNob3coKTtcbiAgICB9LCBgRGVsZXRlICR7YXZhaWxhYmxlfWApKTtcblxuICAgIHJldHVybiBjYjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dHMoKTogUHJvbWlzZTxERy5JbnB1dEJhc2U8Ym9vbGVhbj5bXT4ge1xuICAgIHRoaXMuaW5wdXRzID0gbmV3IE1hcDxzdHJpbmcsIERHLklucHV0QmFzZTxib29sZWFuPj4oKTtcbiAgICBjb25zdCBhbGwgPSBhd2FpdCB0aGlzLmdldEFsbEF2YWlsYWJsZSgpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgY29uc3QgaW5wdXRzOiBERy5JbnB1dEJhc2U8Ym9vbGVhbj5bXSA9IG5ldyBBcnJheTxERy5JbnB1dEJhc2U8Ym9vbGVhbj4+KGFsbC5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGFjdGl2ZS5pbmNsdWRlcyhhbGxbaV0pO1xuICAgICAgaW5wdXRzW2ldID0gdGhpcy5jcmVhdGVJbnB1dChhbGxbaV0sIGlzQ2hlY2tlZCk7XG4gICAgICB0aGlzLmlucHV0cy5zZXQoYWxsW2ldLCBpbnB1dHNbaV0pO1xuICAgIH1cblxuICAgIHRoaXMuZmlyZU9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGb3JtKCk6IFByb21pc2U8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICBjb25zdCBpbnB1dHMgPSBhd2FpdCB0aGlzLmdldElucHV0cygpO1xuICAgIGNvbnN0IGlucHV0c0RpdiA9IHVpLmRpdlYoaW5wdXRzKTtcbiAgICBjb25zdCBmb3JtRGl2ID0gdWkuZGl2VihbXG4gICAgICBpbnB1dHNEaXYsXG4gICAgICB1aS5idXR0b24oJ0FERCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG5ld0F2YWlsYWJsZTogc3RyaW5nID0gJyc7XG4gICAgICAgIG5ld0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMuZ2V0TmV3QXZhaWxhYmxlKCk7XG4gICAgICAgIGlmIChuZXdBdmFpbGFibGUgIT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgbmV3SW5wdXQgPSB0aGlzLmNyZWF0ZUlucHV0KG5ld0F2YWlsYWJsZSwgdHJ1ZSk7XG4gICAgICAgICAgaW5wdXRzRGl2LmFwcGVuZChuZXdJbnB1dC5yb290KTtcbiAgICAgICAgICB0aGlzLmlucHV0cyEuc2V0KG5ld0F2YWlsYWJsZSwgbmV3SW5wdXQpO1xuICAgICAgICAgIHRoaXMuZmlyZU9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXSk7XG5cbiAgICByZXR1cm4gZm9ybURpdjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnB1dHM6IE1hcDxzdHJpbmcsIERHLklucHV0QmFzZTxib29sZWFuPj4gfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZmlyZU9uVmFsdWVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucz8ub25WYWx1ZUNoYW5nZWQoXG4gICAgICB3dSh0aGlzLmlucHV0cyEuZW50cmllcygpKS5maWx0ZXIoKFtfLCBpXSkgPT4gaS52YWx1ZSkubWFwKChbYSwgX10pID0+IGEpLnRvQXJyYXkoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVNlbGVjdGlvblN0YXR1cyhhdmFpbGFibGU6IHN0cmluZywgbmV3SXNDaGVja2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xuICAgIGNvbnN0IG9sZElzQ2hlY2tlZCA9ICFzZXR0aW5ncy5leGNsdWRlZC5pbmNsdWRlcyhhdmFpbGFibGUpO1xuICAgIGlmIChvbGRJc0NoZWNrZWQgPT09IG5ld0lzQ2hlY2tlZClcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChuZXdJc0NoZWNrZWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MuZXhjbHVkZWQuaW5kZXhPZihhdmFpbGFibGUpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgIHNldHRpbmdzLmV4Y2x1ZGVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBlbHNlXG4gICAgICBzZXR0aW5ncy5leGNsdWRlZC5wdXNoKGF2YWlsYWJsZSk7XG4gICAgdGhpcy5maXJlT25WYWx1ZUNoYW5nZWQoKTtcblxuICAgIHRoaXMuc2V0VXNlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXZhaWxhYmxlUmVtb3ZlKGF2YWlsYWJsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbnB1dHMhLmRlbGV0ZShhdmFpbGFibGUpO1xuICAgIHRoaXMuZmlyZU9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xuICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MuZXhjbHVkZWQuaW5kZXhPZihhdmFpbGFibGUpO1xuICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgc2V0dGluZ3MuZXhjbHVkZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNldFVzZXJTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgYXdhaXQgZ3Jvay5kYXBpLmZpbGVzLmRlbGV0ZSh0aGlzLnBhdGggKyBhdmFpbGFibGUpO1xuICAgIGdyb2suc2hlbGwuaW5mbyhgRmlsZSAke2F2YWlsYWJsZX0gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TmV3QXZhaWxhYmxlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgREcuVXRpbHMub3BlbkZpbGUoe1xuICAgICAgICBhY2NlcHQ6IHRoaXMuZXh0LFxuICAgICAgICBvcGVuOiBhc3luYyAoc2VsZWN0ZWRGaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IHNlbGVjdGVkRmlsZS5uYW1lO1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHNlbGVjdGVkRmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgIGF3YWl0IGdyb2suZGFwaS5maWxlcy53cml0ZSh0aGlzLnBhdGggKyBgJHtzZWxlY3RlZEZpbGUubmFtZX1gLCAobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSkgYXMgYW55KTtcbiAgICAgICAgICByZXNvbHZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19