@wavemaker/app-ng-runtime 11.14.0-rc.6276 → 11.14.1-3.6306

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 (63) hide show
  1. package/components/base/bundles/index.umd.js +89 -17
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
  3. package/components/base/esm2022/utils/widget-utils.mjs +5 -3
  4. package/components/base/esm2022/widgets/common/base/base.component.mjs +68 -7
  5. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -3
  6. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
  7. package/components/base/fesm2022/index.mjs +90 -18
  8. package/components/base/fesm2022/index.mjs.map +1 -1
  9. package/components/base/pipes/custom-pipes.d.ts +5 -5
  10. package/components/basic/label/bundles/index.umd.js +9 -1
  11. package/components/basic/label/esm2022/label.directive.mjs +10 -2
  12. package/components/basic/label/fesm2022/index.mjs +9 -1
  13. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  14. package/components/data/table/bundles/index.umd.js +218 -11
  15. package/components/data/table/esm2022/table.component.mjs +219 -12
  16. package/components/data/table/fesm2022/index.mjs +218 -11
  17. package/components/data/table/fesm2022/index.mjs.map +1 -1
  18. package/components/data/table/table.component.d.ts +6 -2
  19. package/components/dialogs/default/bundles/index.umd.js +21 -18
  20. package/components/dialogs/default/dialog-header/dialog-header.component.d.ts +4 -1
  21. package/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +13 -10
  22. package/components/dialogs/default/fesm2022/index.mjs +9 -6
  23. package/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  24. package/components/navigation/menu/bundles/index.umd.js +5 -0
  25. package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
  26. package/components/navigation/menu/fesm2022/index.mjs +5 -0
  27. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  28. package/components/navigation/popover/bundles/index.umd.js +6 -6
  29. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  30. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  31. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  32. package/components/navigation/popover/popover.component.d.ts +6 -0
  33. package/core/bundles/index.umd.js +332 -82
  34. package/core/esm2022/public_api.mjs +3 -3
  35. package/core/esm2022/types/types.mjs +1 -1
  36. package/core/esm2022/utils/utils.mjs +6 -2
  37. package/core/esm2022/utils/watcher.mjs +323 -81
  38. package/core/fesm2022/index.mjs +331 -84
  39. package/core/fesm2022/index.mjs.map +1 -1
  40. package/core/public_api.d.ts +2 -2
  41. package/core/types/types.d.ts +1 -0
  42. package/core/utils/utils.d.ts +1 -0
  43. package/core/utils/watcher.d.ts +26 -5
  44. package/npm-shrinkwrap.json +2 -2
  45. package/package-lock.json +2 -2
  46. package/package.json +1 -1
  47. package/runtime/base/bundles/index.umd.js +38 -2
  48. package/runtime/base/esm2022/components/app-component/app.component.mjs +7 -2
  49. package/runtime/base/esm2022/components/base-page.component.mjs +9 -2
  50. package/runtime/base/esm2022/components/base-partial.component.mjs +10 -2
  51. package/runtime/base/esm2022/components/base-prefab.component.mjs +10 -2
  52. package/runtime/base/esm2022/components/base-spa-page.component.mjs +9 -2
  53. package/runtime/base/esm2022/services/app.service.mjs +2 -1
  54. package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
  55. package/runtime/base/fesm2022/index.mjs +39 -3
  56. package/runtime/base/fesm2022/index.mjs.map +1 -1
  57. package/runtime/base/services/app.service.d.ts +1 -0
  58. package/scripts/@wavemaker/nvd3/build/nv.d3.min.js +1 -1
  59. package/scripts/datatable/datatable.js +19 -2
  60. package/transpiler/bundles/index.umd.js +1 -1
  61. package/transpiler/esm2022/imports.mjs +2 -2
  62. package/transpiler/fesm2022/index.mjs +1 -1
  63. package/transpiler/fesm2022/index.mjs.map +1 -1
@@ -2,14 +2,25 @@ import { IDGenerator } from './id-generator';
2
2
  import { $parseExpr } from './expression-parser';
3
3
  import { findValueOf } from './utils';
4
4
  import { clone, flatten, isArray, isEqual, isObject } from "lodash-es";
5
+ // Constants
6
+ const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
7
+ const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
8
+ const ARRAY_INDEX_PLACEHOLDER = '[$i]';
9
+ const ARRAY_INDEX_ZERO = '[0]';
10
+ const DEBOUNCE_WAIT = 100;
11
+ const MAX_WATCH_CYCLES = 5;
5
12
  const registry = new Map();
6
13
  const watchIdGenerator = new IDGenerator('watch-id-');
7
- export const FIRST_TIME_WATCH = {};
8
- Object.freeze(FIRST_TIME_WATCH);
9
- export const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
14
+ export const FIRST_TIME_WATCH = Object.freeze({});
15
+ // State
10
16
  let muted = false;
17
+ let changedByWatch = false;
18
+ let skipWatchers = false;
19
+ let ngZone;
11
20
  let appRef;
12
- export const debounce = (fn, wait = 50) => {
21
+ // Utility functions
22
+ export const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
23
+ export const debounce = (fn, wait = DEBOUNCE_WAIT) => {
13
24
  let timeout;
14
25
  return (...args) => {
15
26
  window['__zone_symbol__clearTimeout'](timeout);
@@ -23,115 +34,345 @@ export const unMuteWatchers = () => {
23
34
  muted = false;
24
35
  triggerWatchers();
25
36
  };
37
+ /**
38
+ * Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
39
+ */
40
+ const getWidgetId = (identifier) => {
41
+ if (!identifier || typeof identifier !== 'string') {
42
+ return null;
43
+ }
44
+ const match = identifier.match(WIDGET_ID_REGEX);
45
+ return match ? match[1] : null;
46
+ };
47
+ /**
48
+ * Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
49
+ */
50
+ const getPropertyName = (identifier) => {
51
+ if (!identifier || typeof identifier !== 'string') {
52
+ return identifier;
53
+ }
54
+ const match = identifier.match(WIDGET_PROPERTY_REGEX);
55
+ return match ? match[1] : identifier;
56
+ };
57
+ /**
58
+ * Array consumer wrapper for array-based expressions
59
+ */
26
60
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
27
- let data = newVal, formattedData;
28
- if (isArray(data)) {
29
- formattedData = data.map(function (datum) {
30
- return findValueOf(datum, restExpr);
31
- });
32
- // If resulting structure is an array of array, flatten it
33
- if (isArray(formattedData[0])) {
34
- formattedData = flatten(formattedData);
35
- }
36
- listenerFn(formattedData, oldVal);
61
+ if (!isArray(newVal)) {
62
+ return;
37
63
  }
64
+ let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
65
+ // Flatten if result is array of arrays
66
+ if (isArray(formattedData[0])) {
67
+ formattedData = flatten(formattedData);
68
+ }
69
+ listenerFn(formattedData, oldVal);
38
70
  };
39
- const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
40
- // listener doesn't accept array
41
- // replace all `[$i]` with `[0]` and return the expression
42
- let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
71
+ /**
72
+ * Updates watch info for array expressions
73
+ */
74
+ const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
75
+ const regex = /\[\$i\]/g;
43
76
  if (!acceptsArray) {
44
77
  return {
45
- 'expr': expr.replace(regex, $0),
46
- 'listener': listener
78
+ expr: expr.replace(regex, ARRAY_INDEX_ZERO),
79
+ listener
47
80
  };
48
81
  }
49
- // listener accepts array
50
- // replace all except the last `[$i]` with `[0]` and return the expression.
51
- var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
52
- if (restExpr) {
53
- arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
54
- }
82
+ const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
83
+ const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
84
+ const restExpr = expr.substring(lastIndex + ARRAY_INDEX_PLACEHOLDER.length);
85
+ const arrayConsumerFn = restExpr
86
+ ? arrayConsumer.bind(undefined, listener, restExpr)
87
+ : listener;
55
88
  return {
56
- 'expr': _expr,
57
- 'listener': arrayConsumerFn
89
+ expr: baseExpr,
90
+ listener: arrayConsumerFn
58
91
  };
59
92
  };
93
+ /**
94
+ * Determines if an expression is static (doesn't need to be watched)
95
+ */
96
+ const STATIC_EXPRESSION_NAMES = [
97
+ "row.getProperty('investment')",
98
+ "row.getProperty('factsheetLink')",
99
+ "row.getProperty('isRebalanceEligible')"
100
+ ];
101
+ const isStaticExpression = (expr) => {
102
+ if (typeof expr !== 'string') {
103
+ return false;
104
+ }
105
+ const trimmedExpr = expr.trim();
106
+ // Expressions that always evaluate to localization strings
107
+ if (trimmedExpr.includes('appLocale')) {
108
+ return true;
109
+ }
110
+ // Hard-coded static expression names
111
+ if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
112
+ return true;
113
+ }
114
+ return false;
115
+ };
116
+ /**
117
+ * Gets the scope type from the scope object
118
+ */
119
+ const getScopeType = ($scope) => {
120
+ if (!$scope) {
121
+ return null;
122
+ }
123
+ if ($scope.pageName)
124
+ return 'Page';
125
+ if ($scope.prefabName)
126
+ return 'Prefab';
127
+ if ($scope.partialName)
128
+ return 'Partial';
129
+ // Check for App scope
130
+ if ($scope.Variables !== undefined &&
131
+ $scope.Actions !== undefined &&
132
+ !$scope.pageName &&
133
+ !$scope.prefabName &&
134
+ !$scope.partialName) {
135
+ return 'App';
136
+ }
137
+ if ($scope.constructor?.name === 'AppRef') {
138
+ return 'App';
139
+ }
140
+ return null;
141
+ };
142
+ /**
143
+ * Gets scope name based on scope type
144
+ */
145
+ const getScopeName = ($scope, scopeType) => {
146
+ if (!scopeType || !$scope) {
147
+ return null;
148
+ }
149
+ switch (scopeType) {
150
+ case 'Prefab': return $scope.prefabName || null;
151
+ case 'Partial': return $scope.partialName || null;
152
+ case 'Page': return $scope.pageName || null;
153
+ default: return null;
154
+ }
155
+ };
156
+ /**
157
+ * Main watch function
158
+ */
60
159
  export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
61
- if (expr.indexOf('[$i]') !== -1) {
62
- let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
160
+ // Handle array expressions
161
+ if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
162
+ const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
63
163
  expr = watchInfo.expr;
64
164
  listener = watchInfo.listener;
65
165
  }
166
+ // Handle static expressions
167
+ if (isStaticExpression(expr)) {
168
+ try {
169
+ const fn = $parseExpr(expr);
170
+ const staticValue = fn($scope, $locals);
171
+ listener(staticValue, FIRST_TIME_WATCH);
172
+ }
173
+ catch (e) {
174
+ console.warn(`Error evaluating static expression '${expr}':`, e);
175
+ listener(undefined, FIRST_TIME_WATCH);
176
+ }
177
+ return () => { }; // No-op unsubscribe
178
+ }
66
179
  const fn = $parseExpr(expr);
67
- registry.set(identifier, {
68
- fn: fn.bind(expr, $scope, $locals),
180
+ const scopeType = getScopeType($scope);
181
+ const scopeName = getScopeName($scope, scopeType);
182
+ const watchInfo = {
183
+ fn: fn.bind(null, $scope, $locals),
69
184
  listener,
70
185
  expr,
71
186
  last: FIRST_TIME_WATCH,
72
187
  doNotClone,
73
- isMuted: isMuted
74
- });
188
+ isMuted,
189
+ scopeType,
190
+ scopeName
191
+ };
192
+ // Store in registry
193
+ const widgetId = getWidgetId(identifier);
194
+ if (widgetId) {
195
+ const propertyName = getPropertyName(identifier);
196
+ if (!registry.has(widgetId)) {
197
+ registry.set(widgetId, {});
198
+ }
199
+ const widgetGroup = registry.get(widgetId);
200
+ widgetGroup[propertyName] = watchInfo;
201
+ }
202
+ else {
203
+ registry.set(identifier, watchInfo);
204
+ }
75
205
  return () => $unwatch(identifier);
76
206
  };
77
- export const $unwatch = identifier => registry.delete(identifier);
78
- let changedByWatch = false;
79
- const $RAF = window.requestAnimationFrame;
80
- let ngZone;
81
- const triggerWatchers = (ignoreMuted) => {
207
+ /**
208
+ * Unwatches a single identifier
209
+ */
210
+ export const $unwatch = (identifier) => {
211
+ const widgetId = getWidgetId(identifier);
212
+ if (widgetId) {
213
+ const propertyName = getPropertyName(identifier);
214
+ const widgetGroup = registry.get(widgetId);
215
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
216
+ const watchInfo = widgetGroup[propertyName];
217
+ if (watchInfo) {
218
+ delete widgetGroup[propertyName];
219
+ // Clean up empty widget groups
220
+ if (Object.keys(widgetGroup).length === 0) {
221
+ registry.delete(widgetId);
222
+ }
223
+ return true;
224
+ }
225
+ }
226
+ }
227
+ // Fallback to direct lookup
228
+ if (registry.has(identifier)) {
229
+ registry.delete(identifier);
230
+ return true;
231
+ }
232
+ return false;
233
+ };
234
+ /**
235
+ * Unwatches all watchers for a specific widget ID
236
+ */
237
+ export const $unwatchAll = (widgetId) => {
238
+ if (!widgetId || typeof widgetId !== 'string') {
239
+ return 0;
240
+ }
241
+ const widgetGroup = registry.get(widgetId);
242
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
243
+ const count = Object.keys(widgetGroup).length;
244
+ registry.delete(widgetId);
245
+ return count;
246
+ }
247
+ // Fallback: find all identifiers starting with this widget ID
248
+ let removedCount = 0;
249
+ const identifiersToRemove = [];
250
+ registry.forEach((_, key) => {
251
+ if (key.startsWith(widgetId + '_')) {
252
+ identifiersToRemove.push(key);
253
+ }
254
+ });
255
+ identifiersToRemove.forEach(identifier => {
256
+ if ($unwatch(identifier)) {
257
+ removedCount++;
258
+ }
259
+ });
260
+ return removedCount;
261
+ };
262
+ /**
263
+ * Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
264
+ * Now works directly with the main registry instead of separate scoped registries
265
+ */
266
+ export const $unwatchAllByScope = (scopeType, scopeName) => {
267
+ if (!scopeType) {
268
+ return 0;
269
+ }
270
+ let removedCount = 0;
271
+ const identifiersToRemove = [];
272
+ registry.forEach((value, key) => {
273
+ // Handle grouped structure (widget groups)
274
+ if (value && typeof value === 'object' && !value.fn) {
275
+ Object.entries(value).forEach(([propertyName, watchInfo]) => {
276
+ if (watchInfo?.scopeType === scopeType &&
277
+ (!scopeName || watchInfo.scopeName === scopeName)) {
278
+ identifiersToRemove.push(`${key}_${propertyName}`);
279
+ }
280
+ });
281
+ }
282
+ else {
283
+ // Direct watchInfo
284
+ const watchInfo = value;
285
+ if (watchInfo?.scopeType === scopeType &&
286
+ (!scopeName || watchInfo.scopeName === scopeName)) {
287
+ identifiersToRemove.push(key);
288
+ }
289
+ }
290
+ });
291
+ // Unwatch all collected identifiers
292
+ identifiersToRemove.forEach(identifier => {
293
+ if ($unwatch(identifier)) {
294
+ removedCount++;
295
+ }
296
+ });
297
+ return removedCount;
298
+ };
299
+ /**
300
+ * Processes a single watch info during trigger cycle
301
+ */
302
+ const processWatchInfo = (watchInfo) => {
303
+ if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
304
+ return false;
305
+ }
306
+ let newValue;
307
+ try {
308
+ newValue = watchInfo.fn();
309
+ }
310
+ catch (e) {
311
+ console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
312
+ return false;
313
+ }
314
+ if (isEqual(newValue, watchInfo.last)) {
315
+ return false;
316
+ }
317
+ // Change detected
318
+ changedByWatch = true;
319
+ watchInfo.last = isObject(newValue) && !watchInfo.doNotClone
320
+ ? clone(newValue)
321
+ : newValue;
322
+ watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
323
+ changedByWatch = false;
324
+ return true;
325
+ };
326
+ /**
327
+ * Triggers all watchers
328
+ */
329
+ const triggerWatchers = (ignoreMuted = false) => {
82
330
  if (muted && !ignoreMuted) {
83
331
  return;
84
332
  }
85
- const limit = 5;
86
333
  let pass = 1;
87
334
  let changeDetected;
88
335
  do {
89
336
  changeDetected = false;
90
- registry.forEach(watchInfo => {
91
- if (watchInfo.isMuted && watchInfo.isMuted()) {
92
- return;
93
- }
94
- const fn = watchInfo.fn;
95
- const listener = watchInfo.listener;
96
- const ov = watchInfo.last;
97
- let nv;
98
- try {
99
- nv = fn();
100
- }
101
- catch (e) {
102
- console.warn(`error in executing expression: '${watchInfo.expr}'`);
337
+ registry.forEach((value) => {
338
+ // Handle grouped structure
339
+ if (value && typeof value === 'object' && !value.fn) {
340
+ Object.values(value).forEach((watchInfo) => {
341
+ if (processWatchInfo(watchInfo)) {
342
+ changeDetected = true;
343
+ }
344
+ });
103
345
  }
104
- if (!isEqual(nv, ov)) {
105
- changeDetected = true;
106
- changedByWatch = true;
107
- watchInfo.last = nv;
108
- // @ts-ignore
109
- if (isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
110
- watchInfo.last = clone(nv);
346
+ else {
347
+ // Direct watchInfo
348
+ if (processWatchInfo(value)) {
349
+ changeDetected = true;
111
350
  }
112
- listener(nv, ov);
113
- resetChangeFromWatch();
114
351
  }
115
352
  });
116
353
  pass++;
117
- } while (changeDetected && pass < limit);
118
- if (changeDetected && pass === limit) {
119
- console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
354
+ } while (changeDetected && pass < MAX_WATCH_CYCLES);
355
+ if (changeDetected && pass === MAX_WATCH_CYCLES) {
356
+ console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
120
357
  }
121
358
  };
122
- export const setNgZone = zone => ngZone = zone;
123
- export const setAppRef = ref => {
359
+ // Angular zone integration
360
+ export const setNgZone = (zone) => {
361
+ ngZone = zone;
362
+ };
363
+ export const setAppRef = (ref) => {
124
364
  appRef = ref;
125
365
  };
126
366
  export const isChangeFromWatch = () => changedByWatch;
127
- export const resetChangeFromWatch = () => changedByWatch = false;
128
- window.watchRegistry = registry;
129
- let skipWatchers;
367
+ export const resetChangeFromWatch = () => {
368
+ changedByWatch = false;
369
+ };
370
+ // Debounced trigger
130
371
  const debouncedTriggerWatchers = debounce(() => {
131
372
  skipWatchers = true;
132
373
  ngZone.run(() => triggerWatchers());
133
- }, 100);
134
- export const $invokeWatchers = (force, ignoreMuted) => {
374
+ }, DEBOUNCE_WAIT);
375
+ export const $invokeWatchers = (force = false, ignoreMuted = false) => {
135
376
  if (force) {
136
377
  triggerWatchers(ignoreMuted);
137
378
  }
@@ -145,7 +386,8 @@ export const $invokeWatchers = (force, ignoreMuted) => {
145
386
  };
146
387
  export const $appDigest = (() => {
147
388
  let queued = false;
148
- return (force) => {
389
+ const $RAF = window.requestAnimationFrame;
390
+ return (force = false) => {
149
391
  if (!appRef) {
150
392
  return;
151
393
  }
@@ -157,14 +399,14 @@ export const $appDigest = (() => {
157
399
  if (queued) {
158
400
  return;
159
401
  }
160
- else {
161
- queued = true;
162
- $RAF(() => {
163
- ngZone.run(() => appRef.tick());
164
- queued = false;
165
- });
166
- }
402
+ queued = true;
403
+ $RAF(() => {
404
+ ngZone.run(() => appRef.tick());
405
+ queued = false;
406
+ });
167
407
  }
168
408
  };
169
409
  })();
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRTtJQUM3QixLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7SUFDL0IsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGVBQWUsRUFBRSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDM0QsSUFBSSxJQUFJLEdBQUcsTUFBTSxFQUNiLGFBQWEsQ0FBQztJQUVsQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hCLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSztZQUNwQyxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QixhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRTtJQUN4RCxnQ0FBZ0M7SUFDaEMsMERBQTBEO0lBQzFELElBQUksS0FBSyxHQUFHLFVBQVUsRUFDbEIsRUFBRSxHQUFrQixNQUFNLEVBQzFCLEVBQUUsR0FBa0IsS0FBSyxDQUFDO0lBQzlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQixPQUFPO1lBQ0gsTUFBTSxFQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxVQUFVLEVBQUcsUUFBUTtTQUN4QixDQUFDO0lBQ04sQ0FBQztJQUVELHlCQUF5QjtJQUN6QiwyRUFBMkU7SUFDM0UsSUFBSSxLQUFLLEdBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFDdEMsS0FBSyxHQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQ3ZELFFBQVEsR0FBVSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFDeEMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUUvQixJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ1gsZUFBZSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTztRQUNILE1BQU0sRUFBTyxLQUFLO1FBQ2xCLFVBQVUsRUFBRyxlQUFlO0tBQy9CLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsU0FBVyxFQUFFLEVBQUUsT0FBdUIsRUFBRSxFQUFFO0lBQzNKLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlCLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUN0QixRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTVCLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQ2xDLFFBQVE7UUFDUixJQUFJO1FBQ0osSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixVQUFVO1FBQ1YsT0FBTyxFQUFFLE9BQU87S0FDbkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVsRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFFM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0FBRTFDLElBQUksTUFBTSxDQUFDO0FBRVgsTUFBTSxlQUFlLEdBQUcsQ0FBQyxXQUFxQixFQUFFLEVBQUU7SUFFOUMsSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixPQUFPO0lBQ1gsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLGNBQWMsQ0FBQztJQUVuQixHQUFHLENBQUM7UUFDQSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDekIsSUFBRyxTQUFTLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUNwQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQzFCLElBQUksRUFBRSxDQUFDO1lBRVAsSUFBSSxDQUFDO2dCQUNELEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNkLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNuQixjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFFcEIsYUFBYTtnQkFDYixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDdEUsU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakIsb0JBQW9CLEVBQUUsQ0FBQztZQUMzQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FBQztJQUVYLENBQUMsUUFBUSxjQUFjLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRTtJQUV6QyxJQUFJLGNBQWMsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxtREFBbUQsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUM5RSxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUU7SUFDM0IsTUFBTSxHQUFHLEdBQUcsQ0FBQTtBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxFQUFFLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUUzRCxNQUFPLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUV2QyxJQUFJLFlBQVksQ0FBQztBQUVqQixNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7SUFDM0MsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRVIsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBZSxFQUFFLFdBQXFCLEVBQUUsRUFBRTtJQUN0RSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7U0FBTSxDQUFDO1FBRUosSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDckIsT0FBTztRQUNYLENBQUM7UUFDRCx3QkFBd0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDNUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxLQUFlLEVBQUUsRUFBRTtRQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULE9BQU87WUFDWCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2Nsb25lLCBmbGF0dGVuLCBpc0FycmF5LCBpc0VxdWFsLCBpc09iamVjdH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IHt9O1xuXG5PYmplY3QuZnJlZXplKEZJUlNUX1RJTUVfV0FUQ0gpO1xuXG5leHBvcnQgY29uc3QgaXNGaXJzdFRpbWVDaGFuZ2UgPSB2ID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGFwcFJlZjtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gKGZuOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyID0gNTApID0+IHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbmNvbnN0IGFycmF5Q29uc3VtZXIgPSAobGlzdGVuZXJGbiwgcmVzdEV4cHIsIG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgbGV0IGRhdGEgPSBuZXdWYWwsXG4gICAgICAgIGZvcm1hdHRlZERhdGE7XG5cbiAgICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZFZhbHVlT2YoZGF0dW0sIHJlc3RFeHByKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgcmVzdWx0aW5nIHN0cnVjdHVyZSBpcyBhbiBhcnJheSBvZiBhcnJheSwgZmxhdHRlbiBpdFxuICAgICAgICBpZiAoaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGZsYXR0ZW4oZm9ybWF0dGVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5lckZuKGZvcm1hdHRlZERhdGEsIG9sZFZhbCk7XG4gICAgfVxufTtcblxuY29uc3QgZ2V0VXBkYXRlZFdhdGNJbmZvID0gKGV4cHIsIGFjY2VwdHNBcnJheSwgbGlzdGVuZXIpID0+IHtcbiAgICAvLyBsaXN0ZW5lciBkb2Vzbid0IGFjY2VwdCBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb25cbiAgICBsZXQgcmVnZXggPSAvXFxbXFwkaVxcXS9nLFxuICAgICAgICAkSSAgICAgICAgICAgICAgICA9ICdbJGldJyxcbiAgICAgICAgJDAgICAgICAgICAgICAgICAgPSAnWzBdJztcbiAgICBpZiAoIWFjY2VwdHNBcnJheSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2V4cHInICAgICA6IGV4cHIucmVwbGFjZShyZWdleCwgJDApLFxuICAgICAgICAgICAgJ2xpc3RlbmVyJyA6IGxpc3RlbmVyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbGlzdGVuZXIgYWNjZXB0cyBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGV4Y2VwdCB0aGUgbGFzdCBgWyRpXWAgd2l0aCBgWzBdYCBhbmQgcmV0dXJuIHRoZSBleHByZXNzaW9uLlxuICAgIHZhciBpbmRleCAgICAgICAgICAgPSBleHByLmxhc3RJbmRleE9mKCRJKSxcbiAgICAgICAgX2V4cHIgICAgICAgICAgID0gZXhwci5zdWJzdHIoMCwgaW5kZXgpLnJlcGxhY2UoJEksICQwKSxcbiAgICAgICAgcmVzdEV4cHIgICAgICAgID0gZXhwci5zdWJzdHIoaW5kZXggKyA1KSxcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gbGlzdGVuZXI7XG5cbiAgICBpZiAocmVzdEV4cHIpIHtcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gYXJyYXlDb25zdW1lci5iaW5kKHVuZGVmaW5lZCwgbGlzdGVuZXIsIHJlc3RFeHByKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAnZXhwcicgICAgIDogX2V4cHIsXG4gICAgICAgICdsaXN0ZW5lcicgOiBhcnJheUNvbnN1bWVyRm5cbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0ICR3YXRjaCA9IChleHByLCAkc2NvcGUsICRsb2NhbHMsIGxpc3RlbmVyLCBpZGVudGlmaWVyID0gd2F0Y2hJZEdlbmVyYXRvci5uZXh0VWlkKCksIGRvTm90Q2xvbmUgPSBmYWxzZSwgY29uZmlnOmFueT17fSwgaXNNdXRlZD86ICgpID0+IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZXhwci5pbmRleE9mKCdbJGldJykgIT09IC0xKSB7XG4gICAgICAgIGxldCB3YXRjaEluZm8gPSBnZXRVcGRhdGVkV2F0Y0luZm8oZXhwciwgY29uZmlnICYmIChjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QpLCBsaXN0ZW5lcik7XG4gICAgICAgIGV4cHIgPSB3YXRjaEluZm8uZXhwcjtcbiAgICAgICAgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcblxuICAgIHJlZ2lzdHJ5LnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgIGZuOiBmbi5iaW5kKGV4cHIsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkOiBpc011dGVkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG5leHBvcnQgY29uc3QgJHVud2F0Y2ggPSBpZGVudGlmaWVyID0+IHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcblxubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbmNvbnN0ICRSQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5sZXQgbmdab25lO1xuXG5jb25zdCB0cmlnZ2VyV2F0Y2hlcnMgPSAoaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG5cbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IG52O1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihudiwgb3YpO1xuICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXNzKys7XG5cbiAgICB9IHdoaWxlIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzIDwgbGltaXQpO1xuXG4gICAgaWYgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPT09IGxpbWl0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTnVtYmVyIG9mIHdhdGNoIGN5Y2xlcyBnb25lIGFib3ZlIHNldCBsaW1pdCBvZjogJHtsaW1pdH0gYCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldE5nWm9uZSA9IHpvbmUgPT4gbmdab25lID0gem9uZTtcblxuZXhwb3J0IGNvbnN0IHNldEFwcFJlZiA9IHJlZiA9PiB7XG4gICAgYXBwUmVmID0gcmVmXG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKSA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbig8YW55PndpbmRvdykud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuXG5sZXQgc2tpcFdhdGNoZXJzO1xuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuKCgpID0+IHRyaWdnZXJXYXRjaGVycygpKTtcbn0sIDEwMCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U/OiBib29sZWFuLCBpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgdHJpZ2dlcldhdGNoZXJzKGlnbm9yZU11dGVkKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG4iXX0=
410
+ // Export registry for debugging
411
+ // (window as any).watchRegistry = registry;
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXFCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FB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RyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxnQ0FBZ0M7QUFDaEMsNENBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyAkcGFyc2VFeHByIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlcic7XG5pbXBvcnQgeyBmaW5kVmFsdWVPZiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmUsIGZsYXR0ZW4sIGlzQXJyYXksIGlzRXF1YWwsIGlzT2JqZWN0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFdJREdFVF9JRF9SRUdFWCA9IC9eKHdpZGdldC1bXl9dKykvO1xuY29uc3QgV0lER0VUX1BST1BFUlRZX1JFR0VYID0gL153aWRnZXQtW15fXStfKC4rKSQvO1xuY29uc3QgQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIgPSAnWyRpXSc7XG5jb25zdCBBUlJBWV9JTkRFWF9aRVJPID0gJ1swXSc7XG5jb25zdCBERUJPVU5DRV9XQUlUID0gMTAwO1xuY29uc3QgTUFYX1dBVENIX0NZQ0xFUyA9IDU7XG5cbmNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5pbnRlcmZhY2UgV2F0Y2hJbmZvIHtcbiAgICBmbjogKCkgPT4gYW55O1xuICAgIGxpc3RlbmVyOiAobmV3VmFsOiBhbnksIG9sZFZhbDogYW55KSA9PiB2b2lkO1xuICAgIGV4cHI6IHN0cmluZztcbiAgICBsYXN0OiBhbnk7XG4gICAgZG9Ob3RDbG9uZTogYm9vbGVhbjtcbiAgICBpc011dGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBzY29wZVR5cGU6IFNjb3BlVHlwZSB8IG51bGw7XG4gICAgc2NvcGVOYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG50eXBlIFNjb3BlVHlwZSA9ICdQYWdlJyB8ICdQcmVmYWInIHwgJ1BhcnRpYWwnIHwgJ0FwcCc7XG5cbmludGVyZmFjZSBXYXRjaENvbmZpZyB7XG4gICAgYXJyYXlUeXBlPzogYm9vbGVhbjtcbiAgICBpc0xpc3Q/OiBib29sZWFuO1xufVxuXG4vLyBTdGF0ZVxubGV0IG11dGVkID0gZmFsc2U7XG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcbmxldCBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbmxldCBuZ1pvbmU6IGFueTtcbmxldCBhcHBSZWY6IGFueTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBpc0ZpcnN0VGltZUNoYW5nZSA9ICh2OiBhbnkpOiBib29sZWFuID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IERFQk9VTkNFX1dBSVQpID0+IHtcbiAgICBsZXQgdGltZW91dDogYW55O1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgd2lkZ2V0IElEIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwid2lkZ2V0LWlkMjNcIilcbiAqL1xuY29uc3QgZ2V0V2lkZ2V0SWQgPSAoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9JRF9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBwcm9wZXJ0eSBuYW1lIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwiZXZlbnRzb3VyY2VcIilcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlOYW1lID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9QUk9QRVJUWV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBpZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBBcnJheSBjb25zdW1lciB3cmFwcGVyIGZvciBhcnJheS1iYXNlZCBleHByZXNzaW9uc1xuICovXG5jb25zdCBhcnJheUNvbnN1bWVyID0gKGxpc3RlbmVyRm46IGFueSwgcmVzdEV4cHI6IHN0cmluZywgbmV3VmFsOiBhbnksIG9sZFZhbDogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREYXRhID0gbmV3VmFsLm1hcChkYXR1bSA9PiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpKTtcblxuICAgIC8vIEZsYXR0ZW4gaWYgcmVzdWx0IGlzIGFycmF5IG9mIGFycmF5c1xuICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBmbGF0dGVuKGZvcm1hdHRlZERhdGEpO1xuICAgIH1cblxuICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB3YXRjaCBpbmZvIGZvciBhcnJheSBleHByZXNzaW9uc1xuICovXG5jb25zdCBnZXRVcGRhdGVkV2F0Y2hJbmZvID0gKGV4cHI6IHN0cmluZywgYWNjZXB0c0FycmF5OiBib29sZWFuLCBsaXN0ZW5lcjogYW55KSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvXFxbXFwkaVxcXS9nO1xuXG4gICAgaWYgKCFhY2NlcHRzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cHI6IGV4cHIucmVwbGFjZShyZWdleCwgQVJSQVlfSU5ERVhfWkVSTyksXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGV4cHIubGFzdEluZGV4T2YoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpO1xuICAgIGNvbnN0IGJhc2VFeHByID0gZXhwci5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KS5yZXBsYWNlKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLCBBUlJBWV9JTkRFWF9aRVJPKTtcbiAgICBjb25zdCByZXN0RXhwciA9IGV4cHIuc3Vic3RyaW5nKGxhc3RJbmRleCArIEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLmxlbmd0aCk7XG5cbiAgICBjb25zdCBhcnJheUNvbnN1bWVyRm4gPSByZXN0RXhwclxuICAgICAgICA/IGFycmF5Q29uc3VtZXIuYmluZCh1bmRlZmluZWQsIGxpc3RlbmVyLCByZXN0RXhwcilcbiAgICAgICAgOiBsaXN0ZW5lcjtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGV4cHI6IGJhc2VFeHByLFxuICAgICAgICBsaXN0ZW5lcjogYXJyYXlDb25zdW1lckZuXG4gICAgfTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiBleHByZXNzaW9uIGlzIHN0YXRpYyAoZG9lc24ndCBuZWVkIHRvIGJlIHdhdGNoZWQpXG4gKi9cbmNvbnN0IFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTID0gW1xuICAgIFwicm93LmdldFByb3BlcnR5KCdpbnZlc3RtZW50JylcIixcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnZmFjdHNoZWV0TGluaycpXCIsXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2lzUmViYWxhbmNlRWxpZ2libGUnKVwiXG5dO1xuXG5jb25zdCBpc1N0YXRpY0V4cHJlc3Npb24gPSAoZXhwcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBleHByICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZEV4cHIgPSBleHByLnRyaW0oKTtcblxuICAgIC8vIEV4cHJlc3Npb25zIHRoYXQgYWx3YXlzIGV2YWx1YXRlIHRvIGxvY2FsaXphdGlvbiBzdHJpbmdzXG4gICAgaWYgKHRyaW1tZWRFeHByLmluY2x1ZGVzKCdhcHBMb2NhbGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBIYXJkLWNvZGVkIHN0YXRpYyBleHByZXNzaW9uIG5hbWVzXG4gICAgaWYgKFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTLmluY2x1ZGVzKHRyaW1tZWRFeHByKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHNjb3BlIHR5cGUgZnJvbSB0aGUgc2NvcGUgb2JqZWN0XG4gKi9cbmNvbnN0IGdldFNjb3BlVHlwZSA9ICgkc2NvcGU6IGFueSk6IFNjb3BlVHlwZSB8IG51bGwgPT4ge1xuICAgIGlmICghJHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgkc2NvcGUucGFnZU5hbWUpIHJldHVybiAnUGFnZSc7XG4gICAgaWYgKCRzY29wZS5wcmVmYWJOYW1lKSByZXR1cm4gJ1ByZWZhYic7XG4gICAgaWYgKCRzY29wZS5wYXJ0aWFsTmFtZSkgcmV0dXJuICdQYXJ0aWFsJztcblxuICAgIC8vIENoZWNrIGZvciBBcHAgc2NvcGVcbiAgICBpZiAoJHNjb3BlLlZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICRzY29wZS5BY3Rpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgISRzY29wZS5wYWdlTmFtZSAmJlxuICAgICAgICAhJHNjb3BlLnByZWZhYk5hbWUgJiZcbiAgICAgICAgISRzY29wZS5wYXJ0aWFsTmFtZSkge1xuICAgICAgICByZXR1cm4gJ0FwcCc7XG4gICAgfVxuXG4gICAgaWYgKCRzY29wZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0FwcFJlZicpIHtcbiAgICAgICAgcmV0dXJuICdBcHAnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXRzIHNjb3BlIG5hbWUgYmFzZWQgb24gc2NvcGUgdHlwZVxuICovXG5jb25zdCBnZXRTY29wZU5hbWUgPSAoJHNjb3BlOiBhbnksIHNjb3BlVHlwZTogU2NvcGVUeXBlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlIHx8ICEkc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzY29wZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJlZmFiJzogcmV0dXJuICRzY29wZS5wcmVmYWJOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhcnRpYWwnOiByZXR1cm4gJHNjb3BlLnBhcnRpYWxOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhZ2UnOiByZXR1cm4gJHNjb3BlLnBhZ2VOYW1lIHx8IG51bGw7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogTWFpbiB3YXRjaCBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKFxuICAgIGV4cHI6IHN0cmluZyxcbiAgICAkc2NvcGU6IGFueSxcbiAgICAkbG9jYWxzOiBhbnksXG4gICAgbGlzdGVuZXI6IGFueSxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSxcbiAgICBkb05vdENsb25lOiBib29sZWFuID0gZmFsc2UsXG4gICAgY29uZmlnOiBXYXRjaENvbmZpZyA9IHt9LFxuICAgIGlzTXV0ZWQ/OiAoKSA9PiBib29sZWFuXG4pID0+IHtcbiAgICAvLyBIYW5kbGUgYXJyYXkgZXhwcmVzc2lvbnNcbiAgICBpZiAoZXhwci5pbmNsdWRlcyhBUlJBWV9JTkRFWF9QTEFDRUhPTERFUikpIHtcbiAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gZ2V0VXBkYXRlZFdhdGNoSW5mbyhleHByLCBjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QgfHwgZmFsc2UsIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3RhdGljIGV4cHJlc3Npb25zXG4gICAgaWYgKGlzU3RhdGljRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGljVmFsdWUgPSBmbigkc2NvcGUsICRsb2NhbHMpO1xuICAgICAgICAgICAgbGlzdGVuZXIoc3RhdGljVmFsdWUsIEZJUlNUX1RJTUVfV0FUQ0gpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV2YWx1YXRpbmcgc3RhdGljIGV4cHJlc3Npb24gJyR7ZXhwcn0nOmAsIGUpO1xuICAgICAgICAgICAgbGlzdGVuZXIodW5kZWZpbmVkLCBGSVJTVF9USU1FX1dBVENIKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4geyB9OyAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcbiAgICBjb25zdCBzY29wZVR5cGUgPSBnZXRTY29wZVR5cGUoJHNjb3BlKTtcbiAgICBjb25zdCBzY29wZU5hbWUgPSBnZXRTY29wZU5hbWUoJHNjb3BlLCBzY29wZVR5cGUpO1xuXG4gICAgY29uc3Qgd2F0Y2hJbmZvOiBXYXRjaEluZm8gPSB7XG4gICAgICAgIGZuOiBmbi5iaW5kKG51bGwsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkLFxuICAgICAgICBzY29wZVR5cGUsXG4gICAgICAgIHNjb3BlTmFtZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiByZWdpc3RyeVxuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5Lmhhcyh3aWRnZXRJZCkpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnNldCh3aWRnZXRJZCwge30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXSA9IHdhdGNoSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5zZXQoaWRlbnRpZmllciwgd2F0Y2hJbmZvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhIHNpbmdsZSBpZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IChpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB3aWRnZXRJZCA9IGdldFdpZGdldElkKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKHdpZGdldElkKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5TmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0R3JvdXAgPSByZWdpc3RyeS5nZXQod2lkZ2V0SWQpO1xuXG4gICAgICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSB3aWRnZXQgZ3JvdXBzXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHdpZGdldElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBkaXJlY3QgbG9va3VwXG4gICAgaWYgKHJlZ2lzdHJ5LmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICByZWdpc3RyeS5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyB3aWRnZXQgSURcbiAqL1xuZXhwb3J0IGNvbnN0ICR1bndhdGNoQWxsID0gKHdpZGdldElkOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghd2lkZ2V0SWQgfHwgdHlwZW9mIHdpZGdldElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCB3aWRnZXRHcm91cCA9IHJlZ2lzdHJ5LmdldCh3aWRnZXRJZCk7XG5cbiAgICBpZiAod2lkZ2V0R3JvdXAgJiYgdHlwZW9mIHdpZGdldEdyb3VwID09PSAnb2JqZWN0JyAmJiAhd2lkZ2V0R3JvdXAuZm4pIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyh3aWRnZXRHcm91cCkubGVuZ3RoO1xuICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGZpbmQgYWxsIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggdGhpcyB3aWRnZXQgSURcbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICBjb25zdCBpZGVudGlmaWVyc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmVnaXN0cnkuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh3aWRnZXRJZCArICdfJykpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhbGwgd2F0Y2hlcnMgZm9yIGEgc3BlY2lmaWMgc2NvcGUgKFBhZ2UsIFByZWZhYiwgUGFydGlhbCwgb3IgQXBwKVxuICogTm93IHdvcmtzIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gcmVnaXN0cnkgaW5zdGVhZCBvZiBzZXBhcmF0ZSBzY29wZWQgcmVnaXN0cmllc1xuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGxCeVNjb3BlID0gKHNjb3BlVHlwZTogU2NvcGVUeXBlLCBzY29wZU5hbWU/OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBncm91cGVkIHN0cnVjdHVyZSAod2lkZ2V0IGdyb3VwcylcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXZhbHVlLmZuKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW3Byb3BlcnR5TmFtZSwgd2F0Y2hJbmZvXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGAke2tleX1fJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB2YWx1ZSBhcyBXYXRjaEluZm87XG4gICAgICAgICAgICBpZiAod2F0Y2hJbmZvPy5zY29wZVR5cGUgPT09IHNjb3BlVHlwZSAmJlxuICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVW53YXRjaCBhbGwgY29sbGVjdGVkIGlkZW50aWZpZXJzXG4gICAgaWRlbnRpZmllcnNUb1JlbW92ZS5mb3JFYWNoKGlkZW50aWZpZXIgPT4ge1xuICAgICAgICBpZiAoJHVud2F0Y2goaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVtb3ZlZENvdW50O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBzaW5nbGUgd2F0Y2ggaW5mbyBkdXJpbmcgdHJpZ2dlciBjeWNsZVxuICovXG5jb25zdCBwcm9jZXNzV2F0Y2hJbmZvID0gKHdhdGNoSW5mbzogV2F0Y2hJbmZvKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCF3YXRjaEluZm8/LmZuIHx8ICh3YXRjaEluZm8uaXNNdXRlZD8uKCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbmV3VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgICBuZXdWYWx1ZSA9IHdhdGNoSW5mby5mbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciBleGVjdXRpbmcgZXhwcmVzc2lvbjogJyR7d2F0Y2hJbmZvLmV4cHJ9J2AsIGUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGRldGVjdGVkXG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgIHdhdGNoSW5mby5sYXN0ID0gaXNPYmplY3QobmV3VmFsdWUpICYmICF3YXRjaEluZm8uZG9Ob3RDbG9uZVxuICAgICAgICA/IGNsb25lKG5ld1ZhbHVlKVxuICAgICAgICA6IG5ld1ZhbHVlO1xuXG4gICAgd2F0Y2hJbmZvLmxpc3RlbmVyKG5ld1ZhbHVlLCB3YXRjaEluZm8ubGFzdCA9PT0gbmV3VmFsdWUgPyBGSVJTVF9USU1FX1dBVENIIDogd2F0Y2hJbmZvLmxhc3QpO1xuICAgIGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlcnMgYWxsIHdhdGNoZXJzXG4gKi9cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgaWYgKG11dGVkICYmICFpZ25vcmVNdXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDogYm9vbGVhbjtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHZhbHVlKS5mb3JFYWNoKCh3YXRjaEluZm86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1dhdGNoSW5mbyh3YXRjaEluZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IHdhdGNoSW5mb1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHZhbHVlIGFzIFdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFzcysrO1xuICAgIH0gd2hpbGUgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPCBNQVhfV0FUQ0hfQ1lDTEVTKTtcblxuICAgIGlmIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzID09PSBNQVhfV0FUQ0hfQ1lDTEVTKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgV2F0Y2ggY3ljbGVzIGV4Y2VlZGVkIGxpbWl0IG9mICR7TUFYX1dBVENIX0NZQ0xFU31gKTtcbiAgICB9XG59O1xuXG4vLyBBbmd1bGFyIHpvbmUgaW50ZWdyYXRpb25cbmV4cG9ydCBjb25zdCBzZXROZ1pvbmUgPSAoem9uZTogYW55KTogdm9pZCA9PiB7XG4gICAgbmdab25lID0gem9uZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBcHBSZWYgPSAocmVmOiBhbnkpOiB2b2lkID0+IHtcbiAgICBhcHBSZWYgPSByZWY7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKTogYm9vbGVhbiA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IGZhbHNlO1xufTtcblxuLy8gRGVib3VuY2VkIHRyaWdnZXJcbmNvbnN0IGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycyA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBza2lwV2F0Y2hlcnMgPSB0cnVlO1xuICAgIG5nWm9uZS5ydW4oKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgREVCT1VOQ0VfV0FJVCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgaWdub3JlTXV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgICB0cmlnZ2VyV2F0Y2hlcnMoaWdub3JlTXV0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgICByZXR1cm4gKGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiBhcHBSZWYudGljaygpKTtcbiAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAkUkFGKCgpID0+IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IGFwcFJlZi50aWNrKCkpO1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLy8gRXhwb3J0IHJlZ2lzdHJ5IGZvciBkZWJ1Z2dpbmdcbi8vICh3aW5kb3cgYXMgYW55KS53YXRjaFJlZ2lzdHJ5ID0gcmVnaXN0cnk7Il19