@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
@@ -0,0 +1,678 @@
1
+ import { parseFilters } from './filters.js';
2
+ function diffQueries(prev, next) {
3
+ const added = [];
4
+ const removed = [];
5
+ const changed = [];
6
+ const unchanged = [];
7
+ const prevObj = prev ?? {};
8
+ const prevKeys = new Set(Object.keys(prevObj));
9
+ for (const k of Object.keys(next)) {
10
+ if (!prevKeys.has(k)) {
11
+ added.push(k);
12
+ }
13
+ else {
14
+ const pv = prevObj[k];
15
+ const nv = next[k];
16
+ let same = false;
17
+ if (Array.isArray(pv) && Array.isArray(nv) && pv.length === nv.length) {
18
+ same = pv.every((v, i) => {
19
+ return v === nv[i];
20
+ });
21
+ }
22
+ else {
23
+ same = pv === nv;
24
+ }
25
+ if (same) {
26
+ unchanged.push(k);
27
+ }
28
+ else {
29
+ changed.push(k);
30
+ }
31
+ prevKeys.delete(k);
32
+ }
33
+ }
34
+ for (const k of prevKeys) {
35
+ removed.push(k);
36
+ }
37
+ return { added, removed, changed, unchanged };
38
+ }
39
+ function styleMiniButton(btn, color) {
40
+ const { style } = btn;
41
+ style.cursor = 'pointer';
42
+ style.background = '#fff';
43
+ style.border = '1px solid #ccc';
44
+ style.borderRadius = '4px';
45
+ style.fontSize = '10px';
46
+ style.lineHeight = '1';
47
+ style.padding = '2px 6px';
48
+ style.color = color;
49
+ }
50
+ function stylePillClose(btn) {
51
+ const { style } = btn;
52
+ style.cursor = 'pointer';
53
+ style.background = 'transparent';
54
+ style.border = 'none';
55
+ style.fontSize = '10px';
56
+ style.lineHeight = '1';
57
+ style.padding = '0 2px';
58
+ style.color = '#444';
59
+ }
60
+ function createQueryDiffPill(label, kind) {
61
+ const span = document.createElement('span');
62
+ span.textContent = label;
63
+ span.style.padding = '1px 4px';
64
+ span.style.borderRadius = '10px';
65
+ span.style.fontSize = '10px';
66
+ span.style.border = '1px solid';
67
+ if (kind === 'added') {
68
+ span.style.background = '#e6ffed';
69
+ span.style.borderColor = '#2cbe4e';
70
+ span.style.color = '#22863a';
71
+ }
72
+ else if (kind === 'removed') {
73
+ span.style.background = '#ffeef0';
74
+ span.style.borderColor = '#d73a49';
75
+ span.style.color = '#cb2431';
76
+ }
77
+ else if (kind === 'changed') {
78
+ span.style.background = '#fff5b1';
79
+ span.style.borderColor = '#ffd33d';
80
+ span.style.color = '#735c0f';
81
+ }
82
+ else {
83
+ span.style.background = '#f1f8ff';
84
+ span.style.borderColor = '#79b8ff';
85
+ span.style.color = '#0366d6';
86
+ }
87
+ return span;
88
+ }
89
+ function mountDevtoolsPanel(params) {
90
+ try {
91
+ if (typeof window === 'undefined' || typeof document === 'undefined') {
92
+ return function noopRecorder() {
93
+ };
94
+ }
95
+ if (document.querySelector('[data-plumile-router-devtools-panel]') != null) {
96
+ return function alreadyMountedRecorder() {
97
+ };
98
+ }
99
+ const { context, shortcut } = params;
100
+ const host = document.createElement('div');
101
+ host.setAttribute('data-plumile-router-devtools-panel', '');
102
+ const hostStyle = host.style;
103
+ hostStyle.position = 'fixed';
104
+ hostStyle.zIndex = '2147483646';
105
+ hostStyle.bottom = '8px';
106
+ hostStyle.right = '8px';
107
+ hostStyle.fontFamily = [
108
+ 'ui-monospace',
109
+ 'SFMono-Regular',
110
+ 'Menlo',
111
+ 'Monaco',
112
+ 'Consolas',
113
+ '"Liberation Mono"',
114
+ 'monospace',
115
+ ].join(', ');
116
+ hostStyle.fontSize = '12px';
117
+ hostStyle.lineHeight = '1.3';
118
+ hostStyle.color = '#111';
119
+ hostStyle.background = 'transparent';
120
+ hostStyle.pointerEvents = 'none';
121
+ const shadow = host.attachShadow({ mode: 'open' });
122
+ const panel = document.createElement('div');
123
+ const panelStyle = panel.style;
124
+ panelStyle.pointerEvents = 'auto';
125
+ panelStyle.minWidth = '260px';
126
+ panelStyle.maxWidth = '420px';
127
+ panelStyle.maxHeight = '50vh';
128
+ panelStyle.overflow = 'auto';
129
+ panelStyle.background = 'rgba(255,255,255,0.95)';
130
+ panelStyle.border = '1px solid #ccc';
131
+ panelStyle.borderRadius = '6px';
132
+ panelStyle.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
133
+ panelStyle.padding = '6px 8px 8px';
134
+ panelStyle.backdropFilter = 'blur(4px)';
135
+ panelStyle.display = 'flex';
136
+ panelStyle.flexDirection = 'column';
137
+ panelStyle.rowGap = '4px';
138
+ const header = document.createElement('div');
139
+ const headerStyle = header.style;
140
+ headerStyle.display = 'flex';
141
+ headerStyle.alignItems = 'center';
142
+ headerStyle.justifyContent = 'space-between';
143
+ headerStyle.gap = '8px';
144
+ const title = document.createElement('span');
145
+ title.textContent = 'Plumile Router';
146
+ title.style.fontWeight = '600';
147
+ const headerBtns = document.createElement('div');
148
+ const headerBtnsStyle = headerBtns.style;
149
+ headerBtnsStyle.display = 'flex';
150
+ headerBtnsStyle.gap = '4px';
151
+ headerBtnsStyle.alignItems = 'center';
152
+ const tabsWrap = document.createElement('div');
153
+ const tabsWrapStyle = tabsWrap.style;
154
+ tabsWrapStyle.display = 'flex';
155
+ tabsWrapStyle.gap = '4px';
156
+ tabsWrapStyle.marginRight = '6px';
157
+ const routeTabButton = document.createElement('button');
158
+ routeTabButton.textContent = 'Route';
159
+ const filtersTabButton = document.createElement('button');
160
+ filtersTabButton.textContent = 'Filters';
161
+ const tabButtons = [routeTabButton, filtersTabButton];
162
+ for (const tb of tabButtons) {
163
+ const s = tb.style;
164
+ s.cursor = 'pointer';
165
+ s.background = '#f1f1f1';
166
+ s.border = '1px solid #ccc';
167
+ s.borderRadius = '4px';
168
+ s.fontSize = '11px';
169
+ s.padding = '2px 6px';
170
+ }
171
+ routeTabButton.style.fontWeight = '600';
172
+ routeTabButton.dataset.active = 'true';
173
+ tabsWrap.appendChild(routeTabButton);
174
+ tabsWrap.appendChild(filtersTabButton);
175
+ const collapseBtn = document.createElement('button');
176
+ collapseBtn.textContent = '−';
177
+ const closeBtn = document.createElement('button');
178
+ closeBtn.textContent = '×';
179
+ const headerActionButtons = [collapseBtn, closeBtn];
180
+ for (const b of headerActionButtons) {
181
+ const st = b.style;
182
+ st.cursor = 'pointer';
183
+ st.background = '#eee';
184
+ st.border = '1px solid #ccc';
185
+ st.borderRadius = '4px';
186
+ st.fontSize = '11px';
187
+ st.lineHeight = '1';
188
+ st.padding = '2px 5px';
189
+ }
190
+ header.appendChild(title);
191
+ headerBtns.appendChild(tabsWrap);
192
+ headerBtns.appendChild(collapseBtn);
193
+ headerBtns.appendChild(closeBtn);
194
+ header.appendChild(headerBtns);
195
+ const pathDisplay = document.createElement('div');
196
+ pathDisplay.style.whiteSpace = 'nowrap';
197
+ const varsPre = document.createElement('pre');
198
+ const rawQueryPre = document.createElement('pre');
199
+ const typedQueryPre = document.createElement('pre');
200
+ const preBlocks = [varsPre, rawQueryPre, typedQueryPre];
201
+ for (const pb of preBlocks) {
202
+ const stp = pb.style;
203
+ stp.margin = '0';
204
+ stp.padding = '4px';
205
+ stp.background = '#f6f8fa';
206
+ stp.border = '1px solid #e2e2e2';
207
+ stp.borderRadius = '4px';
208
+ stp.overflowX = 'auto';
209
+ stp.maxHeight = '160px';
210
+ }
211
+ const timelineWrap = document.createElement('div');
212
+ const timelineWrapStyle = timelineWrap.style;
213
+ timelineWrapStyle.display = 'flex';
214
+ timelineWrapStyle.flexDirection = 'column';
215
+ timelineWrapStyle.gap = '2px';
216
+ timelineWrapStyle.marginTop = '4px';
217
+ const timelineHeader = document.createElement('div');
218
+ timelineHeader.textContent = 'Timeline (query changes)';
219
+ timelineHeader.style.fontWeight = '600';
220
+ timelineHeader.style.fontSize = '11px';
221
+ const timeline = document.createElement('div');
222
+ const timelineStyle = timeline.style;
223
+ timelineStyle.display = 'flex';
224
+ timelineStyle.flexDirection = 'column-reverse';
225
+ timelineStyle.maxHeight = '140px';
226
+ timelineStyle.overflowY = 'auto';
227
+ timelineStyle.border = '1px solid #e2e2e2';
228
+ timelineStyle.borderRadius = '4px';
229
+ timelineStyle.background = '#fafbfc';
230
+ timelineStyle.fontFamily = 'inherit';
231
+ timelineStyle.fontSize = '11px';
232
+ timelineWrap.appendChild(timelineHeader);
233
+ timelineWrap.appendChild(timeline);
234
+ const routeTabContent = document.createElement('div');
235
+ const routeTabContentStyle = routeTabContent.style;
236
+ routeTabContentStyle.display = 'flex';
237
+ routeTabContentStyle.flexDirection = 'column';
238
+ routeTabContentStyle.gap = '4px';
239
+ routeTabContent.appendChild(pathDisplay);
240
+ routeTabContent.appendChild(varsPre);
241
+ routeTabContent.appendChild(rawQueryPre);
242
+ routeTabContent.appendChild(typedQueryPre);
243
+ routeTabContent.appendChild(timelineWrap);
244
+ const filtersTabContent = document.createElement('div');
245
+ const filtersTabContentStyle = filtersTabContent.style;
246
+ filtersTabContentStyle.display = 'none';
247
+ filtersTabContentStyle.flexDirection = 'column';
248
+ filtersTabContentStyle.gap = '4px';
249
+ const filterActionsWrap = document.createElement('div');
250
+ const filterActionsWrapStyle = filterActionsWrap.style;
251
+ filterActionsWrapStyle.display = 'flex';
252
+ filterActionsWrapStyle.flexWrap = 'wrap';
253
+ filterActionsWrapStyle.gap = '4px';
254
+ const filtersBody = document.createElement('div');
255
+ const filtersBodyStyle = filtersBody.style;
256
+ filtersBodyStyle.display = 'flex';
257
+ filtersBodyStyle.flexDirection = 'column';
258
+ filtersBodyStyle.gap = '4px';
259
+ filtersTabContent.appendChild(filterActionsWrap);
260
+ filtersTabContent.appendChild(filtersBody);
261
+ const shortcutHint = document.createElement('div');
262
+ shortcutHint.textContent = `Shortcut: ${shortcut}`;
263
+ shortcutHint.style.fontSize = '10px';
264
+ shortcutHint.style.opacity = '0.7';
265
+ panel.appendChild(header);
266
+ panel.appendChild(routeTabContent);
267
+ panel.appendChild(filtersTabContent);
268
+ panel.appendChild(shortcutHint);
269
+ shadow.appendChild(panel);
270
+ document.body.appendChild(host);
271
+ let collapsed = false;
272
+ function onCollapseToggle() {
273
+ collapsed = !collapsed;
274
+ if (collapsed) {
275
+ panel.style.maxHeight = '24px';
276
+ panel.style.overflow = 'hidden';
277
+ collapseBtn.textContent = '+';
278
+ }
279
+ else {
280
+ panel.style.maxHeight = '50vh';
281
+ panel.style.overflow = 'auto';
282
+ collapseBtn.textContent = '−';
283
+ }
284
+ }
285
+ collapseBtn.addEventListener('click', onCollapseToggle);
286
+ let unsubscribe;
287
+ function onClose() {
288
+ host.remove();
289
+ if (typeof unsubscribe === 'function') {
290
+ unsubscribe();
291
+ }
292
+ }
293
+ closeBtn.addEventListener('click', onClose);
294
+ const navEvents = [];
295
+ function recordNavEvent(meta) {
296
+ navEvents.push(meta);
297
+ if (navEvents.length > 60)
298
+ navEvents.shift();
299
+ }
300
+ let lastQuery;
301
+ let lastSearch;
302
+ function render() {
303
+ try {
304
+ const entry = context.get();
305
+ pathDisplay.textContent = `${entry.location.pathname}${entry.location.search}`;
306
+ varsPre.textContent = `vars: ${JSON.stringify(entry.route?.params ?? {}, null, 2)}`;
307
+ rawQueryPre.textContent = `raw: ${JSON.stringify(entry.query, null, 2)}`;
308
+ typedQueryPre.textContent = `typed: ${JSON.stringify(entry.typedQuery, null, 2)}`;
309
+ if (entry.rawSearch !== lastSearch) {
310
+ const currentQuery = entry.query;
311
+ const diff = diffQueries(lastQuery, currentQuery);
312
+ const row = document.createElement('div');
313
+ const rowStyle = row.style;
314
+ rowStyle.display = 'flex';
315
+ rowStyle.flexDirection = 'column';
316
+ rowStyle.borderBottom = '1px solid #e9e9e9';
317
+ rowStyle.padding = '3px 4px';
318
+ const head = document.createElement('div');
319
+ const headStyle = head.style;
320
+ headStyle.display = 'flex';
321
+ headStyle.justifyContent = 'space-between';
322
+ const timeStr = new Date().toLocaleTimeString();
323
+ let searchDisplay = '(empty)';
324
+ if (entry.location.search !== '') {
325
+ searchDisplay = entry.location.search;
326
+ }
327
+ let origin = 'system';
328
+ for (let i = navEvents.length - 1; i >= 0; i -= 1) {
329
+ const ev = navEvents[i];
330
+ if (ev != null && ev.search === entry.rawSearch) {
331
+ origin = `${ev.kind}:${ev.mode}`;
332
+ if (ev.kind === 'batch-flush') {
333
+ origin = `${origin}(${ev.count})`;
334
+ }
335
+ break;
336
+ }
337
+ }
338
+ head.innerHTML = [
339
+ `<strong>${timeStr}</strong>`,
340
+ `<code style="background:#eee;padding:1px 3px;border-radius:3px;">${searchDisplay}</code>`,
341
+ `<span style="font-size:10px;opacity:0.7;">${origin}</span>`,
342
+ ].join(' ');
343
+ const body = document.createElement('div');
344
+ const bodyStyle = body.style;
345
+ bodyStyle.display = 'flex';
346
+ bodyStyle.flexWrap = 'wrap';
347
+ bodyStyle.gap = '4px';
348
+ if (diff.added.length > 0) {
349
+ for (const k of diff.added) {
350
+ body.appendChild(createQueryDiffPill(`+${k}`, 'added'));
351
+ }
352
+ }
353
+ if (diff.changed.length > 0) {
354
+ for (const k of diff.changed) {
355
+ body.appendChild(createQueryDiffPill(`~${k}`, 'changed'));
356
+ }
357
+ }
358
+ if (diff.removed.length > 0) {
359
+ for (const k of diff.removed) {
360
+ body.appendChild(createQueryDiffPill(`-${k}`, 'removed'));
361
+ }
362
+ }
363
+ if (diff.added.length === 0 &&
364
+ diff.changed.length === 0 &&
365
+ diff.removed.length === 0) {
366
+ body.appendChild(createQueryDiffPill('no-change', 'unchanged'));
367
+ }
368
+ row.appendChild(head);
369
+ row.appendChild(body);
370
+ timeline.appendChild(row);
371
+ if (timeline.childElementCount > 50) {
372
+ const first = timeline.firstElementChild;
373
+ if (first != null) {
374
+ timeline.removeChild(first);
375
+ }
376
+ }
377
+ lastQuery = currentQuery;
378
+ lastSearch = entry.rawSearch;
379
+ }
380
+ try {
381
+ const merged = context.currentMergedFilterSchema();
382
+ while (filterActionsWrap.firstChild != null) {
383
+ filterActionsWrap.removeChild(filterActionsWrap.firstChild);
384
+ }
385
+ while (filtersBody.firstChild != null) {
386
+ filtersBody.removeChild(filtersBody.firstChild);
387
+ }
388
+ if (merged == null) {
389
+ const emptyMsg = document.createElement('div');
390
+ emptyMsg.textContent = 'No filter schema for current route';
391
+ emptyMsg.style.fontStyle = 'italic';
392
+ filtersBody.appendChild(emptyMsg);
393
+ }
394
+ else {
395
+ const schemaObj = merged.schema;
396
+ let parsedFilters = {};
397
+ try {
398
+ parsedFilters = parseFilters(merged, entry.query);
399
+ }
400
+ catch {
401
+ }
402
+ const fieldNames = Object.keys(schemaObj).sort();
403
+ let anyActive = false;
404
+ for (const f of fieldNames) {
405
+ const state = parsedFilters[f];
406
+ if (state != null && Object.keys(state).length > 0) {
407
+ anyActive = true;
408
+ break;
409
+ }
410
+ }
411
+ if (anyActive) {
412
+ const clearAllBtn = document.createElement('button');
413
+ clearAllBtn.textContent = 'Clear All Filters';
414
+ styleMiniButton(clearAllBtn, '#d73a49');
415
+ function onClearAllFilters() {
416
+ try {
417
+ const blank = {};
418
+ for (const fname of fieldNames) {
419
+ blank[fname] = {};
420
+ }
421
+ context.navigate({
422
+ filters: blank,
423
+ filterSchema: merged,
424
+ batch: true,
425
+ });
426
+ }
427
+ catch {
428
+ }
429
+ }
430
+ clearAllBtn.addEventListener('click', onClearAllFilters);
431
+ filterActionsWrap.appendChild(clearAllBtn);
432
+ }
433
+ for (const field of fieldNames) {
434
+ const defLike = schemaObj[field];
435
+ const fieldBox = document.createElement('div');
436
+ const fbStyle = fieldBox.style;
437
+ fbStyle.border = '1px solid #e2e2e2';
438
+ fbStyle.borderRadius = '4px';
439
+ fbStyle.padding = '4px 6px';
440
+ fbStyle.background = '#f9fafb';
441
+ fbStyle.display = 'flex';
442
+ fbStyle.flexDirection = 'column';
443
+ fbStyle.gap = '3px';
444
+ const fieldHead = document.createElement('div');
445
+ const headStyle2 = fieldHead.style;
446
+ headStyle2.display = 'flex';
447
+ headStyle2.justifyContent = 'space-between';
448
+ headStyle2.alignItems = 'center';
449
+ const labelEl = document.createElement('strong');
450
+ let labelText = field;
451
+ if (defLike?.label != null) {
452
+ labelText = String(defLike.label);
453
+ }
454
+ labelEl.textContent = labelText;
455
+ labelEl.style.fontSize = '11px';
456
+ const headActions = document.createElement('div');
457
+ headActions.style.display = 'flex';
458
+ headActions.style.gap = '4px';
459
+ const clearFieldBtn = document.createElement('button');
460
+ clearFieldBtn.textContent = 'clear';
461
+ styleMiniButton(clearFieldBtn, '#6a737d');
462
+ function onClearField() {
463
+ try {
464
+ const next = { ...parsedFilters };
465
+ next[field] = {};
466
+ context.navigate({
467
+ filters: next,
468
+ filterSchema: merged,
469
+ batch: true,
470
+ });
471
+ }
472
+ catch {
473
+ }
474
+ }
475
+ clearFieldBtn.addEventListener('click', onClearField);
476
+ headActions.appendChild(clearFieldBtn);
477
+ fieldHead.appendChild(labelEl);
478
+ fieldHead.appendChild(headActions);
479
+ fieldBox.appendChild(fieldHead);
480
+ const opsWrap = document.createElement('div');
481
+ const opsWrapStyle = opsWrap.style;
482
+ opsWrapStyle.display = 'flex';
483
+ opsWrapStyle.flexWrap = 'wrap';
484
+ opsWrapStyle.gap = '4px';
485
+ const present = parsedFilters[field] ?? {};
486
+ const defaults = defLike?.defaults ?? {};
487
+ let allowed = [];
488
+ if (Array.isArray(defLike?.operators)) {
489
+ allowed = defLike.operators.slice();
490
+ }
491
+ else if (defLike?.kind === 'number') {
492
+ allowed = [
493
+ 'eq',
494
+ 'neq',
495
+ 'gt',
496
+ 'gte',
497
+ 'lt',
498
+ 'lte',
499
+ 'in',
500
+ 'nin',
501
+ 'between',
502
+ 'exists',
503
+ ];
504
+ }
505
+ else {
506
+ allowed = [
507
+ 'eq',
508
+ 'neq',
509
+ 'in',
510
+ 'nin',
511
+ 'between',
512
+ 'exists',
513
+ 'contains',
514
+ 'starts',
515
+ 'ends',
516
+ 'regex',
517
+ ];
518
+ }
519
+ for (const op of allowed) {
520
+ const span = document.createElement('span');
521
+ const spanStyle = span.style;
522
+ spanStyle.display = 'inline-flex';
523
+ spanStyle.alignItems = 'center';
524
+ spanStyle.gap = '2px';
525
+ spanStyle.padding = '1px 5px';
526
+ spanStyle.borderRadius = '12px';
527
+ spanStyle.border = '1px solid #d0d7de';
528
+ spanStyle.fontSize = '10px';
529
+ const activeVal = present[op];
530
+ if (activeVal != null) {
531
+ spanStyle.background = '#e6ffed';
532
+ spanStyle.borderColor = '#34d058';
533
+ const opText = document.createElement('span');
534
+ opText.textContent = op;
535
+ span.appendChild(opText);
536
+ const closeBtnOp = document.createElement('button');
537
+ closeBtnOp.textContent = '×';
538
+ stylePillClose(closeBtnOp);
539
+ function onRemoveOperator() {
540
+ try {
541
+ const next = { ...parsedFilters };
542
+ const existing = next[field] ?? {};
543
+ const copyField = {};
544
+ for (const k of Object.keys(existing)) {
545
+ if (k !== op) {
546
+ copyField[k] = existing[k];
547
+ }
548
+ }
549
+ next[field] = copyField;
550
+ context.navigate({
551
+ filters: next,
552
+ filterSchema: merged,
553
+ batch: true,
554
+ });
555
+ }
556
+ catch {
557
+ }
558
+ }
559
+ closeBtnOp.addEventListener('click', onRemoveOperator);
560
+ span.appendChild(closeBtnOp);
561
+ }
562
+ else {
563
+ const isDefault = Object.prototype.hasOwnProperty.call(defaults, op);
564
+ if (isDefault) {
565
+ span.textContent = `${op} (default)`;
566
+ spanStyle.fontStyle = 'italic';
567
+ span.title = 'Default value omitted in URL';
568
+ }
569
+ else {
570
+ span.textContent = op;
571
+ }
572
+ spanStyle.opacity = '0.55';
573
+ }
574
+ opsWrap.appendChild(span);
575
+ }
576
+ fieldBox.appendChild(opsWrap);
577
+ filtersBody.appendChild(fieldBox);
578
+ }
579
+ }
580
+ }
581
+ catch {
582
+ }
583
+ }
584
+ catch {
585
+ }
586
+ }
587
+ render();
588
+ unsubscribe = context.subscribe(render);
589
+ function activateTab(name) {
590
+ if (name === 'route') {
591
+ routeTabContent.style.display = 'flex';
592
+ filtersTabContent.style.display = 'none';
593
+ routeTabButton.dataset.active = 'true';
594
+ filtersTabButton.dataset.active = 'false';
595
+ routeTabButton.style.fontWeight = '600';
596
+ filtersTabButton.style.fontWeight = 'normal';
597
+ }
598
+ else {
599
+ routeTabContent.style.display = 'none';
600
+ filtersTabContent.style.display = 'flex';
601
+ filtersTabButton.dataset.active = 'true';
602
+ routeTabButton.dataset.active = 'false';
603
+ filtersTabButton.style.fontWeight = '600';
604
+ routeTabButton.style.fontWeight = 'normal';
605
+ }
606
+ }
607
+ function onRouteTabClick() {
608
+ activateTab('route');
609
+ }
610
+ function onFiltersTabClick() {
611
+ activateTab('filters');
612
+ }
613
+ routeTabButton.addEventListener('click', onRouteTabClick);
614
+ filtersTabButton.addEventListener('click', onFiltersTabClick);
615
+ function onKeydown(ev) {
616
+ try {
617
+ const parts = [];
618
+ if (ev.altKey)
619
+ parts.push('Alt');
620
+ if (ev.shiftKey)
621
+ parts.push('Shift');
622
+ if (ev.ctrlKey)
623
+ parts.push('Ctrl');
624
+ let keyPart = ev.key;
625
+ if (ev.key.length === 1) {
626
+ keyPart = ev.key.toUpperCase();
627
+ }
628
+ parts.push(keyPart);
629
+ const combo = parts.join('+');
630
+ const normShortcut = shortcut.replace(/\s+/g, '');
631
+ if (combo === normShortcut) {
632
+ if (host.style.display === 'none') {
633
+ host.style.display = 'block';
634
+ }
635
+ else {
636
+ host.style.display = 'none';
637
+ }
638
+ }
639
+ }
640
+ catch {
641
+ }
642
+ }
643
+ window.addEventListener('keydown', onKeydown);
644
+ return recordNavEvent;
645
+ }
646
+ catch {
647
+ return function silentRecorder() {
648
+ };
649
+ }
650
+ }
651
+ export function initRouterDevtools(params) {
652
+ const { context, options } = params;
653
+ const { global, panel, shortcut } = options;
654
+ if (global) {
655
+ try {
656
+ if (typeof window !== 'undefined') {
657
+ window.__PLUMILE_ROUTER__ = {
658
+ get: context.get,
659
+ subscribe: context.subscribe,
660
+ };
661
+ }
662
+ }
663
+ catch {
664
+ }
665
+ }
666
+ function noopNavRecorder() {
667
+ }
668
+ let navRecorder = noopNavRecorder;
669
+ if (panel) {
670
+ navRecorder = mountDevtoolsPanel({ context, shortcut });
671
+ }
672
+ function handleNavEvent(meta) {
673
+ navRecorder(meta);
674
+ }
675
+ return handleNavEvent;
676
+ }
677
+ export default initRouterDevtools;
678
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2dG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGluZy9kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBd0I1QyxTQUFTLFdBQVcsQ0FDbEIsSUFBeUMsRUFDekMsSUFBNkI7SUFFN0IsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0RSxJQUFJLEdBQUcsRUFBRSxDQUFD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RUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxjQUFjLENBQUMsSUFBd0I7UUFDOUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQsZUFBZSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIFJvdXRlciBEZXZ0b29scyBleHRyYWN0ZWQgbW9kdWxlIChkZXZlbG9wbWVudC1vbmx5KS5cbiAqIE9iamVjdGlmIHJlZmFjdG9yOiBsaXNpYmlsaXTDqSBhbcOpbGlvcsOpZSAobm9tcyBleHBsaWNpdGVzLCBoZWxwZXJzIGV4dGVybmFsaXPDqXMpLlxuICovXG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdDb250ZXh0VHlwZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHBhcnNlRmlsdGVycyB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdFJvdXRlckRldnRvb2xzT3B0aW9ucyB7XG4gIGdsb2JhbDogYm9vbGVhbjtcbiAgcGFuZWw6IGJvb2xlYW47XG4gIHNob3J0Y3V0OiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIE5hdkV2ZW50TWV0YVB1YmxpYyB7XG4gIGtpbmQ6IHN0cmluZztcbiAgbW9kZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBwYXRobmFtZTogc3RyaW5nO1xuICBzZWFyY2g6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbi8qKiBJbml0IGRldnRvb2xzIGFuZCByZXR1cm4gbmF2IGV2ZW50IGNhbGxiYWNrIChzZWUgZXhwb3J0ZWQgaW5pdCkuICovXG4vKipcbiAqIENvbXB1dGUgYSBkaWZmIGJldHdlZW4gdHdvIHF1ZXJ5IG9iamVjdHMgKGZsYXQga2V5LXZhbHVlIG1hcHMpLlxuICogQ2xvbmVzIGFyZSBub3QgcGVyZm9ybWVkOiBrZXlzIGFyZSBpbnNwZWN0ZWQgZGlyZWN0bHkgYW5kIGNhdGVnb3JpemVkLlxuICogQHBhcmFtIHByZXYgUHJldmlvdXMgcXVlcnkgb2JqZWN0IChjYW4gYmUgdW5kZWZpbmVkIG9uIGZpcnN0IHJlbmRlcikuXG4gKiBAcGFyYW0gbmV4dCBDdXJyZW50IHF1ZXJ5IG9iamVjdC5cbiAqIEByZXR1cm5zIEJ1Y2tldHMgb2Yga2V5czogYWRkZWQsIHJlbW92ZWQsIGNoYW5nZWQsIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGlmZlF1ZXJpZXMoXG4gIHByZXY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbikge1xuICBjb25zdCBhZGRlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVtb3ZlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY2hhbmdlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdW5jaGFuZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwcmV2T2JqID0gcHJldiA/PyB7fTtcbiAgY29uc3QgcHJldktleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHByZXZPYmopKTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKG5leHQpKSB7XG4gICAgaWYgKCFwcmV2S2V5cy5oYXMoaykpIHtcbiAgICAgIGFkZGVkLnB1c2goayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHB2ID0gcHJldk9ialtrXTtcbiAgICAgIGNvbnN0IG52ID0gbmV4dFtrXTtcbiAgICAgIGxldCBzYW1lID0gZmFsc2U7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwdikgJiYgQXJyYXkuaXNBcnJheShudikgJiYgcHYubGVuZ3RoID09PSBudi5sZW5ndGgpIHtcbiAgICAgICAgc2FtZSA9IHB2LmV2ZXJ5KCh2LCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHYgPT09IG52W2ldO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNhbWUgPSBwdiA9PT0gbnY7XG4gICAgICB9XG4gICAgICBpZiAoc2FtZSkge1xuICAgICAgICB1bmNoYW5nZWQucHVzaChrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYW5nZWQucHVzaChrKTtcbiAgICAgIH1cbiAgICAgIHByZXZLZXlzLmRlbGV0ZShrKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrIG9mIHByZXZLZXlzKSB7XG4gICAgcmVtb3ZlZC5wdXNoKGspO1xuICB9XG4gIHJldHVybiB7IGFkZGVkLCByZW1vdmVkLCBjaGFuZ2VkLCB1bmNoYW5nZWQgfTtcbn1cbi8qKlxuICogQXBwbHkgbWluaW1hbCBidXR0b24gc3R5bGluZyB1c2VkIGZvciBzbWFsbCBhY3Rpb24gYnV0dG9ucyBpbiB0aGUgZGV2dG9vbHMgcGFuZWwuXG4gKiBAcGFyYW0gYnRuIFRhcmdldCBidXR0b24gZWxlbWVudC5cbiAqIEBwYXJhbSBjb2xvciBUZXh0IGNvbG9yIHRvIGFwcGx5LlxuICovXG5mdW5jdGlvbiBzdHlsZU1pbmlCdXR0b24oYnRuOiBIVE1MQnV0dG9uRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB7IHN0eWxlIH0gPSBidG47XG4gIHN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjY2NjJztcbiAgc3R5bGUuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gIHN0eWxlLmZvbnRTaXplID0gJzEwcHgnO1xuICBzdHlsZS5saW5lSGVpZ2h0ID0gJzEnO1xuICBzdHlsZS5wYWRkaW5nID0gJzJweCA2cHgnO1xuICBzdHlsZS5jb2xvciA9IGNvbG9yO1xufVxuLyoqXG4gKiBTdHlsZSB0aGUgY2xvc2UgKHgpIGJ1dHRvbiB0aGF0IGFwcGVhcnMgaW5zaWRlIHF1ZXJ5IC8gb3BlcmF0b3IgcGlsbHMuXG4gKiBAcGFyYW0gYnRuIFRhcmdldCBidXR0b24gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gc3R5bGVQaWxsQ2xvc2UoYnRuOiBIVE1MQnV0dG9uRWxlbWVudCk6IHZvaWQge1xuICBjb25zdCB7IHN0eWxlIH0gPSBidG47XG4gIHN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gIHN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgc3R5bGUuZm9udFNpemUgPSAnMTBweCc7XG4gIHN0eWxlLmxpbmVIZWlnaHQgPSAnMSc7XG4gIHN0eWxlLnBhZGRpbmcgPSAnMCAycHgnO1xuICBzdHlsZS5jb2xvciA9ICcjNDQ0Jztcbn1cbi8qKlxuICogQ3JlYXRlIGEgY29sb3JlZCBwaWxsIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBrZXkgaW4gYSBxdWVyeSBkaWZmLlxuICogQ29sb3Igc2NoZW1lIGNvbW11bmljYXRlcyBzZW1hbnRpYyAoYWRkZWQgLyByZW1vdmVkIC8gY2hhbmdlZCAvIHVuY2hhbmdlZCkuXG4gKiBAcGFyYW0gbGFiZWwgRGlzcGxheSB0ZXh0IGZvciB0aGUgcGlsbC5cbiAqIEBwYXJhbSBraW5kIERpZmYgY2F0ZWdvcnkuXG4gKiBAcmV0dXJucyBTcGFuIGVsZW1lbnQgcmVhZHkgdG8gYXR0YWNoLlxuICovXG5mdW5jdGlvbiBjcmVhdGVRdWVyeURpZmZQaWxsKFxuICBsYWJlbDogc3RyaW5nLFxuICBraW5kOiAnYWRkZWQnIHwgJ3JlbW92ZWQnIHwgJ2NoYW5nZWQnIHwgJ3VuY2hhbmdlZCcsXG4pOiBIVE1MU3BhbkVsZW1lbnQge1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBzcGFuLnRleHRDb250ZW50ID0gbGFiZWw7XG4gIHNwYW4uc3R5bGUucGFkZGluZyA9ICcxcHggNHB4JztcbiAgc3Bhbi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMTBweCc7XG4gIHNwYW4uc3R5bGUuZm9udFNpemUgPSAnMTBweCc7XG4gIHNwYW4uc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCc7XG4gIGlmIChraW5kID09PSAnYWRkZWQnKSB7XG4gICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlNmZmZWQnO1xuICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnIzJjYmU0ZSc7XG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMjI4NjNhJztcbiAgfSBlbHNlIGlmIChraW5kID09PSAncmVtb3ZlZCcpIHtcbiAgICBzcGFuLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZWVmMCc7XG4gICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZDczYTQ5JztcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNjYjI0MzEnO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdjaGFuZ2VkJykge1xuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmNWIxJztcbiAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZmQzM2QnO1xuICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnIzczNWMwZic7XG4gIH0gZWxzZSB7XG4gICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmMWY4ZmYnO1xuICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnIzc5YjhmZic7XG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMDM2NmQ2JztcbiAgfVxuICByZXR1cm4gc3Bhbjtcbn1cbi8qKlxuICogTW91bnQgdGhlIGZsb2F0aW5nIGRldnRvb2xzIHBhbmVsIChTaGFkb3cgRE9NIGhvc3QgKyBpbnRlcm5hbCBzdHJ1Y3R1cmUpLlxuICogR3VhcmRlZCBmb3Igbm9uLURPTSBlbnZpcm9ubWVudHMgYW5kIGlkZW1wb3RlbnQgKHdvbid0IG1vdW50IHR3aWNlKS5cbiAqIEBwYXJhbSBwYXJhbXMuY29udGV4dCBSb3V0aW5nIGNvbnRleHQgKHByb3ZpZGVzIHN0YXRlICsgc3Vic2NyaWJlKS5cbiAqIEBwYXJhbSBwYXJhbXMuc2hvcnRjdXQgS2V5Ym9hcmQgc2hvcnRjdXQgKGUuZy4gXCJDdHJsK1NoaWZ0K1JcIikgdG8gdG9nZ2xlIHZpc2liaWxpdHkuXG4gKiBAcmV0dXJucyBSZWNvcmRlciBmdW5jdGlvbiB0byBjYXB0dXJlIG5hdmlnYXRpb24gZXZlbnRzIGZvciB0aW1lbGluZSBvcmlnaW4gbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIG1vdW50RGV2dG9vbHNQYW5lbChwYXJhbXM6IHtcbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG4gIHNob3J0Y3V0OiBzdHJpbmc7XG59KTogKG1ldGE6IE5hdkV2ZW50TWV0YVB1YmxpYykgPT4gdm9pZCB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBub29wUmVjb3JkZXIoKSB7XG4gICAgICAgIC8qIG5vb3AgKG5vbi1ET00gZW52KSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWxdJykgIT0gbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFscmVhZHlNb3VudGVkUmVjb3JkZXIoKSB7XG4gICAgICAgIC8qIG5vb3AgKGFscmVhZHkgbW91bnRlZCkgKi9cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29udGV4dCwgc2hvcnRjdXQgfSA9IHBhcmFtcztcblxuICAgIC8vIEhvc3RcbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWwnLCAnJyk7XG4gICAgY29uc3QgaG9zdFN0eWxlID0gaG9zdC5zdHlsZTtcbiAgICBob3N0U3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIGhvc3RTdHlsZS56SW5kZXggPSAnMjE0NzQ4MzY0Nic7XG4gICAgaG9zdFN0eWxlLmJvdHRvbSA9ICc4cHgnO1xuICAgIGhvc3RTdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgIGhvc3RTdHlsZS5mb250RmFtaWx5ID0gW1xuICAgICAgJ3VpLW1vbm9zcGFjZScsXG4gICAgICAnU0ZNb25vLVJlZ3VsYXInLFxuICAgICAgJ01lbmxvJyxcbiAgICAgICdNb25hY28nLFxuICAgICAgJ0NvbnNvbGFzJyxcbiAgICAgICdcIkxpYmVyYXRpb24gTW9ub1wiJyxcbiAgICAgICdtb25vc3BhY2UnLFxuICAgIF0uam9pbignLCAnKTtcbiAgICBob3N0U3R5bGUuZm9udFNpemUgPSAnMTJweCc7XG4gICAgaG9zdFN0eWxlLmxpbmVIZWlnaHQgPSAnMS4zJztcbiAgICBob3N0U3R5bGUuY29sb3IgPSAnIzExMSc7XG4gICAgaG9zdFN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgIGhvc3RTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIGNvbnN0IHNoYWRvdyA9IGhvc3QuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuXG4gICAgLy8gUGFuZWwgY29udGFpbmVyXG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBwYW5lbFN0eWxlID0gcGFuZWwuc3R5bGU7XG4gICAgcGFuZWxTdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgIHBhbmVsU3R5bGUubWluV2lkdGggPSAnMjYwcHgnO1xuICAgIHBhbmVsU3R5bGUubWF4V2lkdGggPSAnNDIwcHgnO1xuICAgIHBhbmVsU3R5bGUubWF4SGVpZ2h0ID0gJzUwdmgnO1xuICAgIHBhbmVsU3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG4gICAgcGFuZWxTdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC45NSknO1xuICAgIHBhbmVsU3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjY2NjJztcbiAgICBwYW5lbFN0eWxlLmJvcmRlclJhZGl1cyA9ICc2cHgnO1xuICAgIHBhbmVsU3R5bGUuYm94U2hhZG93ID0gJzAgMnB4IDhweCByZ2JhKDAsMCwwLDAuMTUpJztcbiAgICBwYW5lbFN0eWxlLnBhZGRpbmcgPSAnNnB4IDhweCA4cHgnO1xuICAgIHBhbmVsU3R5bGUuYmFja2Ryb3BGaWx0ZXIgPSAnYmx1cig0cHgpJztcbiAgICBwYW5lbFN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcGFuZWxTdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgcGFuZWxTdHlsZS5yb3dHYXAgPSAnNHB4JztcblxuICAgIC8vIEhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGhlYWRlclN0eWxlID0gaGVhZGVyLnN0eWxlO1xuICAgIGhlYWRlclN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgaGVhZGVyU3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInO1xuICAgIGhlYWRlclN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ3NwYWNlLWJldHdlZW4nO1xuICAgIGhlYWRlclN0eWxlLmdhcCA9ICc4cHgnO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRpdGxlLnRleHRDb250ZW50ID0gJ1BsdW1pbGUgUm91dGVyJztcbiAgICB0aXRsZS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgY29uc3QgaGVhZGVyQnRucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGhlYWRlckJ0bnNTdHlsZSA9IGhlYWRlckJ0bnMuc3R5bGU7XG4gICAgaGVhZGVyQnRuc1N0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgaGVhZGVyQnRuc1N0eWxlLmdhcCA9ICc0cHgnO1xuICAgIGhlYWRlckJ0bnNTdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7XG4gICAgY29uc3QgdGFic1dyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCB0YWJzV3JhcFN0eWxlID0gdGFic1dyYXAuc3R5bGU7XG4gICAgdGFic1dyYXBTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHRhYnNXcmFwU3R5bGUuZ2FwID0gJzRweCc7XG4gICAgdGFic1dyYXBTdHlsZS5tYXJnaW5SaWdodCA9ICc2cHgnO1xuICAgIGNvbnN0IHJvdXRlVGFiQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgcm91dGVUYWJCdXR0b24udGV4dENvbnRlbnQgPSAnUm91dGUnO1xuICAgIGNvbnN0IGZpbHRlcnNUYWJCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBmaWx0ZXJzVGFiQnV0dG9uLnRleHRDb250ZW50ID0gJ0ZpbHRlcnMnO1xuICAgIGNvbnN0IHRhYkJ1dHRvbnM6IEhUTUxCdXR0b25FbGVtZW50W10gPSBbcm91dGVUYWJCdXR0b24sIGZpbHRlcnNUYWJCdXR0b25dO1xuICAgIGZvciAoY29uc3QgdGIgb2YgdGFiQnV0dG9ucykge1xuICAgICAgY29uc3QgcyA9IHRiLnN0eWxlO1xuICAgICAgcy5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICBzLmJhY2tncm91bmQgPSAnI2YxZjFmMSc7XG4gICAgICBzLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgICBzLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgcy5mb250U2l6ZSA9ICcxMXB4JztcbiAgICAgIHMucGFkZGluZyA9ICcycHggNnB4JztcbiAgICB9XG4gICAgcm91dGVUYWJCdXR0b24uc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnO1xuICAgIHJvdXRlVGFiQnV0dG9uLmRhdGFzZXQuYWN0aXZlID0gJ3RydWUnO1xuICAgIHRhYnNXcmFwLmFwcGVuZENoaWxkKHJvdXRlVGFiQnV0dG9uKTtcbiAgICB0YWJzV3JhcC5hcHBlbmRDaGlsZChmaWx0ZXJzVGFiQnV0dG9uKTtcbiAgICBjb25zdCBjb2xsYXBzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNvbGxhcHNlQnRuLnRleHRDb250ZW50ID0gJ+KIkic7XG4gICAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBjbG9zZUJ0bi50ZXh0Q29udGVudCA9ICfDlyc7XG4gICAgY29uc3QgaGVhZGVyQWN0aW9uQnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IFtjb2xsYXBzZUJ0biwgY2xvc2VCdG5dO1xuICAgIGZvciAoY29uc3QgYiBvZiBoZWFkZXJBY3Rpb25CdXR0b25zKSB7XG4gICAgICBjb25zdCBzdCA9IGIuc3R5bGU7XG4gICAgICBzdC5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICBzdC5iYWNrZ3JvdW5kID0gJyNlZWUnO1xuICAgICAgc3QuYm9yZGVyID0gJzFweCBzb2xpZCAjY2NjJztcbiAgICAgIHN0LmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgc3QuZm9udFNpemUgPSAnMTFweCc7XG4gICAgICBzdC5saW5lSGVpZ2h0ID0gJzEnO1xuICAgICAgc3QucGFkZGluZyA9ICcycHggNXB4JztcbiAgICB9XG4gICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICBoZWFkZXJCdG5zLmFwcGVuZENoaWxkKHRhYnNXcmFwKTtcbiAgICBoZWFkZXJCdG5zLmFwcGVuZENoaWxkKGNvbGxhcHNlQnRuKTtcbiAgICBoZWFkZXJCdG5zLmFwcGVuZENoaWxkKGNsb3NlQnRuKTtcbiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoaGVhZGVyQnRucyk7XG5cbiAgICAvLyBSb3V0ZSB0YWIgZWxlbWVudHNcbiAgICBjb25zdCBwYXRoRGlzcGxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHBhdGhEaXNwbGF5LnN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJztcbiAgICBjb25zdCB2YXJzUHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgY29uc3QgcmF3UXVlcnlQcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICBjb25zdCB0eXBlZFF1ZXJ5UHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgY29uc3QgcHJlQmxvY2tzOiBIVE1MUHJlRWxlbWVudFtdID0gW3ZhcnNQcmUsIHJhd1F1ZXJ5UHJlLCB0eXBlZFF1ZXJ5UHJlXTtcbiAgICBmb3IgKGNvbnN0IHBiIG9mIHByZUJsb2Nrcykge1xuICAgICAgY29uc3Qgc3RwID0gcGIuc3R5bGU7XG4gICAgICBzdHAubWFyZ2luID0gJzAnO1xuICAgICAgc3RwLnBhZGRpbmcgPSAnNHB4JztcbiAgICAgIHN0cC5iYWNrZ3JvdW5kID0gJyNmNmY4ZmEnO1xuICAgICAgc3RwLmJvcmRlciA9ICcxcHggc29saWQgI2UyZTJlMic7XG4gICAgICBzdHAuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gICAgICBzdHAub3ZlcmZsb3dYID0gJ2F1dG8nO1xuICAgICAgc3RwLm1heEhlaWdodCA9ICcxNjBweCc7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVsaW5lV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IHRpbWVsaW5lV3JhcFN0eWxlID0gdGltZWxpbmVXcmFwLnN0eWxlO1xuICAgIHRpbWVsaW5lV3JhcFN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgdGltZWxpbmVXcmFwU3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nO1xuICAgIHRpbWVsaW5lV3JhcFN0eWxlLmdhcCA9ICcycHgnO1xuICAgIHRpbWVsaW5lV3JhcFN0eWxlLm1hcmdpblRvcCA9ICc0cHgnO1xuICAgIGNvbnN0IHRpbWVsaW5lSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGltZWxpbmVIZWFkZXIudGV4dENvbnRlbnQgPSAnVGltZWxpbmUgKHF1ZXJ5IGNoYW5nZXMpJztcbiAgICB0aW1lbGluZUhlYWRlci5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgdGltZWxpbmVIZWFkZXIuc3R5bGUuZm9udFNpemUgPSAnMTFweCc7XG4gICAgY29uc3QgdGltZWxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCB0aW1lbGluZVN0eWxlID0gdGltZWxpbmUuc3R5bGU7XG4gICAgdGltZWxpbmVTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHRpbWVsaW5lU3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4tcmV2ZXJzZSc7XG4gICAgdGltZWxpbmVTdHlsZS5tYXhIZWlnaHQgPSAnMTQwcHgnO1xuICAgIHRpbWVsaW5lU3R5bGUub3ZlcmZsb3dZID0gJ2F1dG8nO1xuICAgIHRpbWVsaW5lU3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZTJlMmUyJztcbiAgICB0aW1lbGluZVN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgIHRpbWVsaW5lU3R5bGUuYmFja2dyb3VuZCA9ICcjZmFmYmZjJztcbiAgICB0aW1lbGluZVN0eWxlLmZvbnRGYW1pbHkgPSAnaW5oZXJpdCc7XG4gICAgdGltZWxpbmVTdHlsZS5mb250U2l6ZSA9ICcxMXB4JztcbiAgICB0aW1lbGluZVdyYXAuYXBwZW5kQ2hpbGQodGltZWxpbmVIZWFkZXIpO1xuICAgIHRpbWVsaW5lV3JhcC5hcHBlbmRDaGlsZCh0aW1lbGluZSk7XG4gICAgY29uc3Qgcm91dGVUYWJDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3Qgcm91dGVUYWJDb250ZW50U3R5bGUgPSByb3V0ZVRhYkNvbnRlbnQuc3R5bGU7XG4gICAgcm91dGVUYWJDb250ZW50U3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICByb3V0ZVRhYkNvbnRlbnRTdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgcm91dGVUYWJDb250ZW50U3R5bGUuZ2FwID0gJzRweCc7XG4gICAgcm91dGVUYWJDb250ZW50LmFwcGVuZENoaWxkKHBhdGhEaXNwbGF5KTtcbiAgICByb3V0ZVRhYkNvbnRlbnQuYXBwZW5kQ2hpbGQodmFyc1ByZSk7XG4gICAgcm91dGVUYWJDb250ZW50LmFwcGVuZENoaWxkKHJhd1F1ZXJ5UHJlKTtcbiAgICByb3V0ZVRhYkNvbnRlbnQuYXBwZW5kQ2hpbGQodHlwZWRRdWVyeVByZSk7XG4gICAgcm91dGVUYWJDb250ZW50LmFwcGVuZENoaWxkKHRpbWVsaW5lV3JhcCk7XG5cbiAgICAvLyBGaWx0ZXJzIHRhYiBza2VsZXRvblxuICAgIGNvbnN0IGZpbHRlcnNUYWJDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgZmlsdGVyc1RhYkNvbnRlbnRTdHlsZSA9IGZpbHRlcnNUYWJDb250ZW50LnN0eWxlO1xuICAgIGZpbHRlcnNUYWJDb250ZW50U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBmaWx0ZXJzVGFiQ29udGVudFN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICBmaWx0ZXJzVGFiQ29udGVudFN0eWxlLmdhcCA9ICc0cHgnO1xuICAgIGNvbnN0IGZpbHRlckFjdGlvbnNXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgZmlsdGVyQWN0aW9uc1dyYXBTdHlsZSA9IGZpbHRlckFjdGlvbnNXcmFwLnN0eWxlO1xuICAgIGZpbHRlckFjdGlvbnNXcmFwU3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBmaWx0ZXJBY3Rpb25zV3JhcFN0eWxlLmZsZXhXcmFwID0gJ3dyYXAnO1xuICAgIGZpbHRlckFjdGlvbnNXcmFwU3R5bGUuZ2FwID0gJzRweCc7XG4gICAgY29uc3QgZmlsdGVyc0JvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBmaWx0ZXJzQm9keVN0eWxlID0gZmlsdGVyc0JvZHkuc3R5bGU7XG4gICAgZmlsdGVyc0JvZHlTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGZpbHRlcnNCb2R5U3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nO1xuICAgIGZpbHRlcnNCb2R5U3R5bGUuZ2FwID0gJzRweCc7XG4gICAgZmlsdGVyc1RhYkNvbnRlbnQuYXBwZW5kQ2hpbGQoZmlsdGVyQWN0aW9uc1dyYXApO1xuICAgIGZpbHRlcnNUYWJDb250ZW50LmFwcGVuZENoaWxkKGZpbHRlcnNCb2R5KTtcblxuICAgIGNvbnN0IHNob3J0Y3V0SGludCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNob3J0Y3V0SGludC50ZXh0Q29udGVudCA9IGBTaG9ydGN1dDogJHtzaG9ydGN1dH1gO1xuICAgIHNob3J0Y3V0SGludC5zdHlsZS5mb250U2l6ZSA9ICcxMHB4JztcbiAgICBzaG9ydGN1dEhpbnQuc3R5bGUub3BhY2l0eSA9ICcwLjcnO1xuXG4gICAgcGFuZWwuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcbiAgICBwYW5lbC5hcHBlbmRDaGlsZChyb3V0ZVRhYkNvbnRlbnQpO1xuICAgIHBhbmVsLmFwcGVuZENoaWxkKGZpbHRlcnNUYWJDb250ZW50KTtcbiAgICBwYW5lbC5hcHBlbmRDaGlsZChzaG9ydGN1dEhpbnQpO1xuICAgIHNoYWRvdy5hcHBlbmRDaGlsZChwYW5lbCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcblxuICAgIC8vIENvbGxhcHNlIC8gY2xvc2UgbG9naWNcbiAgICBsZXQgY29sbGFwc2VkID0gZmFsc2U7XG4gICAgLyoqIFRvZ2dsZSBjb2xsYXBzZWQvZXhwYW5kZWQgcGFuZWwgc3RhdGUuICovXG4gICAgZnVuY3Rpb24gb25Db2xsYXBzZVRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgIGNvbGxhcHNlZCA9ICFjb2xsYXBzZWQ7XG4gICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICcyNHB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAnKyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnNTB2aCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICBjb2xsYXBzZUJ0bi50ZXh0Q29udGVudCA9ICfiiJInO1xuICAgICAgfVxuICAgIH1cbiAgICBjb2xsYXBzZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ29sbGFwc2VUb2dnbGUpO1xuICAgIGxldCB1bnN1YnNjcmliZTogdW5kZWZpbmVkIHwgKCgpID0+IHZvaWQpO1xuICAgIC8qKiBDbG9zZSBhbmQgdW5tb3VudCB0aGUgcGFuZWwsIHVuc3Vic2NyaWJpbmcgbGlzdGVuZXIuICovXG4gICAgZnVuY3Rpb24gb25DbG9zZSgpOiB2b2lkIHtcbiAgICAgIGhvc3QucmVtb3ZlKCk7XG4gICAgICBpZiAodHlwZW9mIHVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbG9zZSk7XG5cbiAgICAvLyBOYXYgZXZlbnQgc3RvcmVcbiAgICBjb25zdCBuYXZFdmVudHM6IE5hdkV2ZW50TWV0YVB1YmxpY1tdID0gW107XG4gICAgLyoqXG4gICAgICogUmVjb3JkIGEgbmF2aWdhdGlvbiBldmVudCBmb3IgbGF0ZXIgYXR0cmlidXRpb24gd2hlbiByZW5kZXJpbmcgdGltZWxpbmUgcm93cy5cbiAgICAgKiBTdG9yZXMgb25seSBhIGJvdW5kZWQgcmluZyAoRklGTyB0cmltbWluZyBiZXlvbmQgNjAgZW50cmllcykuXG4gICAgICogQHBhcmFtIG1ldGEgTmF2aWdhdGlvbiBtZXRhIGV2ZW50IG9iamVjdC5cbiAgICAgKi9cbiAgICAvKiogUmVjb3JkIGEgbmF2IGV2ZW50IChib3VuZGVkIGhpc3RvcnkgbGVuZ3RoKS4gKi9cbiAgICBmdW5jdGlvbiByZWNvcmROYXZFdmVudChtZXRhOiBOYXZFdmVudE1ldGFQdWJsaWMpOiB2b2lkIHtcbiAgICAgIG5hdkV2ZW50cy5wdXNoKG1ldGEpO1xuICAgICAgaWYgKG5hdkV2ZW50cy5sZW5ndGggPiA2MCkgbmF2RXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIGNhY2hlXG4gICAgbGV0IGxhc3RRdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxhc3RTZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFJlLXJlbmRlciB0aGUgcGFuZWwgVUkgZnJvbSBjdXJyZW50IHJvdXRpbmcgY29udGV4dCAmIGNhY2hlZCBuYXZpZ2F0aW9uIGV2ZW50cy5cbiAgICAgKiBDb250YWlucyBkZWZlbnNpdmUgdHJ5L2NhdGNoIGJsb2NrcyB0byBhdm9pZCBicmVha2luZyB0aGUgYXBwIGlmIGRldnRvb2xzIGZhaWxzLlxuICAgICAqL1xuICAgIC8qKiBSZW5kZXIgcGFuZWwgY29udGVudHMgZnJvbSBjb250ZXh0IHN0YXRlLiAqL1xuICAgIGZ1bmN0aW9uIHJlbmRlcigpOiB2b2lkIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gY29udGV4dC5nZXQoKTtcbiAgICAgICAgcGF0aERpc3BsYXkudGV4dENvbnRlbnQgPSBgJHtlbnRyeS5sb2NhdGlvbi5wYXRobmFtZX0ke2VudHJ5LmxvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICB2YXJzUHJlLnRleHRDb250ZW50ID0gYHZhcnM6ICR7SlNPTi5zdHJpbmdpZnkoZW50cnkucm91dGU/LnBhcmFtcyA/PyB7fSwgbnVsbCwgMil9YDtcbiAgICAgICAgcmF3UXVlcnlQcmUudGV4dENvbnRlbnQgPSBgcmF3OiAgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5xdWVyeSwgbnVsbCwgMil9YDtcbiAgICAgICAgdHlwZWRRdWVyeVByZS50ZXh0Q29udGVudCA9IGB0eXBlZDogJHtKU09OLnN0cmluZ2lmeShlbnRyeS50eXBlZFF1ZXJ5LCBudWxsLCAyKX1gO1xuICAgICAgICBpZiAoZW50cnkucmF3U2VhcmNoICE9PSBsYXN0U2VhcmNoKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFF1ZXJ5ID0gZW50cnkucXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZRdWVyaWVzKGxhc3RRdWVyeSwgY3VycmVudFF1ZXJ5KTtcbiAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCByb3dTdHlsZSA9IHJvdy5zdHlsZTtcbiAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgIHJvd1N0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgICByb3dTdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkICNlOWU5ZTknO1xuICAgICAgICAgIHJvd1N0eWxlLnBhZGRpbmcgPSAnM3B4IDRweCc7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGNvbnN0IGhlYWRTdHlsZSA9IGhlYWQuc3R5bGU7XG4gICAgICAgICAgaGVhZFN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgaGVhZFN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ3NwYWNlLWJldHdlZW4nO1xuICAgICAgICAgIGNvbnN0IHRpbWVTdHIgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgICAgICAgIGxldCBzZWFyY2hEaXNwbGF5ID0gJyhlbXB0eSknO1xuICAgICAgICAgIGlmIChlbnRyeS5sb2NhdGlvbi5zZWFyY2ggIT09ICcnKSB7XG4gICAgICAgICAgICBzZWFyY2hEaXNwbGF5ID0gZW50cnkubG9jYXRpb24uc2VhcmNoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgb3JpZ2luID0gJ3N5c3RlbSc7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IG5hdkV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgY29uc3QgZXYgPSBuYXZFdmVudHNbaV07XG4gICAgICAgICAgICBpZiAoZXYgIT0gbnVsbCAmJiBldi5zZWFyY2ggPT09IGVudHJ5LnJhd1NlYXJjaCkge1xuICAgICAgICAgICAgICBvcmlnaW4gPSBgJHtldi5raW5kfToke2V2Lm1vZGV9YDtcbiAgICAgICAgICAgICAgaWYgKGV2LmtpbmQgPT09ICdiYXRjaC1mbHVzaCcpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW4gPSBgJHtvcmlnaW59KCR7ZXYuY291bnR9KWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGhlYWQuaW5uZXJIVE1MID0gW1xuICAgICAgICAgICAgYDxzdHJvbmc+JHt0aW1lU3RyfTwvc3Ryb25nPmAsXG4gICAgICAgICAgICBgPGNvZGUgc3R5bGU9XCJiYWNrZ3JvdW5kOiNlZWU7cGFkZGluZzoxcHggM3B4O2JvcmRlci1yYWRpdXM6M3B4O1wiPiR7c2VhcmNoRGlzcGxheX08L2NvZGU+YCxcbiAgICAgICAgICAgIGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMHB4O29wYWNpdHk6MC43O1wiPiR7b3JpZ2lufTwvc3Bhbj5gLFxuICAgICAgICAgIF0uam9pbignICcpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBib2R5U3R5bGUgPSBib2R5LnN0eWxlO1xuICAgICAgICAgIGJvZHlTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgIGJvZHlTdHlsZS5mbGV4V3JhcCA9ICd3cmFwJztcbiAgICAgICAgICBib2R5U3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgICAgaWYgKGRpZmYuYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGRpZmYuYWRkZWQpIHtcbiAgICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChjcmVhdGVRdWVyeURpZmZQaWxsKGArJHtrfWAsICdhZGRlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRpZmYuY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGlmZi5jaGFuZ2VkKSB7XG4gICAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlUXVlcnlEaWZmUGlsbChgfiR7a31gLCAnY2hhbmdlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRpZmYucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGlmZi5yZW1vdmVkKSB7XG4gICAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlUXVlcnlEaWZmUGlsbChgLSR7a31gLCAncmVtb3ZlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGlmZi5hZGRlZC5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIGRpZmYuY2hhbmdlZC5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIGRpZmYucmVtb3ZlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlUXVlcnlEaWZmUGlsbCgnbm8tY2hhbmdlJywgJ3VuY2hhbmdlZCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93LmFwcGVuZENoaWxkKGhlYWQpO1xuICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChib2R5KTtcbiAgICAgICAgICB0aW1lbGluZS5hcHBlbmRDaGlsZChyb3cpO1xuICAgICAgICAgIGlmICh0aW1lbGluZS5jaGlsZEVsZW1lbnRDb3VudCA+IDUwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IHRpbWVsaW5lLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGltZWxpbmUucmVtb3ZlQ2hpbGQoZmlyc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0UXVlcnkgPSBjdXJyZW50UXVlcnk7XG4gICAgICAgICAgbGFzdFNlYXJjaCA9IGVudHJ5LnJhd1NlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXJzIHRhYlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IGNvbnRleHQuY3VycmVudE1lcmdlZEZpbHRlclNjaGVtYSgpO1xuICAgICAgICAgIHdoaWxlIChmaWx0ZXJBY3Rpb25zV3JhcC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFjdGlvbnNXcmFwLnJlbW92ZUNoaWxkKGZpbHRlckFjdGlvbnNXcmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoZmlsdGVyc0JvZHkuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJzQm9keS5yZW1vdmVDaGlsZChmaWx0ZXJzQm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1lcmdlZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eU1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZW1wdHlNc2cudGV4dENvbnRlbnQgPSAnTm8gZmlsdGVyIHNjaGVtYSBmb3IgY3VycmVudCByb3V0ZSc7XG4gICAgICAgICAgICBlbXB0eU1zZy5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJztcbiAgICAgICAgICAgIGZpbHRlcnNCb2R5LmFwcGVuZENoaWxkKGVtcHR5TXNnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hT2JqID0gbWVyZ2VkLnNjaGVtYSBhcyBSZWNvcmQ8XG4gICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIG9wZXJhdG9ycz86IHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgIGtpbmQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPjtcbiAgICAgICAgICAgIGxldCBwYXJzZWRGaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBhcnNlZEZpbHRlcnMgPSBwYXJzZUZpbHRlcnMoXG4gICAgICAgICAgICAgICAgbWVyZ2VkIGFzIGFueSxcbiAgICAgICAgICAgICAgICBlbnRyeS5xdWVyeSBhcyBhbnksXG4gICAgICAgICAgICAgICkgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8qIGlnbm9yZSBwYXJzZSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lcyA9IE9iamVjdC5rZXlzKHNjaGVtYU9iaikuc29ydCgpO1xuICAgICAgICAgICAgbGV0IGFueUFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkTmFtZXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwYXJzZWRGaWx0ZXJzW2ZdO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCAmJiBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFueUFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbnlBY3RpdmUpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2xlYXJBbGxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgICAgY2xlYXJBbGxCdG4udGV4dENvbnRlbnQgPSAnQ2xlYXIgQWxsIEZpbHRlcnMnO1xuICAgICAgICAgICAgICBzdHlsZU1pbmlCdXR0b24oY2xlYXJBbGxCdG4sICcjZDczYTQ5Jyk7XG4gICAgICAgICAgICAgIC8qKiBDbGVhciBhbGwgZmlsdGVycyBhY3Jvc3MgZXZlcnkgZmllbGQuICovXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIG9uQ2xlYXJBbGxGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBibGFuazogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge307XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZuYW1lIG9mIGZpZWxkTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxhbmtbZm5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250ZXh0Lm5hdmlnYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogYmxhbmssXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclNjaGVtYTogbWVyZ2VkLFxuICAgICAgICAgICAgICAgICAgICBiYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNsZWFyQWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGVhckFsbEZpbHRlcnMpO1xuICAgICAgICAgICAgICBmaWx0ZXJBY3Rpb25zV3JhcC5hcHBlbmRDaGlsZChjbGVhckFsbEJ0bik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkTmFtZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGVmTGlrZSA9IHNjaGVtYU9ialtmaWVsZF07XG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgIGNvbnN0IGZiU3R5bGUgPSBmaWVsZEJveC5zdHlsZTtcbiAgICAgICAgICAgICAgZmJTdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNlMmUyZTInO1xuICAgICAgICAgICAgICBmYlN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgICAgICAgICBmYlN0eWxlLnBhZGRpbmcgPSAnNHB4IDZweCc7XG4gICAgICAgICAgICAgIGZiU3R5bGUuYmFja2dyb3VuZCA9ICcjZjlmYWZiJztcbiAgICAgICAgICAgICAgZmJTdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICBmYlN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgICAgICAgZmJTdHlsZS5nYXAgPSAnM3B4JztcbiAgICAgICAgICAgICAgY29uc3QgZmllbGRIZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRTdHlsZTIgPSBmaWVsZEhlYWQuc3R5bGU7XG4gICAgICAgICAgICAgIGhlYWRTdHlsZTIuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgICAgICAgaGVhZFN0eWxlMi5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJztcbiAgICAgICAgICAgICAgaGVhZFN0eWxlMi5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgIGNvbnN0IGxhYmVsRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcbiAgICAgICAgICAgICAgbGV0IGxhYmVsVGV4dCA9IGZpZWxkO1xuICAgICAgICAgICAgICBpZiAoZGVmTGlrZT8ubGFiZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxhYmVsVGV4dCA9IFN0cmluZyhkZWZMaWtlLmxhYmVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYWJlbEVsLnRleHRDb250ZW50ID0gbGFiZWxUZXh0O1xuICAgICAgICAgICAgICBsYWJlbEVsLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICAgICAgICBjb25zdCBoZWFkQWN0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBoZWFkQWN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICBoZWFkQWN0aW9ucy5zdHlsZS5nYXAgPSAnNHB4JztcbiAgICAgICAgICAgICAgY29uc3QgY2xlYXJGaWVsZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgICBjbGVhckZpZWxkQnRuLnRleHRDb250ZW50ID0gJ2NsZWFyJztcbiAgICAgICAgICAgICAgc3R5bGVNaW5pQnV0dG9uKGNsZWFyRmllbGRCdG4sICcjNmE3MzdkJyk7XG4gICAgICAgICAgICAgIC8qKiBDbGVhciBvbmx5IHRoaXMgZmllbGQncyBmaWx0ZXJzLiAqL1xuICAgICAgICAgICAgICBmdW5jdGlvbiBvbkNsZWFyRmllbGQoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB7IC4uLnBhcnNlZEZpbHRlcnMgfTtcbiAgICAgICAgICAgICAgICAgIG5leHRbZmllbGRdID0ge307XG4gICAgICAgICAgICAgICAgICBjb250ZXh0Lm5hdmlnYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogbmV4dCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiBtZXJnZWQsXG4gICAgICAgICAgICAgICAgICAgIGJhdGNoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2xlYXJGaWVsZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xlYXJGaWVsZCk7XG4gICAgICAgICAgICAgIGhlYWRBY3Rpb25zLmFwcGVuZENoaWxkKGNsZWFyRmllbGRCdG4pO1xuICAgICAgICAgICAgICBmaWVsZEhlYWQuYXBwZW5kQ2hpbGQobGFiZWxFbCk7XG4gICAgICAgICAgICAgIGZpZWxkSGVhZC5hcHBlbmRDaGlsZChoZWFkQWN0aW9ucyk7XG4gICAgICAgICAgICAgIGZpZWxkQm94LmFwcGVuZENoaWxkKGZpZWxkSGVhZCk7XG4gICAgICAgICAgICAgIGNvbnN0IG9wc1dyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgY29uc3Qgb3BzV3JhcFN0eWxlID0gb3BzV3JhcC5zdHlsZTtcbiAgICAgICAgICAgICAgb3BzV3JhcFN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIG9wc1dyYXBTdHlsZS5mbGV4V3JhcCA9ICd3cmFwJztcbiAgICAgICAgICAgICAgb3BzV3JhcFN0eWxlLmdhcCA9ICc0cHgnO1xuICAgICAgICAgICAgICBjb25zdCBwcmVzZW50ID0gcGFyc2VkRmlsdGVyc1tmaWVsZF0gPz8ge307XG4gICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gZGVmTGlrZT8uZGVmYXVsdHMgPz8ge307XG4gICAgICAgICAgICAgIGxldCBhbGxvd2VkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZMaWtlPy5vcGVyYXRvcnMpKSB7XG4gICAgICAgICAgICAgICAgYWxsb3dlZCA9IGRlZkxpa2Uub3BlcmF0b3JzLnNsaWNlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmTGlrZT8ua2luZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBhbGxvd2VkID0gW1xuICAgICAgICAgICAgICAgICAgJ2VxJyxcbiAgICAgICAgICAgICAgICAgICduZXEnLFxuICAgICAgICAgICAgICAgICAgJ2d0JyxcbiAgICAgICAgICAgICAgICAgICdndGUnLFxuICAgICAgICAgICAgICAgICAgJ2x0JyxcbiAgICAgICAgICAgICAgICAgICdsdGUnLFxuICAgICAgICAgICAgICAgICAgJ2luJyxcbiAgICAgICAgICAgICAgICAgICduaW4nLFxuICAgICAgICAgICAgICAgICAgJ2JldHdlZW4nLFxuICAgICAgICAgICAgICAgICAgJ2V4aXN0cycsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGxvd2VkID0gW1xuICAgICAgICAgICAgICAgICAgJ2VxJyxcbiAgICAgICAgICAgICAgICAgICduZXEnLFxuICAgICAgICAgICAgICAgICAgJ2luJyxcbiAgICAgICAgICAgICAgICAgICduaW4nLFxuICAgICAgICAgICAgICAgICAgJ2JldHdlZW4nLFxuICAgICAgICAgICAgICAgICAgJ2V4aXN0cycsXG4gICAgICAgICAgICAgICAgICAnY29udGFpbnMnLFxuICAgICAgICAgICAgICAgICAgJ3N0YXJ0cycsXG4gICAgICAgICAgICAgICAgICAnZW5kcycsXG4gICAgICAgICAgICAgICAgICAncmVnZXgnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBvcCBvZiBhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFuU3R5bGUgPSBzcGFuLnN0eWxlO1xuICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1mbGV4JztcbiAgICAgICAgICAgICAgICBzcGFuU3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5nYXAgPSAnMnB4JztcbiAgICAgICAgICAgICAgICBzcGFuU3R5bGUucGFkZGluZyA9ICcxcHggNXB4JztcbiAgICAgICAgICAgICAgICBzcGFuU3R5bGUuYm9yZGVyUmFkaXVzID0gJzEycHgnO1xuICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNkMGQ3ZGUnO1xuICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5mb250U2l6ZSA9ICcxMHB4JztcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVWYWwgPSBwcmVzZW50W29wXTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHNwYW5TdHlsZS5iYWNrZ3JvdW5kID0gJyNlNmZmZWQnO1xuICAgICAgICAgICAgICAgICAgc3BhblN0eWxlLmJvcmRlckNvbG9yID0gJyMzNGQwNTgnO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3BUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgICAgb3BUZXh0LnRleHRDb250ZW50ID0gb3A7XG4gICAgICAgICAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKG9wVGV4dCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjbG9zZUJ0bk9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgICBjbG9zZUJ0bk9wLnRleHRDb250ZW50ID0gJ8OXJztcbiAgICAgICAgICAgICAgICAgIHN0eWxlUGlsbENsb3NlKGNsb3NlQnRuT3ApO1xuICAgICAgICAgICAgICAgICAgLyoqIFJlbW92ZSB0aGlzIG9wZXJhdG9yIGZyb20gdGhlIGZpZWxkIGZpbHRlci4gKi9cbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVtb3ZlT3BlcmF0b3IoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHsgLi4ucGFyc2VkRmlsdGVycyB9IGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFtmaWVsZF0gPz8ge307XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29weUZpZWxkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrICE9PSBvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5RmllbGRba10gPSBleGlzdGluZ1trXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFtmaWVsZF0gPSBjb3B5RmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uYXZpZ2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBuZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiBtZXJnZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNsb3NlQnRuT3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvblJlbW92ZU9wZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoY2xvc2VCdG5PcCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRGVmYXVsdCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMsXG4gICAgICAgICAgICAgICAgICAgIG9wLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGAke29wfSAoZGVmYXVsdClgO1xuICAgICAgICAgICAgICAgICAgICBzcGFuU3R5bGUuZm9udFN0eWxlID0gJ2l0YWxpYyc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4udGl0bGUgPSAnRGVmYXVsdCB2YWx1ZSBvbWl0dGVkIGluIFVSTCc7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gb3A7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzcGFuU3R5bGUub3BhY2l0eSA9ICcwLjU1JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3BzV3JhcC5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmaWVsZEJveC5hcHBlbmRDaGlsZChvcHNXcmFwKTtcbiAgICAgICAgICAgICAgZmlsdGVyc0JvZHkuYXBwZW5kQ2hpbGQoZmllbGRCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogaWdub3JlIGZpbHRlcnMgdGFiICovXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgcmVuZGVyICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCk7XG4gICAgdW5zdWJzY3JpYmUgPSBjb250ZXh0LnN1YnNjcmliZShyZW5kZXIpO1xuICAgIC8qKlxuICAgICAqIFN3aXRjaCB2aXNpYmxlIHRhYiBiZXR3ZWVuIFJvdXRlIGFuZCBGaWx0ZXJzIHZpZXdzLlxuICAgICAqIEBwYXJhbSBuYW1lIFRhcmdldCB0YWIgaWRlbnRpZmllci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZVRhYihuYW1lOiAncm91dGUnIHwgJ2ZpbHRlcnMnKTogdm9pZCB7XG4gICAgICBpZiAobmFtZSA9PT0gJ3JvdXRlJykge1xuICAgICAgICByb3V0ZVRhYkNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgZmlsdGVyc1RhYkNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcm91dGVUYWJCdXR0b24uZGF0YXNldC5hY3RpdmUgPSAndHJ1ZSc7XG4gICAgICAgIGZpbHRlcnNUYWJCdXR0b24uZGF0YXNldC5hY3RpdmUgPSAnZmFsc2UnO1xuICAgICAgICByb3V0ZVRhYkJ1dHRvbi5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgICAgIGZpbHRlcnNUYWJCdXR0b24uc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm91dGVUYWJDb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGZpbHRlcnNUYWJDb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIGZpbHRlcnNUYWJCdXR0b24uZGF0YXNldC5hY3RpdmUgPSAndHJ1ZSc7XG4gICAgICAgIHJvdXRlVGFiQnV0dG9uLmRhdGFzZXQuYWN0aXZlID0gJ2ZhbHNlJztcbiAgICAgICAgZmlsdGVyc1RhYkJ1dHRvbi5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgICAgIHJvdXRlVGFiQnV0dG9uLnN0eWxlLmZvbnRXZWlnaHQgPSAnbm9ybWFsJztcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIEFjdGl2YXRlIHJvdXRlIHRhYi4gKi9cbiAgICBmdW5jdGlvbiBvblJvdXRlVGFiQ2xpY2soKTogdm9pZCB7XG4gICAgICBhY3RpdmF0ZVRhYigncm91dGUnKTtcbiAgICB9XG4gICAgLyoqIEFjdGl2YXRlIGZpbHRlcnMgdGFiLiAqL1xuICAgIGZ1bmN0aW9uIG9uRmlsdGVyc1RhYkNsaWNrKCk6IHZvaWQge1xuICAgICAgYWN0aXZhdGVUYWIoJ2ZpbHRlcnMnKTtcbiAgICB9XG4gICAgcm91dGVUYWJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvblJvdXRlVGFiQ2xpY2spO1xuICAgIGZpbHRlcnNUYWJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkZpbHRlcnNUYWJDbGljayk7XG4gICAgLyoqIEtleWRvd24gaGFuZGxlciBmb3Igc2hvcnRjdXQgdG9nZ2xlLiAqL1xuICAgIGZ1bmN0aW9uIG9uS2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChldi5hbHRLZXkpIHBhcnRzLnB1c2goJ0FsdCcpO1xuICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHBhcnRzLnB1c2goJ1NoaWZ0Jyk7XG4gICAgICAgIGlmIChldi5jdHJsS2V5KSBwYXJ0cy5wdXNoKCdDdHJsJyk7XG4gICAgICAgIGxldCBrZXlQYXJ0ID0gZXYua2V5O1xuICAgICAgICBpZiAoZXYua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGtleVBhcnQgPSBldi5rZXkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGtleVBhcnQpO1xuICAgICAgICBjb25zdCBjb21ibyA9IHBhcnRzLmpvaW4oJysnKTtcbiAgICAgICAgY29uc3Qgbm9ybVNob3J0Y3V0ID0gc2hvcnRjdXQucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgICAgIGlmIChjb21ibyA9PT0gbm9ybVNob3J0Y3V0KSB7XG4gICAgICAgICAgaWYgKGhvc3Quc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBob3N0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3N0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlIHNob3J0Y3V0ICovXG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duKTtcbiAgICByZXR1cm4gcmVjb3JkTmF2RXZlbnQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmdW5jdGlvbiBzaWxlbnRSZWNvcmRlcigpIHtcbiAgICAgIC8qIGlnbm9yZSBlcnJvcnMgbW91bnRpbmcgKi9cbiAgICB9O1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIEFQSVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSW5pdGlhbGl6ZSByb3V0ZXIgZGV2dG9vbHMgYmFzZWQgb24gcHJvdmlkZWQgb3B0aW9ucy5cbiAqIE9wdGlvbmFsbHkgZXhwb3NlcyBjb250ZXh0IGdsb2JhbGx5LCBtb3VudHMgVUkgcGFuZWwsIGFuZCByZXR1cm5zIGEgbmF2IGV2ZW50IGhhbmRsZXIuXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgcm91dGVyIGNvZGUgd2hlbmV2ZXIgYSBuYXZpZ2F0aW9uIG1ldGEgZXZlbnQgb2NjdXJzLlxuICogQHBhcmFtIHBhcmFtcy5jb250ZXh0IFRoZSByb3V0aW5nIGNvbnRleHQgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGFyYW1zLm9wdGlvbnMgRGV2dG9vbHMgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgRnVuY3Rpb24gcmVjZWl2aW5nIGEgTmF2RXZlbnRNZXRhUHVibGljIHRvIGZlZWQgdGhlIHRpbWVsaW5lIChub29wIGlmIHBhbmVsIGRpc2FibGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRSb3V0ZXJEZXZ0b29scyhwYXJhbXM6IHtcbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG4gIG9wdGlvbnM6IEluaXRSb3V0ZXJEZXZ0b29sc09wdGlvbnM7XG59KTogKG1ldGE6IE5hdkV2ZW50TWV0YVB1YmxpYykgPT4gdm9pZCB7XG4gIGNvbnN0IHsgY29udGV4dCwgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGdsb2JhbCwgcGFuZWwsIHNob3J0Y3V0IH0gPSBvcHRpb25zO1xuXG4gIC8vIEdsb2JhbCB3aW5kb3cgZXhwb3N1cmVcbiAgaWYgKGdsb2JhbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAod2luZG93IGFzIGFueSkuX19QTFVNSUxFX1JPVVRFUl9fID0ge1xuICAgICAgICAgIGdldDogY29udGV4dC5nZXQsXG4gICAgICAgICAgc3Vic2NyaWJlOiBjb250ZXh0LnN1YnNjcmliZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBOby1vcCByZWNvcmRlciB1c2VkIHdoZW4gcGFuZWwgZGlzYWJsZWQuICovXG4gIGZ1bmN0aW9uIG5vb3BOYXZSZWNvcmRlcigpOiB2b2lkIHtcbiAgICAvKiBub29wICovXG4gIH1cbiAgbGV0IG5hdlJlY29yZGVyOiAobTogTmF2RXZlbnRNZXRhUHVibGljKSA9PiB2b2lkID0gbm9vcE5hdlJlY29yZGVyO1xuICBpZiAocGFuZWwpIHtcbiAgICBuYXZSZWNvcmRlciA9IG1vdW50RGV2dG9vbHNQYW5lbCh7IGNvbnRleHQsIHNob3J0Y3V0IH0pO1xuICB9XG4gIC8qKiBGb3J3YXJkIG5hdmlnYXRpb24gbWV0YSBldmVudCB0byBhY3RpdmUgcmVjb3JkZXIuICovXG4gIGZ1bmN0aW9uIGhhbmRsZU5hdkV2ZW50KG1ldGE6IE5hdkV2ZW50TWV0YVB1YmxpYyk6IHZvaWQge1xuICAgIG5hdlJlY29yZGVyKG1ldGEpO1xuICB9XG4gIHJldHVybiBoYW5kbGVOYXZFdmVudDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdFJvdXRlckRldnRvb2xzO1xuIl19