@plumile/router 0.1.11 → 0.1.13

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 (127) hide show
  1. package/README.md +755 -1
  2. package/lib/esm/builder.d.ts.map +1 -1
  3. package/lib/esm/builder.js +10 -3
  4. package/lib/esm/eslint-rules/index.d.ts +2 -0
  5. package/lib/esm/eslint-rules/index.d.ts.map +1 -0
  6. package/lib/esm/eslint-rules/index.js +2 -0
  7. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  8. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  9. package/lib/esm/eslint-rules/no-direct-window-location-search.js +48 -0
  10. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  11. package/lib/esm/history/BrowserHistory.js +4 -2
  12. package/lib/esm/index.d.ts +5 -0
  13. package/lib/esm/index.d.ts.map +1 -1
  14. package/lib/esm/index.js +6 -1
  15. package/lib/esm/routing/Link.d.ts +1 -0
  16. package/lib/esm/routing/Link.d.ts.map +1 -1
  17. package/lib/esm/routing/Link.js +35 -4
  18. package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
  19. package/lib/esm/routing/RouteComponentWrapper.js +7 -2
  20. package/lib/esm/routing/createRouter.d.ts +8 -1
  21. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  22. package/lib/esm/routing/createRouter.js +540 -17
  23. package/lib/esm/routing/devtools.d.ts +20 -0
  24. package/lib/esm/routing/devtools.d.ts.map +1 -0
  25. package/lib/esm/routing/devtools.js +678 -0
  26. package/lib/esm/routing/filters.d.ts +97 -0
  27. package/lib/esm/routing/filters.d.ts.map +1 -0
  28. package/lib/esm/routing/filters.js +557 -0
  29. package/lib/esm/routing/index.d.ts +10 -0
  30. package/lib/esm/routing/index.d.ts.map +1 -1
  31. package/lib/esm/routing/index.js +11 -1
  32. package/lib/esm/routing/useActiveFilters.d.ts +9 -0
  33. package/lib/esm/routing/useActiveFilters.d.ts.map +1 -0
  34. package/lib/esm/routing/useActiveFilters.js +38 -0
  35. package/lib/esm/routing/useFilterState.d.ts +10 -0
  36. package/lib/esm/routing/useFilterState.d.ts.map +1 -0
  37. package/lib/esm/routing/useFilterState.js +14 -0
  38. package/lib/esm/routing/useNavigate.d.ts +13 -0
  39. package/lib/esm/routing/useNavigate.d.ts.map +1 -0
  40. package/lib/esm/routing/useNavigate.js +11 -0
  41. package/lib/esm/routing/useNavigateWithQuery.d.ts +15 -0
  42. package/lib/esm/routing/useNavigateWithQuery.d.ts.map +1 -0
  43. package/lib/esm/routing/useNavigateWithQuery.js +95 -0
  44. package/lib/esm/routing/useQuery.d.ts +2 -0
  45. package/lib/esm/routing/useQuery.d.ts.map +1 -0
  46. package/lib/esm/routing/useQuery.js +9 -0
  47. package/lib/esm/routing/useQueryObject.d.ts +18 -0
  48. package/lib/esm/routing/useQueryObject.d.ts.map +1 -0
  49. package/lib/esm/routing/useQueryObject.js +107 -0
  50. package/lib/esm/routing/useQueryState.d.ts +13 -0
  51. package/lib/esm/routing/useQueryState.d.ts.map +1 -0
  52. package/lib/esm/routing/useQueryState.js +80 -0
  53. package/lib/esm/routing/useStableRefEquality.d.ts +5 -0
  54. package/lib/esm/routing/useStableRefEquality.d.ts.map +1 -0
  55. package/lib/esm/routing/useStableRefEquality.js +47 -0
  56. package/lib/esm/routing/useTypedQuery.d.ts +2 -0
  57. package/lib/esm/routing/useTypedQuery.d.ts.map +1 -0
  58. package/lib/esm/routing/useTypedQuery.js +36 -0
  59. package/lib/esm/tools/buildSearch.d.ts +12 -0
  60. package/lib/esm/tools/buildSearch.d.ts.map +1 -0
  61. package/lib/esm/tools/buildSearch.js +264 -0
  62. package/lib/esm/tools/query-dsl.d.ts +28 -0
  63. package/lib/esm/tools/query-dsl.d.ts.map +1 -0
  64. package/lib/esm/tools/query-dsl.js +250 -0
  65. package/lib/esm/tools/query.d.ts +2 -0
  66. package/lib/esm/tools/query.d.ts.map +1 -0
  67. package/lib/esm/tools/query.js +43 -0
  68. package/lib/esm/tools.d.ts +2 -2
  69. package/lib/esm/tools.d.ts.map +1 -1
  70. package/lib/esm/tools.js +3 -2
  71. package/lib/esm/type-tests/query-infer.test-d.d.ts +2 -0
  72. package/lib/esm/type-tests/query-infer.test-d.d.ts.map +1 -0
  73. package/lib/esm/type-tests/query-infer.test-d.js +49 -0
  74. package/lib/esm/types.d.ts +47 -4
  75. package/lib/esm/types.d.ts.map +1 -1
  76. package/lib/esm/types.js +1 -1
  77. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  78. package/lib/types/builder.d.ts.map +1 -1
  79. package/lib/types/eslint-rules/index.d.ts +2 -0
  80. package/lib/types/eslint-rules/index.d.ts.map +1 -0
  81. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  82. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  83. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  84. package/lib/types/index.d.ts +5 -0
  85. package/lib/types/index.d.ts.map +1 -1
  86. package/lib/types/routing/Link.d.ts +1 -0
  87. package/lib/types/routing/Link.d.ts.map +1 -1
  88. package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
  89. package/lib/types/routing/createRouter.d.ts +8 -1
  90. package/lib/types/routing/createRouter.d.ts.map +1 -1
  91. package/lib/types/routing/devtools.d.ts +20 -0
  92. package/lib/types/routing/devtools.d.ts.map +1 -0
  93. package/lib/types/routing/filters.d.ts +97 -0
  94. package/lib/types/routing/filters.d.ts.map +1 -0
  95. package/lib/types/routing/index.d.ts +10 -0
  96. package/lib/types/routing/index.d.ts.map +1 -1
  97. package/lib/types/routing/useActiveFilters.d.ts +9 -0
  98. package/lib/types/routing/useActiveFilters.d.ts.map +1 -0
  99. package/lib/types/routing/useFilterState.d.ts +10 -0
  100. package/lib/types/routing/useFilterState.d.ts.map +1 -0
  101. package/lib/types/routing/useNavigate.d.ts +13 -0
  102. package/lib/types/routing/useNavigate.d.ts.map +1 -0
  103. package/lib/types/routing/useNavigateWithQuery.d.ts +15 -0
  104. package/lib/types/routing/useNavigateWithQuery.d.ts.map +1 -0
  105. package/lib/types/routing/useQuery.d.ts +2 -0
  106. package/lib/types/routing/useQuery.d.ts.map +1 -0
  107. package/lib/types/routing/useQueryObject.d.ts +18 -0
  108. package/lib/types/routing/useQueryObject.d.ts.map +1 -0
  109. package/lib/types/routing/useQueryState.d.ts +13 -0
  110. package/lib/types/routing/useQueryState.d.ts.map +1 -0
  111. package/lib/types/routing/useStableRefEquality.d.ts +5 -0
  112. package/lib/types/routing/useStableRefEquality.d.ts.map +1 -0
  113. package/lib/types/routing/useTypedQuery.d.ts +2 -0
  114. package/lib/types/routing/useTypedQuery.d.ts.map +1 -0
  115. package/lib/types/tools/buildSearch.d.ts +12 -0
  116. package/lib/types/tools/buildSearch.d.ts.map +1 -0
  117. package/lib/types/tools/query-dsl.d.ts +28 -0
  118. package/lib/types/tools/query-dsl.d.ts.map +1 -0
  119. package/lib/types/tools/query.d.ts +2 -0
  120. package/lib/types/tools/query.d.ts.map +1 -0
  121. package/lib/types/tools.d.ts +2 -2
  122. package/lib/types/tools.d.ts.map +1 -1
  123. package/lib/types/type-tests/query-infer.test-d.d.ts +2 -0
  124. package/lib/types/type-tests/query-infer.test-d.d.ts.map +1 -0
  125. package/lib/types/types.d.ts +47 -4
  126. package/lib/types/types.d.ts.map +1 -1
  127. package/package.json +7 -7
@@ -1,55 +1,433 @@
1
1
  import { buildRoutes } from '../builder.js';
2
2
  import { BrowserHistory } from '../history/index.js';
3
3
  import { getMatchedRoute, prepareMatch } from '../tools.js';
4
- export default function createRouter(routes) {
4
+ import { parseTypedQuery } from '../tools/query-dsl.js';
5
+ import { parseRawQuery } from '../tools/query.js';
6
+ import { buildSearch } from '../tools/buildSearch.js';
7
+ export default function createRouter(routes, opts = {}) {
8
+ let devtoolsGlobal;
9
+ let devtoolsPanel = false;
10
+ let devtoolsShortcut = 'Alt+Shift+R';
11
+ if (typeof opts.devtools === 'object') {
12
+ const baseEnabled = (() => {
13
+ try {
14
+ return (typeof process !== 'undefined' &&
15
+ process.env.NODE_ENV !== 'production');
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ })();
21
+ devtoolsGlobal = opts.devtools.global ?? baseEnabled;
22
+ devtoolsPanel = !!opts.devtools.panel;
23
+ if (typeof opts.devtools.shortcut === 'string' &&
24
+ opts.devtools.shortcut.trim() !== '') {
25
+ devtoolsShortcut = opts.devtools.shortcut;
26
+ }
27
+ }
28
+ else {
29
+ const enabled = (() => {
30
+ if (typeof opts.devtools === 'boolean')
31
+ return opts.devtools;
32
+ try {
33
+ return (typeof process !== 'undefined' &&
34
+ process.env.NODE_ENV !== 'production');
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ })();
40
+ devtoolsGlobal = enabled;
41
+ }
5
42
  const history = new BrowserHistory();
6
43
  const flatRoutes = buildRoutes(routes);
7
44
  const route = getMatchedRoute(flatRoutes, history.location);
8
- const preparedMatch = prepareMatch(route);
45
+ const initialRawQuery = parseRawQuery(history.location.search);
46
+ let initialSchema;
47
+ if (route != null) {
48
+ const collected = [];
49
+ const collectedFilters = [];
50
+ for (const r of route.route.routes) {
51
+ const maybe = r.query;
52
+ if (maybe != null) {
53
+ collected.push(maybe);
54
+ }
55
+ const maybeFilter = r.filterSchema;
56
+ if (maybeFilter != null) {
57
+ collectedFilters.push(maybeFilter);
58
+ }
59
+ }
60
+ if (collected.length > 0) {
61
+ initialSchema = collected.at(-1);
62
+ }
63
+ }
64
+ const initialTypedQuery = parseTypedQuery(initialSchema, initialRawQuery);
65
+ const preparedMatch = prepareMatch(route, initialTypedQuery);
9
66
  let currentEntry = {
10
67
  forceRerender: false,
11
68
  location: history.location,
12
69
  route,
13
70
  preparedMatch,
71
+ rawSearch: history.location.search,
72
+ query: initialRawQuery,
73
+ typedQuery: initialTypedQuery,
14
74
  };
75
+ const initTyped = currentEntry.typedQuery;
76
+ let initPage;
77
+ if (initTyped != null) {
78
+ initPage = initTyped.page;
79
+ }
80
+ if (typeof initPage === 'number' &&
81
+ initPage < 1 &&
82
+ initialSchema != null &&
83
+ initTyped != null) {
84
+ const norm = { ...initTyped, page: 1 };
85
+ const normalizedSearch = buildSearch(norm, initialSchema);
86
+ if (normalizedSearch !== history.location.search) {
87
+ history.set({
88
+ pathname: history.location.pathname,
89
+ search: normalizedSearch,
90
+ hash: '',
91
+ });
92
+ }
93
+ }
15
94
  let nextId = 0;
16
95
  const subscribers = new Map();
17
96
  const cleanup = history.subscribe((location, forceRerender) => {
18
- if (forceRerender) {
19
- }
20
- else if (location.pathname === currentEntry.location.pathname) {
97
+ const samePathname = location.pathname === currentEntry.location.pathname;
98
+ const sameSearch = location.search === currentEntry.rawSearch;
99
+ if (!forceRerender && samePathname && sameSearch) {
21
100
  return;
22
101
  }
23
- const route = getMatchedRoute(flatRoutes, history.location);
24
- const preparedMatch = prepareMatch(route);
102
+ let nextPreparedMatch = currentEntry.preparedMatch;
103
+ let nextRoute = currentEntry.route;
104
+ if (!samePathname) {
105
+ nextRoute = getMatchedRoute(flatRoutes, history.location);
106
+ }
107
+ const query = parseRawQuery(location.search);
108
+ let schema;
109
+ if (nextRoute != null) {
110
+ const collected = [];
111
+ const collectedFilters = [];
112
+ for (const r of nextRoute.route.routes) {
113
+ const maybe = r.query;
114
+ if (maybe != null) {
115
+ collected.push(maybe);
116
+ }
117
+ const maybeFilter = r.filterSchema;
118
+ if (maybeFilter != null) {
119
+ collectedFilters.push(maybeFilter);
120
+ }
121
+ }
122
+ if (collected.length > 0) {
123
+ schema = collected.at(-1);
124
+ }
125
+ }
126
+ let typedQuery = parseTypedQuery(schema, query);
127
+ let normalized = false;
128
+ const pg = typedQuery.page;
129
+ if (typeof pg === 'number' && pg < 1) {
130
+ const clone = { ...typedQuery, page: 1 };
131
+ typedQuery = clone;
132
+ normalized = true;
133
+ }
134
+ if (!samePathname) {
135
+ nextPreparedMatch = prepareMatch(nextRoute, typedQuery);
136
+ }
137
+ else if (!sameSearch) {
138
+ nextPreparedMatch = prepareMatch(nextRoute, typedQuery);
139
+ }
25
140
  const nextEntry = {
26
- forceRerender,
141
+ forceRerender: forceRerender || (samePathname && !sameSearch),
27
142
  location,
28
- route,
29
- preparedMatch,
143
+ route: nextRoute,
144
+ preparedMatch: nextPreparedMatch,
145
+ rawSearch: location.search,
146
+ query,
147
+ typedQuery,
30
148
  };
149
+ if (normalized && schema != null) {
150
+ const normalizedSearch = buildSearch(typedQuery, schema);
151
+ if (normalizedSearch !== location.search) {
152
+ history.set({
153
+ pathname: location.pathname,
154
+ search: normalizedSearch,
155
+ hash: '',
156
+ });
157
+ return;
158
+ }
159
+ }
31
160
  currentEntry = nextEntry;
32
161
  subscribers.forEach((callback) => {
33
162
  callback(nextEntry);
34
163
  });
35
164
  });
165
+ let pendingNavs;
166
+ let flushScheduled = false;
167
+ let batchedMergedQuery;
168
+ let lastBatchQuery;
169
+ let batchedFilters;
170
+ let batchedFilterSchema;
171
+ let devtoolsOnNavEvent;
172
+ let batchMode;
173
+ function collectRouteChain(pathname) {
174
+ if (pathname === currentEntry.location.pathname) {
175
+ if (currentEntry.route != null) {
176
+ return currentEntry.route.route.routes;
177
+ }
178
+ return undefined;
179
+ }
180
+ const destRoute = getMatchedRoute(flatRoutes, {
181
+ ...window.location,
182
+ pathname,
183
+ });
184
+ if (destRoute != null)
185
+ return destRoute.route.routes;
186
+ return undefined;
187
+ }
188
+ function mergeQuerySchemaFromChain(chain) {
189
+ if (chain == null)
190
+ return undefined;
191
+ const merged = {};
192
+ for (const node of chain) {
193
+ const qobj = node.query;
194
+ if (qobj != null) {
195
+ for (const [k, v] of Object.entries(qobj)) {
196
+ merged[k] = v;
197
+ }
198
+ }
199
+ }
200
+ if (Object.keys(merged).length === 0)
201
+ return undefined;
202
+ return merged;
203
+ }
204
+ function mergeFilterSchemaFromChain(chain) {
205
+ if (chain == null)
206
+ return undefined;
207
+ let merged;
208
+ for (const node of chain) {
209
+ const fs = node.filterSchema;
210
+ if (fs != null) {
211
+ merged ??= {};
212
+ Object.assign(merged, fs.schema);
213
+ }
214
+ }
215
+ if (merged != null)
216
+ return { __defined: true, schema: merged };
217
+ return undefined;
218
+ }
219
+ function resolveSchema(pathname) {
220
+ return mergeQuerySchemaFromChain(collectRouteChain(pathname));
221
+ }
222
+ function resolveFilterSchema(pathname) {
223
+ return mergeFilterSchemaFromChain(collectRouteChain(pathname));
224
+ }
225
+ function coalesceNavigations(list) {
226
+ let targetPathname = currentEntry.location.pathname;
227
+ if (targetPathname === '') {
228
+ targetPathname = '/';
229
+ }
230
+ for (const nav of list) {
231
+ if (nav.pathname !== undefined) {
232
+ const pn = nav.pathname;
233
+ if (pn === '') {
234
+ targetPathname = '/';
235
+ }
236
+ else {
237
+ targetPathname = pn;
238
+ }
239
+ }
240
+ }
241
+ let replaceFlag;
242
+ for (const nav of list) {
243
+ if (nav.replace !== undefined) {
244
+ replaceFlag = nav.replace;
245
+ }
246
+ }
247
+ let baseQuery = currentEntry.typedQuery ?? currentEntry.query ?? {};
248
+ if (batchedMergedQuery != null) {
249
+ baseQuery = batchedMergedQuery;
250
+ }
251
+ else if (lastBatchQuery != null) {
252
+ baseQuery = lastBatchQuery;
253
+ }
254
+ else {
255
+ for (let i = list.length - 1; i >= 0; i -= 1) {
256
+ const item = list[i];
257
+ if (item != null) {
258
+ const q = item.query;
259
+ if (q != null && Object.keys(q).length > 0) {
260
+ baseQuery = q;
261
+ break;
262
+ }
263
+ }
264
+ }
265
+ }
266
+ const batchFilters = batchedFilters;
267
+ const batchFilterSchema = batchedFilterSchema;
268
+ const schema = resolveSchema(targetPathname);
269
+ let buildOpts;
270
+ if (batchFilters !== undefined) {
271
+ const fs = batchFilterSchema ?? resolveFilterSchema(targetPathname);
272
+ if (fs != null) {
273
+ buildOpts = { filters: batchFilters, filterSchema: fs };
274
+ }
275
+ }
276
+ const search = buildSearch(baseQuery, schema, buildOpts);
277
+ let normalizedPath = targetPathname;
278
+ if (normalizedPath === '') {
279
+ normalizedPath = '/';
280
+ }
281
+ let nextRoute = currentEntry.route;
282
+ if (normalizedPath !== currentEntry.location.pathname) {
283
+ nextRoute = getMatchedRoute(flatRoutes, {
284
+ ...window.location,
285
+ pathname: normalizedPath,
286
+ });
287
+ }
288
+ const effectiveSchema = schema ?? resolveSchema(normalizedPath);
289
+ const rawQueryObj = parseRawQuery(search);
290
+ const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
291
+ const prepared = prepareMatch(nextRoute, typed);
292
+ const nextEntry = {
293
+ forceRerender: false,
294
+ location: { ...currentEntry.location, pathname: normalizedPath, search },
295
+ route: nextRoute,
296
+ preparedMatch: prepared,
297
+ rawSearch: search,
298
+ query: rawQueryObj,
299
+ typedQuery: typed,
300
+ };
301
+ return {
302
+ search,
303
+ pathname: normalizedPath,
304
+ replace: replaceFlag,
305
+ nextEntry,
306
+ };
307
+ }
308
+ function flushNavigations() {
309
+ flushScheduled = false;
310
+ const list = pendingNavs;
311
+ pendingNavs = undefined;
312
+ if (list == null || list.length === 0) {
313
+ return;
314
+ }
315
+ const { search, pathname, replace: replaceFlag, nextEntry, } = coalesceNavigations(list);
316
+ batchedMergedQuery = undefined;
317
+ lastBatchQuery = undefined;
318
+ batchedFilters = undefined;
319
+ batchedFilterSchema = undefined;
320
+ currentEntry = nextEntry;
321
+ const loc = { pathname, search, hash: '' };
322
+ if (replaceFlag)
323
+ history.set(loc);
324
+ else
325
+ history.push(loc);
326
+ let mode = 'manual';
327
+ if (batchMode === 'auto') {
328
+ mode = 'auto';
329
+ }
330
+ else if (batchMode === 'mixed') {
331
+ mode = 'mixed';
332
+ }
333
+ devtoolsOnNavEvent?.({
334
+ kind: 'batch-flush',
335
+ mode,
336
+ count: list.length,
337
+ pathname,
338
+ search,
339
+ timestamp: Date.now(),
340
+ });
341
+ batchMode = undefined;
342
+ }
343
+ function applyProvisionalBatchUpdate(pathname) {
344
+ try {
345
+ const basePath = pathname ?? currentEntry.location.pathname;
346
+ const schema = resolveSchema(basePath);
347
+ const mergedQ = batchedMergedQuery ?? lastBatchQuery ?? {};
348
+ let buildOpts;
349
+ if (batchedFilters != null && batchedFilterSchema != null) {
350
+ buildOpts = {
351
+ filters: batchedFilters,
352
+ filterSchema: batchedFilterSchema,
353
+ };
354
+ }
355
+ else if (batchedFilters != null && batchedFilterSchema == null) {
356
+ let merged;
357
+ let routeChain;
358
+ if (basePath === currentEntry.location.pathname) {
359
+ if (currentEntry.route != null) {
360
+ routeChain = currentEntry.route.route.routes;
361
+ }
362
+ }
363
+ else {
364
+ const destRoute = getMatchedRoute(flatRoutes, {
365
+ ...window.location,
366
+ pathname: basePath,
367
+ });
368
+ if (destRoute != null) {
369
+ routeChain = destRoute.route.routes;
370
+ }
371
+ }
372
+ if (routeChain != null) {
373
+ for (const node of routeChain) {
374
+ const fs = node.filterSchema;
375
+ if (fs != null) {
376
+ merged ??= {};
377
+ Object.assign(merged, fs.schema);
378
+ }
379
+ }
380
+ }
381
+ if (merged != null) {
382
+ buildOpts = {
383
+ filters: batchedFilters,
384
+ filterSchema: { __defined: true, schema: merged },
385
+ };
386
+ }
387
+ }
388
+ const provisionalSearch = buildSearch(mergedQ, schema, buildOpts);
389
+ const pathChanged = basePath !== currentEntry.location.pathname;
390
+ if (provisionalSearch !== currentEntry.rawSearch || pathChanged) {
391
+ const typed = parseTypedQuery(schema, mergedQ);
392
+ const rawQueryObj = parseRawQuery(provisionalSearch);
393
+ currentEntry = {
394
+ ...currentEntry,
395
+ location: {
396
+ ...currentEntry.location,
397
+ pathname: basePath,
398
+ search: provisionalSearch,
399
+ },
400
+ rawSearch: provisionalSearch,
401
+ query: rawQueryObj,
402
+ typedQuery: typed,
403
+ };
404
+ }
405
+ }
406
+ catch {
407
+ }
408
+ }
409
+ const autoBatch = opts.autoBatch === true;
36
410
  const context = {
37
411
  history,
38
412
  get() {
39
413
  return currentEntry;
40
414
  },
415
+ resolveFilterSchema(pathname) {
416
+ return resolveFilterSchema(pathname);
417
+ },
418
+ currentMergedFilterSchema() {
419
+ return resolveFilterSchema(currentEntry.location.pathname);
420
+ },
41
421
  preloadCode(pathname) {
42
422
  const matches = getMatchedRoute(flatRoutes, {
43
423
  ...window.location,
44
424
  pathname,
45
425
  });
46
- if (matches == null) {
426
+ if (matches == null)
47
427
  return;
48
- }
49
428
  matches.route.routes.forEach(({ resourcePage }) => {
50
- if (resourcePage == null) {
429
+ if (resourcePage == null)
51
430
  return;
52
- }
53
431
  resourcePage.load();
54
432
  });
55
433
  },
@@ -63,13 +441,158 @@ export default function createRouter(routes) {
63
441
  subscribe(callback) {
64
442
  nextId += 1;
65
443
  const id = nextId;
66
- const dispose = () => {
444
+ function dispose() {
67
445
  subscribers.delete(id);
68
- };
446
+ }
69
447
  subscribers.set(id, callback);
70
448
  return dispose;
71
449
  },
450
+ navigate({ pathname, query, replace, filters, filterSchema, batch, immediate, inherit, }) {
451
+ try {
452
+ const effectiveInherit = inherit === true;
453
+ const wantsBatch = batch === true ||
454
+ (autoBatch && immediate !== true && batch !== false);
455
+ if (wantsBatch) {
456
+ const nav = {};
457
+ if (pathname !== undefined)
458
+ nav.pathname = pathname;
459
+ if (query !== undefined)
460
+ nav.query = query;
461
+ if (replace !== undefined)
462
+ nav.replace = replace;
463
+ if (filters !== undefined)
464
+ nav.filters = filters;
465
+ if (filterSchema !== undefined)
466
+ nav.filterSchema = filterSchema;
467
+ if (effectiveInherit)
468
+ nav.inherit = true;
469
+ pendingNavs ??= [];
470
+ pendingNavs.push(nav);
471
+ let thisMode;
472
+ if (batch === true)
473
+ thisMode = 'manual';
474
+ else
475
+ thisMode = 'auto';
476
+ if (batchMode == null)
477
+ batchMode = thisMode;
478
+ else if (batchMode !== thisMode)
479
+ batchMode = 'mixed';
480
+ if (query != null) {
481
+ if (effectiveInherit) {
482
+ const base = batchedMergedQuery ??
483
+ lastBatchQuery ??
484
+ currentEntry.typedQuery ??
485
+ currentEntry.query ??
486
+ {};
487
+ batchedMergedQuery = { ...base, ...query };
488
+ }
489
+ else {
490
+ batchedMergedQuery = { ...query };
491
+ }
492
+ lastBatchQuery = query;
493
+ }
494
+ if (filters != null) {
495
+ batchedFilters = filters;
496
+ if (filterSchema != null)
497
+ batchedFilterSchema = filterSchema;
498
+ }
499
+ if (!flushScheduled) {
500
+ flushScheduled = true;
501
+ Promise.resolve().then(flushNavigations);
502
+ }
503
+ applyProvisionalBatchUpdate(pathname);
504
+ subscribers.forEach((cb) => {
505
+ cb(currentEntry);
506
+ });
507
+ return;
508
+ }
509
+ let base;
510
+ if (effectiveInherit) {
511
+ base = { ...(currentEntry.typedQuery ?? currentEntry.query ?? {}) };
512
+ }
513
+ if (query != null) {
514
+ if (base != null)
515
+ Object.assign(base, query);
516
+ else
517
+ base = query;
518
+ }
519
+ base ??= currentEntry.typedQuery ?? currentEntry.query ?? {};
520
+ const targetPath = pathname ?? currentEntry.location.pathname;
521
+ const schema = resolveSchema(targetPath);
522
+ let buildOpts;
523
+ if (filters != null) {
524
+ const fs = filterSchema ?? resolveFilterSchema(targetPath);
525
+ if (fs != null)
526
+ buildOpts = { filters, filterSchema: fs };
527
+ }
528
+ const search = buildSearch(base, schema, buildOpts);
529
+ let targetPathname = targetPath;
530
+ if (targetPathname === '')
531
+ targetPathname = '/';
532
+ let nextRoute = currentEntry.route;
533
+ if (targetPathname !== currentEntry.location.pathname) {
534
+ nextRoute = getMatchedRoute(flatRoutes, {
535
+ ...window.location,
536
+ pathname: targetPathname,
537
+ });
538
+ }
539
+ const effectiveSchema = schema ?? resolveSchema(targetPathname);
540
+ const rawQueryObj = parseRawQuery(search);
541
+ const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
542
+ const prepared = prepareMatch(nextRoute, typed);
543
+ currentEntry = {
544
+ forceRerender: false,
545
+ location: {
546
+ ...currentEntry.location,
547
+ pathname: targetPathname,
548
+ search,
549
+ },
550
+ route: nextRoute,
551
+ preparedMatch: prepared,
552
+ rawSearch: search,
553
+ query: rawQueryObj,
554
+ typedQuery: typed,
555
+ };
556
+ let normImmediate = targetPathname;
557
+ if (normImmediate === '')
558
+ normImmediate = '/';
559
+ const locationObj = { pathname: normImmediate, search, hash: '' };
560
+ if (replace)
561
+ history.set(locationObj);
562
+ else
563
+ history.push(locationObj);
564
+ devtoolsOnNavEvent?.({
565
+ kind: 'navigate',
566
+ mode: 'immediate',
567
+ count: 1,
568
+ pathname: normImmediate,
569
+ search,
570
+ timestamp: Date.now(),
571
+ });
572
+ }
573
+ catch {
574
+ }
575
+ },
72
576
  };
577
+ if ((devtoolsGlobal || devtoolsPanel) && typeof window !== 'undefined') {
578
+ (async () => {
579
+ try {
580
+ const mod = await import('./devtools.js');
581
+ if (mod != null && typeof mod.initRouterDevtools === 'function') {
582
+ devtoolsOnNavEvent = mod.initRouterDevtools({
583
+ context,
584
+ options: {
585
+ global: devtoolsGlobal,
586
+ panel: devtoolsPanel,
587
+ shortcut: devtoolsShortcut,
588
+ },
589
+ });
590
+ }
591
+ }
592
+ catch {
593
+ }
594
+ })();
595
+ }
73
596
  return { cleanup, context };
74
597
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBa0Q1RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUI7SUFHekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUdyQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFHdkMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLElBQUksWUFBWSxHQUFvQjtRQUNsQyxhQUFhLEVBQUUsS0FBSztRQUNwQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsS0FBSztRQUNMLGFBQWE7S0FDZCxDQUFDO0lBR0YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7SUFLOUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUM1RCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBRXBCLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVoRSxPQUFPO1FBQ1QsQ0FBQztRQUdELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBb0I7WUFDakMsYUFBYTtZQUNiLFFBQVE7WUFDUixLQUFLO1lBQ0wsYUFBYTtTQUNkLENBQUM7UUFHRixZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvQixRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUdILE1BQU0sT0FBTyxHQUE0QjtRQUN2QyxPQUFPO1FBQ1AsR0FBRztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxXQUFXLENBQUMsUUFBUTtZQUVsQixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFO2dCQUMxQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO2dCQUNsQixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBR0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDekIsT0FBTztnQkFDVCxDQUFDO2dCQUVELFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLENBQUMsUUFBUTtZQUVkLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFDLEdBQUcsTUFBTSxDQUFDLFFBQVE7Z0JBQ2xCLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELFNBQVMsQ0FBQyxRQUFRO1lBRWhCLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFDWixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFFbEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNuQixXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQztZQUNGLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7S0FDRixDQUFDO0lBR0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUm91dGUsXG4gIFJvdXRlRW50cnksXG4gIFJvdXRpbmdDb250ZXh0VHlwZSxcbiAgU3Vic2NyaWJlQ2FsbGJhY2ssXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIGNyZWF0ZVJvdXRlciBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyUmV0dXJuID0ge1xuICAvKiogRnVuY3Rpb24gdG8gY2xlYW4gdXAgcm91dGVyIGxpc3RlbmVycyBhbmQgcmVzb3VyY2VzICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBSb3V0ZXIgY29udGV4dCBvYmplY3QgZm9yIHRoZSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyICovXG4gIGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgcm91dGVyIHN5c3RlbSBmcm9tIHJvdXRlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFRoaXMgcm91dGVyIGlzIGJ1aWx0IGZyb20gdGhlIHNhbWUgcHJpbWl0aXZlcyBhcyByZWFjdC1yb3V0ZXIgYnV0IHdpdGggYWRkaXRpb25hbFxuICogZmVhdHVyZXMgZm9yIGRhdGEgcHJlbG9hZGluZyBhbmQgY29kZSBzcGxpdHRpbmcuIEVhY2ggcm91dGUgY2FuIGNvbnRhaW4gYm90aCBhXG4gKiBDb21wb25lbnQgYW5kIGEgcHJlcGFyZSgpIGZ1bmN0aW9uIHRoYXQgY2FuIHByZWxvYWQgZGF0YSBmb3IgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgcm91dGVyIHdhdGNoZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gdmlhIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSxcbiAqIG1hcHMgdGhlIGxvY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRlIGVudHJ5LCBhbmQgdGhlbiBwcmVsb2FkcyB0aGUgY29kZVxuICogYW5kIGRhdGEgZm9yIHRoZSByb3V0ZSBiZWZvcmUgcmVuZGVyaW5nLlxuICpcbiAqIEBwYXJhbSByb3V0ZXMgLSBBcnJheSBvZiByb3V0ZSBjb25maWd1cmF0aW9uc1xuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdXRlciBjb250ZXh0IGFuZCBjbGVhbnVwIGZ1bmN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJvdXRlcyA9IFtcbiAqICAge1xuICogICAgIHBhdGg6ICcvdXNlcnMvOmlkJyxcbiAqICAgICByZXNvdXJjZVBhZ2U6IGdldFJlc291cmNlUGFnZSgnVXNlclByb2ZpbGUnLCAoKSA9PiBpbXBvcnQoJy4vVXNlclByb2ZpbGUnKSksXG4gKiAgICAgcHJlcGFyZTogKHsgdmFyaWFibGVzIH0pID0+ICh7IHVzZXJJZDogdmFyaWFibGVzLmlkIH0pXG4gKiAgIH1cbiAqIF07XG4gKlxuICogY29uc3QgeyBjb250ZXh0LCBjbGVhbnVwIH0gPSBjcmVhdGVSb3V0ZXIocm91dGVzKTtcbiAqXG4gKiAvLyBVc2UgaW4gUmVhY3QgYXBwXG4gKiA8Um91dGluZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9PlxuICogICA8Um91dGVyUmVuZGVyZXIgLz5cbiAqIDwvUm91dGluZ0NvbnRleHQuUHJvdmlkZXI+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlUm91dGVyKFxuICByb3V0ZXM6IFJvdXRlPGFueSwgYW55PltdLFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIGhpc3RvcnkgbWFuYWdlclxuICBjb25zdCBoaXN0b3J5ID0gbmV3IEJyb3dzZXJIaXN0b3J5KCk7XG5cbiAgLy8gQnVpbGQgYSBmbGF0IGxpc3Qgb2Ygcm91dGVzIGZvciBlZmZpY2llbnQgbWF0Y2hpbmdcbiAgY29uc3QgZmxhdFJvdXRlcyA9IGJ1aWxkUm91dGVzKHJvdXRlcyk7XG5cbiAgLy8gRmluZCB0aGUgaW5pdGlhbCByb3V0ZSBtYXRjaCBhbmQgcHJlcGFyZSBpdCBmb3IgcmVuZGVyaW5nXG4gIGNvbnN0IHJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGhpc3RvcnkubG9jYXRpb24pO1xuICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKHJvdXRlKTtcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gIH07XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBpZiAoZm9yY2VSZXJlbmRlcikge1xuICAgICAgLy8gRm9yY2UgcmUtcmVuZGVyIGV2ZW4gaWYgcGF0aG5hbWUgaGFzbid0IGNoYW5nZWRcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIC8vIFNraXAgaWYgcGF0aG5hbWUgaGFzbid0IGNoYW5nZWQgKGF2b2lkIHVubmVjZXNzYXJ5IHdvcmspXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBtYXRjaGluZyByb3V0ZSBhbmQgcHJlcGFyZSBpdFxuICAgIGNvbnN0IHJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGhpc3RvcnkubG9jYXRpb24pO1xuICAgIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gocm91dGUpO1xuICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgZm9yY2VSZXJlbmRlcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcm91dGUsXG4gICAgICBwcmVwYXJlZE1hdGNoLFxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWUpIHtcbiAgICAgIC8vIFByZWxvYWQganVzdCB0aGUgY29tcG9uZW50IGNvZGUgZm9yIGEgcm91dGUgd2l0aG91dCBzdG9yaW5nIHRoZSByZXN1bHRcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIGFsbCByZXNvdXJjZSBwYWdlcyBmb3IgdGhlIG1hdGNoZWQgcm91dGVcbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZChwYXRobmFtZSkge1xuICAgICAgLy8gUHJlbG9hZCBib3RoIHRoZSBjb21wb25lbnQgY29kZSBhbmQgcHJlcGFyZWQgZGF0YSBmb3IgYSByb3V0ZVxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHByZXBhcmVNYXRjaChtYXRjaGVzKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgLy8gQWRkIGEgbmV3IHN1YnNjcmliZXIgYW5kIHJldHVybiB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLXN0eWxlXG4gICAgICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfTtcbiAgICAgIHN1YnNjcmliZXJzLnNldChpZCwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGRpc3Bvc2U7XG4gICAgfSxcbiAgfTtcblxuICAvLyBSZXR1cm4gYm90aCB0aGUgY29udGV4dCBvYmplY3QgYW5kIGEgY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4geyBjbGVhbnVwLCBjb250ZXh0IH07XG59XG4iXX0=
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFDckQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMs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QkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUdGLElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFFdkUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUdoRSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7d0JBQzFDLE9BQU87d0JBQ1AsT0FBTyxFQUFFOzRCQUNQLE1BQU0sRUFBRSxjQUFjOzRCQUN0QixLQUFLLEVBQUUsYUFBYTs0QkFDcEIsUUFBUSxFQUFFLGdCQUFnQjt5QkFDM0I7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO1lBRVQsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlVHlwZWRRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LWRzbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2ggfSBmcm9tICcuLi90b29scy9idWlsZFNlYXJjaC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlLFxuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55Pjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihcbiAgcm91dGVzOiBSb3V0ZTxhbnksIGFueT5bXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7IGdsb2JhbD86IGJvb2xlYW47IHBhbmVsPzogYm9vbGVhbjsgc2hvcnRjdXQ/OiBzdHJpbmcgfTtcbiAgICAvKiogV2hlbiB0cnVlLCBjb25zZWN1dGl2ZSBuYXZpZ2F0ZSgpIGNhbGxzIGluIHNhbWUgbWljcm90YXNrIGF1dG/igJFjb2FsZXNjZSAodW5sZXNzIGltbWVkaWF0ZTogdHJ1ZSkuICovXG4gICAgYXV0b0JhdGNoPzogYm9vbGVhbjtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvYyk7XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgbW9kZSxcbiAgICAgIGNvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIGJhdGNoTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBBZnRlciByZXNvbHZlRmlsdGVyU2NoZW1hIGlzIGRlZmluZWQgd2UgY2FuIGFwcGx5IGltcGxpY2l0IHNjaGVtYSBmb3IgYW55IHF1ZXVlZCBiYXRjaCAoaWYgc3RpbGwgcGVuZGluZylcbiAgLyoqIEFwcGx5IHByb3Zpc2lvbmFsIG1lcmdlZCBxdWVyeStmaWx0ZXJzIHVwZGF0ZSAoZHVyaW5nIGJhdGNoaW5nKVxuICAgKiB0byBjdXJyZW50RW50cnkgZm9yIHN5bmNocm9ub3VzIHJlYWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYShiYXNlUGF0aCk7XG4gICAgICBjb25zdCBtZXJnZWRRID0gYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/IGxhc3RCYXRjaFF1ZXJ5ID8/IHt9O1xuICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgZmlsdGVyU2NoZW1hOiBiYXRjaGVkRmlsdGVyU2NoZW1hLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHV0aW9uIGZvciBwcm92aXNpb25hbCB2aWV3XG4gICAgICAgIGxldCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByb3V0ZUNoYWluOlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9W11cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LnJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZGVzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBkZXN0Um91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlQ2hhaW4gIT0gbnVsbCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByb3V0ZUNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmcyA9IChcbiAgICAgICAgICAgICAgbm9kZSBhcyB7XG4gICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1lcmdlZCA/Pz0ge307XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBmcy5zY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2VkICE9IG51bGwpIHtcbiAgICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBiYXRjaGVkRmlsdGVycyxcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYTogbWVyZ2VkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcHJvdmlzaW9uYWxTZWFyY2ggPSBidWlsZFNlYXJjaChtZXJnZWRRLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICBjb25zdCBwYXRoQ2hhbmdlZCA9IGJhc2VQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBpZiAocHJvdmlzaW9uYWxTZWFyY2ggIT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2ggfHwgcGF0aENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoc2NoZW1hLCBtZXJnZWRRKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHByb3Zpc2lvbmFsU2VhcmNoKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2VhcmNoOiBwcm92aXNpb25hbFNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhd1NlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF1dG9CYXRjaCA9IG9wdHMuYXV0b0JhdGNoID09PSB0cnVlO1xuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lKTtcbiAgICB9LFxuICAgIGN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHJldHVybjtcbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZChwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiBTdWJzY3JpYmVDYWxsYmFjazxhbnk+KSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlcGxhY2UsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgYmF0Y2gsXG4gICAgICBpbW1lZGlhdGUsXG4gICAgICBpbmhlcml0LFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgIGJhdGNoPzogYm9vbGVhbjtcbiAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG4gICAgICBpbmhlcml0PzogYm9vbGVhbjtcbiAgICB9KTogdm9pZCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJbmhlcml0ID0gaW5oZXJpdCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd2FudHNCYXRjaCA9XG4gICAgICAgICAgYmF0Y2ggPT09IHRydWUgfHxcbiAgICAgICAgICAoYXV0b0JhdGNoICYmIGltbWVkaWF0ZSAhPT0gdHJ1ZSAmJiBiYXRjaCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAod2FudHNCYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG5hdjogUGVuZGluZ05hdiA9IHt9O1xuICAgICAgICAgIGlmIChwYXRobmFtZSAhPT0gdW5kZWZpbmVkKSBuYXYucGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkgbmF2LnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgaWYgKHJlcGxhY2UgIT09IHVuZGVmaW5lZCkgbmF2LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIG5hdi5pbmhlcml0ID0gdHJ1ZTtcbiAgICAgICAgICBwZW5kaW5nTmF2cyA/Pz0gW107XG4gICAgICAgICAgcGVuZGluZ05hdnMucHVzaChuYXYpO1xuICAgICAgICAgIGxldCB0aGlzTW9kZTogJ21hbnVhbCcgfCAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoID09PSB0cnVlKSB0aGlzTW9kZSA9ICdtYW51YWwnO1xuICAgICAgICAgIGVsc2UgdGhpc01vZGUgPSAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoTW9kZSA9PSBudWxsKSBiYXRjaE1vZGUgPSB0aGlzTW9kZTtcbiAgICAgICAgICBlbHNlIGlmIChiYXRjaE1vZGUgIT09IHRoaXNNb2RlKSBiYXRjaE1vZGUgPSAnbWl4ZWQnO1xuICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgY3VycmVudEVudHJ5LnF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4uYmFzZSwgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RCYXRjaFF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhdGNoZWRGaWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkgYmF0Y2hlZEZpbHRlclNjaGVtYSA9IGZpbHRlclNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmbHVzaFNjaGVkdWxlZCkge1xuICAgICAgICAgICAgZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaE5hdmlnYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lKTtcbiAgICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICAgICAgY2IoY3VycmVudEVudHJ5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW1tZWRpYXRlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IGJhc2U6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSB7XG4gICAgICAgICAgYmFzZSA9IHsgLi4uKGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fSkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIE9iamVjdC5hc3NpZ24oYmFzZSwgcXVlcnkpO1xuICAgICAgICAgIGVsc2UgYmFzZSA9IHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgPz89IGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcyA9IGZpbHRlclNjaGVtYSA/PyByZXNvbHZlRmlsdGVyU2NoZW1hKHRhcmdldFBhdGgpO1xuICAgICAgICAgIGlmIChmcyAhPSBudWxsKSBidWlsZE9wdHMgPSB7IGZpbHRlcnMsIGZpbHRlclNjaGVtYTogZnMgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICAgIGxldCB0YXJnZXRQYXRobmFtZSA9IHRhcmdldFBhdGg7XG4gICAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgIT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU2NoZW1hID0gc2NoZW1hID8/IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgICAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoZWZmZWN0aXZlU2NoZW1hLCByYXdRdWVyeU9iaik7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWQpO1xuICAgICAgICBjdXJyZW50RW50cnkgPSB7XG4gICAgICAgICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZWQsXG4gICAgICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgICAgbGV0IG5vcm1JbW1lZGlhdGUgPSB0YXJnZXRQYXRobmFtZTtcbiAgICAgICAgaWYgKG5vcm1JbW1lZGlhdGUgPT09ICcnKSBub3JtSW1tZWRpYXRlID0gJy8nO1xuICAgICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IG5vcm1JbW1lZGlhdGUsIHNlYXJjaCwgaGFzaDogJycgfTtcbiAgICAgICAgaWYgKHJlcGxhY2UpIGhpc3Rvcnkuc2V0KGxvY2F0aW9uT2JqKTtcbiAgICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICBtb2RlOiAnaW1tZWRpYXRlJyxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIER5bmFtaWMgZGV2dG9vbHMgbG9hZCAoZGV2IG9ubHkpIC0gc2VwYXJhdGUgY2h1bmsgZm9yIHRyZWUtc2hha2luZ1xuICBpZiAoKGRldnRvb2xzR2xvYmFsIHx8IGRldnRvb2xzUGFuZWwpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtb2Q6IGFueSA9IGF3YWl0IGltcG9ydCgnLi9kZXZ0b29scy5qcycpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCAmJiB0eXBlb2YgbW9kLmluaXRSb3V0ZXJEZXZ0b29scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljLWVzbGludC9tYXgtbGVuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50ID0gbW9kLmluaXRSb3V0ZXJEZXZ0b29scyh7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBnbG9iYWw6IGRldnRvb2xzR2xvYmFsLFxuICAgICAgICAgICAgICBwYW5lbDogZGV2dG9vbHNQYW5lbCxcbiAgICAgICAgICAgICAgc2hvcnRjdXQ6IGRldnRvb2xzU2hvcnRjdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==