@firestitch/report 18.8.0 → 18.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +47 -2
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +34 -9
  4. package/app/reports/components/report-component/report-component.component.d.ts +10 -1
  5. package/app/reports/data/report.data.d.ts +2 -1
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +8 -0
  7. package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
  8. package/app/reports/export/report-export-collector.service.d.ts +24 -0
  9. package/app/reports/export/report-export.service.d.ts +3 -1
  10. package/app/reports/export/report-pdf.service.d.ts +18 -2
  11. package/app/reports/export/report-pptx.service.d.ts +15 -2
  12. package/app/reports/export/report-text-layout.service.d.ts +35 -0
  13. package/app/reports/format.d.ts +5 -1
  14. package/app/reports/interfaces/report.interface.d.ts +22 -3
  15. package/app/reports/layout.d.ts +2 -0
  16. package/app/reports/services/report-filter-state.service.d.ts +1 -1
  17. package/app/reports/text.d.ts +50 -0
  18. package/app/reports/theme/palette.d.ts +2 -0
  19. package/app/reports/values.d.ts +17 -0
  20. package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
  21. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
  22. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +260 -34
  23. package/esm2022/app/reports/components/report-component/report-component.component.mjs +65 -19
  24. package/esm2022/app/reports/data/report.data.mjs +19 -1
  25. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +134 -23
  26. package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
  27. package/esm2022/app/reports/export/report-export-collector.service.mjs +170 -44
  28. package/esm2022/app/reports/export/report-export.service.mjs +57 -19
  29. package/esm2022/app/reports/export/report-pdf.service.mjs +339 -96
  30. package/esm2022/app/reports/export/report-pptx.service.mjs +316 -88
  31. package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
  32. package/esm2022/app/reports/format.mjs +41 -10
  33. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  34. package/esm2022/app/reports/kpi-card.mjs +19 -6
  35. package/esm2022/app/reports/layout.mjs +11 -1
  36. package/esm2022/app/reports/option-builder.mjs +18 -5
  37. package/esm2022/app/reports/output-notes.mjs +57 -11
  38. package/esm2022/app/reports/services/report-filter-state.service.mjs +19 -10
  39. package/esm2022/app/reports/text.mjs +293 -85
  40. package/esm2022/app/reports/theme/palette.mjs +7 -2
  41. package/esm2022/app/reports/values.mjs +183 -0
  42. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +4 -1
  43. package/esm2022/app/reports/views/report/report.component.mjs +4 -1
  44. package/esm2022/public_api.mjs +2 -1
  45. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs → firestitch-report-echarts-DBMOHmBF.mjs} +2 -2
  46. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs.map → firestitch-report-echarts-DBMOHmBF.mjs.map} +1 -1
  47. package/fesm2022/{firestitch-report-firestitch-report-DbsWbE-j.mjs → firestitch-report-firestitch-report-CqbXT1gh.mjs} +3492 -1028
  48. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +1 -0
  49. package/fesm2022/firestitch-report.mjs +1 -1
  50. package/package.json +1 -1
  51. package/public_api.d.ts +1 -0
  52. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { comparisonNoteText, comparisonOffsetLabel, formatDayWindow, kpiNoteText, windowNoteText, windowText, } from './format';
1
+ import { comparisonNoteText, comparisonOffsetLabel, formatDayRange, formatDayWindow, formatReadingDay, isReadOnOneDay, kpiNoteText, windowNoteText, windowText, } from './format';
2
2
  // Between the current window and each prior one on the windows line.
3
3
  const WINDOWS_SEPARATOR = ' · ';
4
4
  // Ranks and shares are computed after the viewer's filters, never before.
@@ -38,8 +38,8 @@ export function outputColumnNote(column, data, locale) {
38
38
  }
39
39
  return [
40
40
  comparisonSentence(output, data.comparison, locale),
41
- rankSentence(output),
42
- shareSentence(output),
41
+ rankSentence(output, data.outputs),
42
+ shareSentence(output, data.outputs),
43
43
  windowSentences(data.windows?.[alias], locale, data),
44
44
  ]
45
45
  .filter((sentence) => !!sentence)
@@ -57,7 +57,19 @@ export function componentWindowsLine(data, context) {
57
57
  }
58
58
  return data.timeframe ? formatDayWindow(data.timeframe, context.timezone, context.locale) : '';
59
59
  }
60
+ // Read on one day, the line names the days the values are read on: 'On Sep
61
+ // 15, 2026 · vs previous month: Aug 31, 2026'.
60
62
  function comparisonWindowsLine(comparison, currentWindow, locale) {
63
+ if (isReadOnOneDay(comparison)) {
64
+ const priors = (comparison.offsets ?? []).map((offset, index) => {
65
+ const prior = comparison.priors?.[index];
66
+ const day = prior ? formatDayRange(prior.end, prior.end, locale) : '';
67
+ return day ? `${comparisonOffsetLabel(offset)}: ${day}` : comparisonOffsetLabel(offset);
68
+ });
69
+ return [formatReadingDay(currentWindow, locale, true), ...priors]
70
+ .filter((part) => !!part)
71
+ .join(WINDOWS_SEPARATOR);
72
+ }
61
73
  const current = formatDayWindow(currentWindow, comparison.timezone, locale);
62
74
  const priors = (comparison.offsets ?? []).map((offset, index) => {
63
75
  return priorWindowText(offset, comparison.priors?.[index], comparison.timezone, locale);
@@ -94,8 +106,9 @@ function windowNotes(data, locale) {
94
106
  .flatMap((meta) => (meta.notes ?? []).map((code) => windowNoteText(code, meta, locale, data.granularity)));
95
107
  }
96
108
  // A compared column's windows. In range mode every row compares the same two
97
- // windows, so they are named; in series and as-of modes each row compares its
98
- // own period, so only the lane is.
109
+ // windows, so they are named, and read on one day the days the values are
110
+ // read on are; over a series or a spine of periods each row compares its own
111
+ // period, so only the lane is.
99
112
  function comparisonSentence(output, comparison, locale) {
100
113
  if (!output.role || !comparison) {
101
114
  return '';
@@ -107,6 +120,9 @@ function comparisonSentence(output, comparison, locale) {
107
120
  if (comparison.mode === 'range' && current && (output.role === 'current' || prior)) {
108
121
  return rangeSentence(output.role, current, prior, offset);
109
122
  }
123
+ if (isReadOnOneDay(comparison) && comparison.current && priorWindow) {
124
+ return readingDaySentence(output.role, comparison.current, priorWindow, offset, locale);
125
+ }
110
126
  return output.role === 'current' || !offset ? '' : `${ROLE_LEADS[output.role]} ${comparisonOffsetLabel(offset)}.`;
111
127
  }
112
128
  function rangeSentence(role, current, prior, offset) {
@@ -119,9 +135,25 @@ function rangeSentence(role, current, prior, offset) {
119
135
  return `${ROLE_LEADS[role]} from ${prior} to ${current}.`;
120
136
  }
121
137
  }
138
+ // A column of a comparison read on one day, named by the days its values are
139
+ // read on: 'Prior value on Aug 31, 2026 (vs previous month).'
140
+ function readingDaySentence(role, currentWindow, priorWindow, offset, locale) {
141
+ const current = formatReadingDay(currentWindow, locale);
142
+ const prior = formatReadingDay(priorWindow, locale);
143
+ switch (role) {
144
+ case 'current':
145
+ return `Value ${current}.`;
146
+ case 'prior':
147
+ return offset ? `Prior value ${prior} (${comparisonOffsetLabel(offset)}).` : `Prior value ${prior}.`;
148
+ default:
149
+ return `${ROLE_LEADS[role]} from the value ${prior} to the value ${current}.`;
150
+ }
151
+ }
122
152
  // 'Rank by Revenue, 1 being the largest, within each Region. Tied values share
123
- // a rank (1, 1, 3).'
124
- function rankSentence(output) {
153
+ // a rank (1, 1, 3).' A measure written as its own rank ranks by the value it
154
+ // would otherwise show, so it names no other measure ('Rank, 1 being the
155
+ // largest, across all rows.').
156
+ function rankSentence(output, outputs) {
125
157
  const rank = output.kind === 'rank' ? output.rank : null;
126
158
  if (!rank) {
127
159
  return '';
@@ -129,18 +161,32 @@ function rankSentence(output) {
129
161
  const end = rank.direction === 'asc' ? 'smallest' : 'largest';
130
162
  const scope = rank.within?.length ? `within each ${joinNames(rank.within)}` : 'across all rows';
131
163
  const ties = rank.method === 'dense' ? '1, 1, 2' : '1, 1, 3';
132
- return `Rank by ${output.measure}, 1 being the ${end}, ${scope}. Tied values share a rank (${ties}). `
164
+ const by = isOwnOutput(output, outputs) ? '' : ` by ${output.measure}`;
165
+ return `Rank${by}, 1 being the ${end}, ${scope}. Tied values share a rank (${ties}). `
133
166
  + FILTERED_ROWS_SENTENCE;
134
167
  }
135
- // 'Share of the total Revenue within each Region.'
136
- function shareSentence(output) {
168
+ // 'Share of the total Revenue within each Region.' A measure written as its
169
+ // own share names no other measure ('Share of the total within each
170
+ // Region.', 'Share of the total across all rows.').
171
+ function shareSentence(output, outputs) {
137
172
  const share = output.kind === 'share' ? output.share : null;
138
173
  if (!share) {
139
174
  return '';
140
175
  }
176
+ if (isOwnOutput(output, outputs)) {
177
+ const scope = share.within?.length ? `within each ${joinNames(share.within)}` : 'across all rows';
178
+ return `Share of the total ${scope}. ${FILTERED_ROWS_SENTENCE}`;
179
+ }
141
180
  const scope = share.within?.length ? ` within each ${joinNames(share.within)}` : '';
142
181
  return `Share of the total ${output.measure}${scope}. ${FILTERED_ROWS_SENTENCE}`;
143
182
  }
183
+ // Whether a rank or a share is its measure's own output: the server writes a
184
+ // measure with a rank or a share as that rank or share, so its measure is a
185
+ // column of the same kind (itself, or for a prior or a change the current
186
+ // column), never a value of its own to name.
187
+ function isOwnOutput(output, outputs) {
188
+ return outputs?.[output.measure]?.kind === output.kind;
189
+ }
144
190
  // A windowed column: what it is, then why it reads as it does.
145
191
  function windowSentences(meta, locale, data) {
146
192
  if (!meta) {
@@ -155,4 +201,4 @@ function joinNames(names) {
155
201
  ? `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`
156
202
  : names.join('');
157
203
  }
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LW5vdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL291dHB1dC1ub3Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGNBQWMsRUFDZCxVQUFVLEdBQ1gsTUFBTSxVQUFVLENBQUM7QUE4Q2xCLHFFQUFxRTtBQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQywwRUFBMEU7QUFDMUUsTUFBTSxzQkFBc0IsR0FBRywwQ0FBMEMsQ0FBQztBQUUxRSxNQUFNLFVBQVUsR0FBK0I7SUFDN0MsT0FBTyxFQUFFLE9BQU87SUFDaEIsS0FBSyxFQUFFLGFBQWE7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLG9HQUFvRztBQUNwRywyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBMEMsRUFDMUMsT0FBNkIsRUFDN0IsUUFBNEIsRUFBRTtJQUU5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRztRQUNaLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUks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QUFHLENBQUMsQ0FBQyxFQUFFO1FBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wYXJpc29uTm90ZVRleHQsXG4gIGNvbXBhcmlzb25PZmZzZXRMYWJlbCxcbiAgZm9ybWF0RGF5V2luZG93LFxuICBrcGlOb3RlVGV4dCxcbiAgd2luZG93Tm90ZVRleHQsXG4gIHdpbmRvd1RleHQsXG59IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudEtwaSxcbiAgT3V0cHV0TWV0YSxcbiAgT3V0cHV0Um9sZSxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIG5vdGVzIGEgY29tcG9uZW50IHNob3dzIGFib3V0IHRoZSBudW1iZXJzIGl0IGRyYXdzOiB3aGljaCBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMsIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLCBhbmQgaG93IGl0cyB3aW5kb3dlZCB2YWx1ZXNcbi8vIHdlcmUgY29tcHV0ZWQuIFRoZSBzZXJ2ZXIgc2VuZHMgd2luZG93cywgZmllbGRzIGFuZCBjb2RlczsgZXZlcnkgc2VudGVuY2UgaXNcbi8vIHdvcmRlZCBoZXJlLCB0aHJvdWdoIGZvcm1hdC50cywgaW4gRW5nbGlzaCB3aXRoIHRoZSBkYXlzIGluIHRoZSByZXBvcnQnc1xuLy8gbG9jYWxlLiBBIGNvbXBvbmVudCB3aG9zZSBkYXRhIGNhcnJpZXMgbm9uZSBvZiB0aG9zZSBrZXlzIGhhcyBubyBub3RlLlxuXG4vLyBUaGUgQ29tcG9uZW50RGF0YSBrZXlzIGEgbm90ZSByZWFkcy5cbmV4cG9ydCB0eXBlIENvbXBvbmVudE5vdGVEYXRhID0gUGljazxcbiAgQ29tcG9uZW50RGF0YSxcbiAgJ2NvbXBhcmlzb24nIHwgJ3RpbWVmcmFtZScgfCAnb3V0cHV0cycgfCAnY2VsbE1lYXN1cmVzJyB8ICd3aW5kb3dzJyB8ICdncmFudWxhcml0eScgfCAna3BpJ1xuPjtcblxuLy8gVGhlIHJlcG9ydCB0aGUgbm90ZSBpcyB3cml0dGVuIGZvcjogaXRzIGxvY2FsZSwgYW5kIHRoZSB6b25lIGEgdGltZWZyYW1lJ3Ncbi8vIGN1dCB0aW1lIHJlYWRzIGluIChhIGNvbXBhcmlzb24gbmFtZXMgaXRzIG93bikuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE5vdGVDb250ZXh0IHtcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWc7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIHRoZSBub3RlIGEgY29tcG9uZW50IHNob3dzLiBPbWl0dGVkLCBhIHBhcnQgaXMgc2hvd24sIGV4Y2VwdFxuLy8gdGhlIHdpbmRvdyBkZXNjcmlwdGlvbnMsIHdoaWNoIGEgY2hhcnQncyB0b29sdGlwcyBhbmQgYSBsaXN0J3MgaGVhZGVycyBjYXJyeVxuLy8gaW5zdGVhZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Tm90ZVBhcnRzIHtcbiAgLy8gVGhlIGRheXMgdGhlIGNvbXBvbmVudCByZWFkczogaXRzIGNvbXBhcmlzb24ncyBjdXJyZW50IGFuZCBwcmlvciB3aW5kb3dzLFxuICAvLyBlbHNlIGl0cyB0aW1lZnJhbWUncyBkYXlzLlxuICB3aW5kb3dzPzogYm9vbGVhbjtcbiAgLy8gV2hhdCBlYWNoIHdpbmRvd2VkIHZhbHVlIGlzICgnUm9sbGluZyAzLW1vbnRoIHRvdGFsLCBTZXAgMSDigJMgMzAsIDIwMjYnKS5cbiAgd2luZG93RGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbiAgLy8gV2h5IHRoZSB3aW5kb3dlZCB2YWx1ZXMgcmVhZCBhcyB0aGV5IGRvLlxuICB3aW5kb3dOb3Rlcz86IGJvb2xlYW47XG59XG5cbi8vIEJldHdlZW4gdGhlIGN1cnJlbnQgd2luZG93IGFuZCBlYWNoIHByaW9yIG9uZSBvbiB0aGUgd2luZG93cyBsaW5lLlxuY29uc3QgV0lORE9XU19TRVBBUkFUT1IgPSAnIMK3ICc7XG5cbi8vIFJhbmtzIGFuZCBzaGFyZXMgYXJlIGNvbXB1dGVkIGFmdGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBuZXZlciBiZWZvcmUuXG5jb25zdCBGSUxURVJFRF9ST1dTX1NFTlRFTkNFID0gJ0NvbXB1dGVkIG92ZXIgdGhlIHJvd3MgdGhlIGZpbHRlcnMga2VlcC4nO1xuXG5jb25zdCBST0xFX0xFQURTOiBSZWNvcmQ8T3V0cHV0Um9sZSwgc3RyaW5nPiA9IHtcbiAgY3VycmVudDogJ1ZhbHVlJyxcbiAgcHJpb3I6ICdQcmlvciB2YWx1ZScsXG4gIGNoYW5nZTogJ0NoYW5nZScsXG4gIHBlcmNlbnRfY2hhbmdlOiAnUGVyY2VudCBjaGFuZ2UnLFxufTtcblxuLy8gVGhlIG5vdGUncyBsaW5lcywgaW4gb3JkZXI6IHRoZSB3aW5kb3dzLCB0aGVuIHRoZSBjb21wYXJpc29uJ3Mgbm90ZXMgYW5kIGFcbi8vIEtQSSdzIGRlbHRhIG5vdGUsIHRoZW4gdGhlIHdpbmRvd2VkIHZhbHVlcycgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gQSBsaW5lIGlzIG5ldmVyIHJlcGVhdGVkICh0d29cbi8vIHdpbmRvd2VkIHZhbHVlcyBvZnRlbiBzaGFyZSBhIG5vdGUpLiBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZVxuLy8ga2V5cywgb3Igbm9uZSBvZiB0aGUgcGFydHMgYXNrZWQgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCxcbiAgcGFydHM6IENvbXBvbmVudE5vdGVQYXJ0cyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBwYXJ0cy53aW5kb3dzID09PSBmYWxzZSA/ICcnIDogY29tcG9uZW50V2luZG93c0xpbmUoZGF0YSwgY29udGV4dCksXG4gICAgLi4uY29tcGFyaXNvbk5vdGVzKGRhdGEuY29tcGFyaXNvbiksXG4gICAga3BpTm90ZShkYXRhLmtwaSwgZGF0YS5jb21wYXJpc29uKSxcbiAgICAuLi4ocGFydHMud2luZG93RGVzY3JpcHRpb25zID8gd2luZG93RGVzY3JpcHRpb25zKGRhdGEsIGNvbnRleHQubG9jYWxlKSA6IFtdKSxcbiAgICAuLi4ocGFydHMud2luZG93Tm90ZXMgPT09IGZhbHNlID8gW10gOiB3aW5kb3dOb3RlcyhkYXRhLCBjb250ZXh0LmxvY2FsZSkpLFxuICBdO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChsaW5lcy5maWx0ZXIoKGxpbmUpID0+ICEhbGluZSkpXTtcbn1cblxuLy8gV2hhdCBvbmUgb3V0cHV0IGNvbHVtbiBob2xkcywgZm9yIGl0cyBoZWFkZXIncyB0b29sdGlwOiB0aGUgd2luZG93cyBhXG4vLyBjb21wYXJlZCB2YWx1ZSBjb3ZlcnMsIGEgcmFuaydzIG9yIGEgc2hhcmUncyBzY29wZSwgYW5kIGhvdyBhIHdpbmRvd2VkIHZhbHVlXG4vLyB3YXMgY29tcHV0ZWQuIEEgY3Jvc3MtdGFiIGNlbGwgY29sdW1uIHJlYWRzIGl0cyBtZWFzdXJlJ3MgbWVhbmluZyB0aHJvdWdoXG4vLyBjZWxsTWVhc3VyZXMuICcnIGZvciBhIHBsYWluIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRDb2x1bW5Ob3RlKFxuICBjb2x1bW46IHN0cmluZyxcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGFsaWFzID0gZGF0YT8uY2VsbE1lYXN1cmVzPy5bY29sdW1uXSA/PyBjb2x1bW47XG4gIGNvbnN0IG91dHB1dCA9IGRhdGE/Lm91dHB1dHM/LlthbGlhc107XG5cbiAgaWYgKCFvdXRwdXQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbXBhcmlzb25TZW50ZW5jZShvdXRwdXQsIGRhdGEuY29tcGFyaXNvbiwgbG9jYWxlKSxcbiAgICByYW5rU2VudGVuY2Uob3V0cHV0KSxcbiAgICBzaGFyZVNlbnRlbmNlKG91dHB1dCksXG4gICAgd2luZG93U2VudGVuY2VzKGRhdGEud2luZG93cz8uW2FsaWFzXSwgbG9jYWxlLCBkYXRhKSxcbiAgXVxuICAgIC5maWx0ZXIoKHNlbnRlbmNlKSA9PiAhIXNlbnRlbmNlKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8vICdTZXAgMSDigJMgMTUsIDIwMjYgwrcgdnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicuIEEgY29tcGFyaXNvblxuLy8gd2l0aCBubyBjdXJyZW50IHdpbmRvdyB5ZXQgaGFzIG5vIGxpbmUgKGl0cyBub193aW5kb3cgbm90ZSBzYXlzIHNvKTsgYVxuLy8gY29tcG9uZW50IHdpdGhvdXQgYSBjb21wYXJpc29uIHNob3dzIGl0cyB0aW1lZnJhbWUncyBkYXlzLiAnJyB3aGVuIHRoZSBkYXRhXG4vLyBoYXMgbmVpdGhlci4gVGhlIG5vdGUncyBmaXJzdCBsaW5lLCBhbmQgdGhlIFBERiBhbmQgUG93ZXJQb2ludCBleHBvcnRzJ1xuLy8gc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudFdpbmRvd3NMaW5lKGRhdGE6IENvbXBvbmVudE5vdGVEYXRhLCBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbXBhcmlzb24gPSBkYXRhLmNvbXBhcmlzb247XG5cbiAgaWYgKGNvbXBhcmlzb24pIHtcbiAgICByZXR1cm4gY29tcGFyaXNvbi5jdXJyZW50ID8gY29tcGFyaXNvbldpbmRvd3NMaW5lKGNvbXBhcmlzb24sIGNvbXBhcmlzb24uY3VycmVudCwgY29udGV4dC5sb2NhbGUpIDogJyc7XG4gIH1cblxuICByZXR1cm4gZGF0YS50aW1lZnJhbWUgPyBmb3JtYXREYXlXaW5kb3coZGF0YS50aW1lZnJhbWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQubG9jYWxlKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uV2luZG93c0xpbmUoXG4gIGNvbXBhcmlzb246IENvbXBvbmVudENvbXBhcmlzb24sXG4gIGN1cnJlbnRXaW5kb3c6IENvbXBhcmlzb25XaW5kb3csXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudCA9IGZvcm1hdERheVdpbmRvdyhjdXJyZW50V2luZG93LCBjb21wYXJpc29uLnRpbWV6b25lLCBsb2NhbGUpO1xuICBjb25zdCBwcmlvcnMgPSAoY29tcGFyaXNvbi5vZmZzZXRzID8/IFtdKS5tYXAoKG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gcHJpb3JXaW5kb3dUZXh0KG9mZnNldCwgY29tcGFyaXNvbi5wcmlvcnM/LltpbmRleF0sIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSk7XG4gIH0pO1xuXG4gIHJldHVybiBbY3VycmVudCwgLi4ucHJpb3JzXVxuICAgIC5maWx0ZXIoKHBhcnQpID0+ICEhcGFydClcbiAgICAuam9pbihXSU5ET1dTX1NFUEFSQVRPUik7XG59XG5cbi8vIE9uZSBwcmlvciBsYW5lOiAndnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicsIG9yIGl0cyBsYWJlbCBhbG9uZVxuLy8gd2hlbiB0aGUgc2VydmVyIHNlbmRzIG5vIHdpbmRvdyBmb3IgaXQuXG5mdW5jdGlvbiBwcmlvcldpbmRvd1RleHQoXG4gIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCxcbiAgcHJpb3I6IENvbXBhcmlzb25XaW5kb3cgfCB1bmRlZmluZWQsXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbGFiZWwgPSBjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KTtcbiAgY29uc3QgZGF5cyA9IHByaW9yID8gZm9ybWF0RGF5V2luZG93KHByaW9yLCB0aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIHJldHVybiBkYXlzID8gYCR7bGFiZWx9OiAke2RheXN9YCA6IGxhYmVsO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uTm90ZXMoY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoY29tcGFyaXNvbj8ubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gY29tcGFyaXNvbk5vdGVUZXh0KGNvZGUsIGNvbXBhcmlzb24pKTtcbn1cblxuLy8gV2h5IGEgS1BJIGNhcmQncyBkZWx0YSByZWFkcyBhcyBpdCBkb2VzICgnTm8gYmFzZWxpbmU6IHRoZSBwcmV2aW91cyBwZXJpb2Rcbi8vIGhhcyBubyBkYXRhLicpLCBuYW1pbmcgdGhlIGJhc2VsaW5lIGJ5IHdoYXQgdGhlIGZpcnN0IGxhbmUgY29tcGFyZXMgYWdhaW5zdC5cbmZ1bmN0aW9uIGtwaU5vdGUoXG4gIGtwaTogQ29tcG9uZW50S3BpIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4ga3BpPy5ub3RlID8ga3BpTm90ZVRleHQoa3BpLm5vdGUsIGNvbXBhcmlzb24/Lm9mZnNldHM/LlswXT8uYWdhaW5zdCkgOiAnJztcbn1cblxuLy8gT25lIGxpbmUgcGVyIHdpbmRvd2VkIHZhbHVlLCBuYW1lZCBieSBpdHMgY29sdW1uIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwuXG5mdW5jdGlvbiB3aW5kb3dEZXNjcmlwdGlvbnMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICBjb25zdCB3aW5kb3dzID0gT2JqZWN0LmVudHJpZXMoZGF0YS53aW5kb3dzID8/IHt9KTtcblxuICByZXR1cm4gd2luZG93cy5tYXAoKFthbGlhcywgbWV0YV0pID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gd2luZG93VGV4dChtZXRhLCBsb2NhbGUsIGRhdGEuZ3JhbnVsYXJpdHkpO1xuXG4gICAgcmV0dXJuIHdpbmRvd3MubGVuZ3RoID4gMSA/IGAke2FsaWFzfTogJHt0ZXh0fWAgOiB0ZXh0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd2luZG93Tm90ZXMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkYXRhLndpbmRvd3MgPz8ge30pXG4gICAgLmZsYXRNYXAoKG1ldGEpID0+IChtZXRhLm5vdGVzID8/IFtdKS5tYXAoKGNvZGUpID0+IHdpbmRvd05vdGVUZXh0KGNvZGUsIG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSkpKTtcbn1cblxuLy8gQSBjb21wYXJlZCBjb2x1bW4ncyB3aW5kb3dzLiBJbiByYW5nZSBtb2RlIGV2ZXJ5IHJvdyBjb21wYXJlcyB0aGUgc2FtZSB0d29cbi8vIHdpbmRvd3MsIHNvIHRoZXkgYXJlIG5hbWVkOyBpbiBzZXJpZXMgYW5kIGFzLW9mIG1vZGVzIGVhY2ggcm93IGNvbXBhcmVzIGl0c1xuLy8gb3duIHBlcmlvZCwgc28gb25seSB0aGUgbGFuZSBpcy5cbmZ1bmN0aW9uIGNvbXBhcmlzb25TZW50ZW5jZShcbiAgb3V0cHV0OiBPdXRwdXRNZXRhLFxuICBjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBpZiAoIW91dHB1dC5yb2xlIHx8ICFjb21wYXJpc29uKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgb2Zmc2V0ID0gY29tcGFyaXNvbi5vZmZzZXRzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXSA/PyBudWxsO1xuICBjb25zdCBjdXJyZW50ID0gY29tcGFyaXNvbi5jdXJyZW50ID8gZm9ybWF0RGF5V2luZG93KGNvbXBhcmlzb24uY3VycmVudCwgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuICBjb25zdCBwcmlvcldpbmRvdyA9IGNvbXBhcmlzb24ucHJpb3JzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXTtcbiAgY29uc3QgcHJpb3IgPSBwcmlvcldpbmRvdyA/IGZvcm1hdERheVdpbmRvdyhwcmlvcldpbmRvdywgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIGlmIChjb21wYXJpc29uLm1vZGUgPT09ICdyYW5nZScgJiYgY3VycmVudCAmJiAob3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCBwcmlvcikpIHtcbiAgICByZXR1cm4gcmFuZ2VTZW50ZW5jZShvdXRwdXQucm9sZSwgY3VycmVudCwgcHJpb3IsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCAhb2Zmc2V0ID8gJycgOiBgJHtST0xFX0xFQURTW291dHB1dC5yb2xlXX0gJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0uYDtcbn1cblxuZnVuY3Rpb24gcmFuZ2VTZW50ZW5jZShyb2xlOiBPdXRwdXRSb2xlLCBjdXJyZW50OiBzdHJpbmcsIHByaW9yOiBzdHJpbmcsIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCB8IG51bGwpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHJvbGUpIHtcbiAgICBjYXNlICdjdXJyZW50JzpcbiAgICAgIHJldHVybiBgVmFsdWUgZm9yICR7Y3VycmVudH0uYDtcbiAgICBjYXNlICdwcmlvcic6XG4gICAgICByZXR1cm4gb2Zmc2V0ID8gYFByaW9yIHZhbHVlIGZvciAke3ByaW9yfSAoJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0pLmAgOiBgUHJpb3IgdmFsdWUgZm9yICR7cHJpb3J9LmA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgJHtST0xFX0xFQURTW3JvbGVdfSBmcm9tICR7cHJpb3J9IHRvICR7Y3VycmVudH0uYDtcbiAgfVxufVxuXG4vLyAnUmFuayBieSBSZXZlbnVlLCAxIGJlaW5nIHRoZSBsYXJnZXN0LCB3aXRoaW4gZWFjaCBSZWdpb24uIFRpZWQgdmFsdWVzIHNoYXJlXG4vLyBhIHJhbmsgKDEsIDEsIDMpLidcbmZ1bmN0aW9uIHJhbmtTZW50ZW5jZShvdXRwdXQ6IE91dHB1dE1ldGEpOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gb3V0cHV0LmtpbmQgPT09ICdyYW5rJyA/IG91dHB1dC5yYW5rIDogbnVsbDtcblxuICBpZiAoIXJhbmspIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBlbmQgPSByYW5rLmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnc21hbGxlc3QnIDogJ2xhcmdlc3QnO1xuICBjb25zdCBzY29wZSA9IHJhbmsud2l0aGluPy5sZW5ndGggPyBgd2l0aGluIGVhY2ggJHtqb2luTmFtZXMocmFuay53aXRoaW4pfWAgOiAnYWNyb3NzIGFsbCByb3dzJztcbiAgY29uc3QgdGllcyA9IHJhbmsubWV0aG9kID09PSAnZGVuc2UnID8gJzEsIDEsIDInIDogJzEsIDEsIDMnO1xuXG4gIHJldHVybiBgUmFuayBieSAke291dHB1dC5tZWFzdXJlfSwgMSBiZWluZyB0aGUgJHtlbmR9LCAke3Njb3BlfS4gVGllZCB2YWx1ZXMgc2hhcmUgYSByYW5rICgke3RpZXN9KS4gYFxuICAgICsgRklMVEVSRURfUk9XU19TRU5URU5DRTtcbn1cblxuLy8gJ1NoYXJlIG9mIHRoZSB0b3RhbCBSZXZlbnVlIHdpdGhpbiBlYWNoIFJlZ2lvbi4nXG5mdW5jdGlvbiBzaGFyZVNlbnRlbmNlKG91dHB1dDogT3V0cHV0TWV0YSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXJlID0gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgPyBvdXRwdXQuc2hhcmUgOiBudWxsO1xuXG4gIGlmICghc2hhcmUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzY29wZSA9IHNoYXJlLndpdGhpbj8ubGVuZ3RoID8gYCB3aXRoaW4gZWFjaCAke2pvaW5OYW1lcyhzaGFyZS53aXRoaW4pfWAgOiAnJztcblxuICByZXR1cm4gYFNoYXJlIG9mIHRoZSB0b3RhbCAke291dHB1dC5tZWFzdXJlfSR7c2NvcGV9LiAke0ZJTFRFUkVEX1JPV1NfU0VOVEVOQ0V9YDtcbn1cblxuLy8gQSB3aW5kb3dlZCBjb2x1bW46IHdoYXQgaXQgaXMsIHRoZW4gd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuXG5mdW5jdGlvbiB3aW5kb3dTZW50ZW5jZXMoXG4gIG1ldGE6IFdpbmRvd01ldGEgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRhOiBDb21wb25lbnROb3RlRGF0YSxcbik6IHN0cmluZyB7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IG5vdGVzID0gKG1ldGEubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gd2luZG93Tm90ZVRleHQoY29kZSwgbWV0YSwgbG9jYWxlLCBkYXRhLmdyYW51bGFyaXR5KSk7XG5cbiAgcmV0dXJuIFtgJHt3aW5kb3dUZXh0KG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSl9LmAsIC4uLm5vdGVzXS5qb2luKCcgJyk7XG59XG5cbi8vICdSZWdpb24nLCAnUmVnaW9uIGFuZCBDaGFubmVsJywgJ1JlZ2lvbiwgQ2hhbm5lbCBhbmQgUGxhbicuXG5mdW5jdGlvbiBqb2luTmFtZXMobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzLmxlbmd0aCA+IDFcbiAgICA/IGAke25hbWVzLnNsaWNlKDAsIC0xKS5qb2luKCcsICcpfSBhbmQgJHtuYW1lc1tuYW1lcy5sZW5ndGggLSAxXX1gXG4gICAgOiBuYW1lcy5qb2luKCcnKTtcbn1cbiJdfQ==
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LW5vdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL291dHB1dC1ub3Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsV0FBVyxFQUNYLGNBQWMsRUFDZCxVQUFVLEdBQ1gsTUFBTSxVQUFVLENBQUM7QUE4Q2xCLHFFQUFxRTtBQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQywwRUFBMEU7QUFDMUUsTUFBTSxzQkFBc0IsR0FBRywwQ0FBMEMsQ0FBQztBQUUxRSxNQUFNLFVBQVUsR0FBK0I7SUFDN0MsT0FBTyxFQUFFLE9BQU87SUFDaEIsS0FBSyxFQUFFLGFBQWE7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLG9HQUFvRztBQUNwRywyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBMEMsRUFDMUMsT0FBNkIsRUFDN0IsUUFBNEIsRUFBRTtJQUU5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRztRQUNaLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtC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QUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBUyxTQUFTLENBQUMsS0FBZTtJQUNoQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNyQixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtRQUNuRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29tcGFyaXNvbk5vdGVUZXh0LFxuICBjb21wYXJpc29uT2Zmc2V0TGFiZWwsXG4gIGZvcm1hdERheVJhbmdlLFxuICBmb3JtYXREYXlXaW5kb3csXG4gIGZvcm1hdFJlYWRpbmdEYXksXG4gIGlzUmVhZE9uT25lRGF5LFxuICBrcGlOb3RlVGV4dCxcbiAgd2luZG93Tm90ZVRleHQsXG4gIHdpbmRvd1RleHQsXG59IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudEtwaSxcbiAgT3V0cHV0TWV0YSxcbiAgT3V0cHV0Um9sZSxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIG5vdGVzIGEgY29tcG9uZW50IHNob3dzIGFib3V0IHRoZSBudW1iZXJzIGl0IGRyYXdzOiB3aGljaCBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMsIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLCBhbmQgaG93IGl0cyB3aW5kb3dlZCB2YWx1ZXNcbi8vIHdlcmUgY29tcHV0ZWQuIFRoZSBzZXJ2ZXIgc2VuZHMgd2luZG93cywgZmllbGRzIGFuZCBjb2RlczsgZXZlcnkgc2VudGVuY2UgaXNcbi8vIHdvcmRlZCBoZXJlLCB0aHJvdWdoIGZvcm1hdC50cywgaW4gRW5nbGlzaCB3aXRoIHRoZSBkYXlzIGluIHRoZSByZXBvcnQnc1xuLy8gbG9jYWxlLiBBIGNvbXBvbmVudCB3aG9zZSBkYXRhIGNhcnJpZXMgbm9uZSBvZiB0aG9zZSBrZXlzIGhhcyBubyBub3RlLlxuXG4vLyBUaGUgQ29tcG9uZW50RGF0YSBrZXlzIGEgbm90ZSByZWFkcy5cbmV4cG9ydCB0eXBlIENvbXBvbmVudE5vdGVEYXRhID0gUGljazxcbiAgQ29tcG9uZW50RGF0YSxcbiAgJ2NvbXBhcmlzb24nIHwgJ3RpbWVmcmFtZScgfCAnb3V0cHV0cycgfCAnY2VsbE1lYXN1cmVzJyB8ICd3aW5kb3dzJyB8ICdncmFudWxhcml0eScgfCAna3BpJ1xuPjtcblxuLy8gVGhlIHJlcG9ydCB0aGUgbm90ZSBpcyB3cml0dGVuIGZvcjogaXRzIGxvY2FsZSwgYW5kIHRoZSB6b25lIGEgdGltZWZyYW1lJ3Ncbi8vIGN1dCB0aW1lIHJlYWRzIGluIChhIGNvbXBhcmlzb24gbmFtZXMgaXRzIG93bikuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE5vdGVDb250ZXh0IHtcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWc7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIHRoZSBub3RlIGEgY29tcG9uZW50IHNob3dzLiBPbWl0dGVkLCBhIHBhcnQgaXMgc2hvd24sIGV4Y2VwdFxuLy8gdGhlIHdpbmRvdyBkZXNjcmlwdGlvbnMsIHdoaWNoIGEgY2hhcnQncyB0b29sdGlwcyBhbmQgYSBsaXN0J3MgaGVhZGVycyBjYXJyeVxuLy8gaW5zdGVhZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Tm90ZVBhcnRzIHtcbiAgLy8gVGhlIGRheXMgdGhlIGNvbXBvbmVudCByZWFkczogaXRzIGNvbXBhcmlzb24ncyBjdXJyZW50IGFuZCBwcmlvciB3aW5kb3dzLFxuICAvLyBlbHNlIGl0cyB0aW1lZnJhbWUncyBkYXlzLlxuICB3aW5kb3dzPzogYm9vbGVhbjtcbiAgLy8gV2hhdCBlYWNoIHdpbmRvd2VkIHZhbHVlIGlzICgnUm9sbGluZyAzLW1vbnRoIHRvdGFsLCBTZXAgMSDigJMgMzAsIDIwMjYnKS5cbiAgd2luZG93RGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbiAgLy8gV2h5IHRoZSB3aW5kb3dlZCB2YWx1ZXMgcmVhZCBhcyB0aGV5IGRvLlxuICB3aW5kb3dOb3Rlcz86IGJvb2xlYW47XG59XG5cbi8vIEJldHdlZW4gdGhlIGN1cnJlbnQgd2luZG93IGFuZCBlYWNoIHByaW9yIG9uZSBvbiB0aGUgd2luZG93cyBsaW5lLlxuY29uc3QgV0lORE9XU19TRVBBUkFUT1IgPSAnIMK3ICc7XG5cbi8vIFJhbmtzIGFuZCBzaGFyZXMgYXJlIGNvbXB1dGVkIGFmdGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBuZXZlciBiZWZvcmUuXG5jb25zdCBGSUxURVJFRF9ST1dTX1NFTlRFTkNFID0gJ0NvbXB1dGVkIG92ZXIgdGhlIHJvd3MgdGhlIGZpbHRlcnMga2VlcC4nO1xuXG5jb25zdCBST0xFX0xFQURTOiBSZWNvcmQ8T3V0cHV0Um9sZSwgc3RyaW5nPiA9IHtcbiAgY3VycmVudDogJ1ZhbHVlJyxcbiAgcHJpb3I6ICdQcmlvciB2YWx1ZScsXG4gIGNoYW5nZTogJ0NoYW5nZScsXG4gIHBlcmNlbnRfY2hhbmdlOiAnUGVyY2VudCBjaGFuZ2UnLFxufTtcblxuLy8gVGhlIG5vdGUncyBsaW5lcywgaW4gb3JkZXI6IHRoZSB3aW5kb3dzLCB0aGVuIHRoZSBjb21wYXJpc29uJ3Mgbm90ZXMgYW5kIGFcbi8vIEtQSSdzIGRlbHRhIG5vdGUsIHRoZW4gdGhlIHdpbmRvd2VkIHZhbHVlcycgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gQSBsaW5lIGlzIG5ldmVyIHJlcGVhdGVkICh0d29cbi8vIHdpbmRvd2VkIHZhbHVlcyBvZnRlbiBzaGFyZSBhIG5vdGUpLiBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZVxuLy8ga2V5cywgb3Igbm9uZSBvZiB0aGUgcGFydHMgYXNrZWQgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCxcbiAgcGFydHM6IENvbXBvbmVudE5vdGVQYXJ0cyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBwYXJ0cy53aW5kb3dzID09PSBmYWxzZSA/ICcnIDogY29tcG9uZW50V2luZG93c0xpbmUoZGF0YSwgY29udGV4dCksXG4gICAgLi4uY29tcGFyaXNvbk5vdGVzKGRhdGEuY29tcGFyaXNvbiksXG4gICAga3BpTm90ZShkYXRhLmtwaSwgZGF0YS5jb21wYXJpc29uKSxcbiAgICAuLi4ocGFydHMud2luZG93RGVzY3JpcHRpb25zID8gd2luZG93RGVzY3JpcHRpb25zKGRhdGEsIGNvbnRleHQubG9jYWxlKSA6IFtdKSxcbiAgICAuLi4ocGFydHMud2luZG93Tm90ZXMgPT09IGZhbHNlID8gW10gOiB3aW5kb3dOb3RlcyhkYXRhLCBjb250ZXh0LmxvY2FsZSkpLFxuICBdO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChsaW5lcy5maWx0ZXIoKGxpbmUpID0+ICEhbGluZSkpXTtcbn1cblxuLy8gV2hhdCBvbmUgb3V0cHV0IGNvbHVtbiBob2xkcywgZm9yIGl0cyBoZWFkZXIncyB0b29sdGlwOiB0aGUgd2luZG93cyBhXG4vLyBjb21wYXJlZCB2YWx1ZSBjb3ZlcnMsIGEgcmFuaydzIG9yIGEgc2hhcmUncyBzY29wZSwgYW5kIGhvdyBhIHdpbmRvd2VkIHZhbHVlXG4vLyB3YXMgY29tcHV0ZWQuIEEgY3Jvc3MtdGFiIGNlbGwgY29sdW1uIHJlYWRzIGl0cyBtZWFzdXJlJ3MgbWVhbmluZyB0aHJvdWdoXG4vLyBjZWxsTWVhc3VyZXMuICcnIGZvciBhIHBsYWluIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRDb2x1bW5Ob3RlKFxuICBjb2x1bW46IHN0cmluZyxcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGFsaWFzID0gZGF0YT8uY2VsbE1lYXN1cmVzPy5bY29sdW1uXSA/PyBjb2x1bW47XG4gIGNvbnN0IG91dHB1dCA9IGRhdGE/Lm91dHB1dHM/LlthbGlhc107XG5cbiAgaWYgKCFvdXRwdXQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbXBhcmlzb25TZW50ZW5jZShvdXRwdXQsIGRhdGEuY29tcGFyaXNvbiwgbG9jYWxlKSxcbiAgICByYW5rU2VudGVuY2Uob3V0cHV0LCBkYXRhLm91dHB1dHMpLFxuICAgIHNoYXJlU2VudGVuY2Uob3V0cHV0LCBkYXRhLm91dHB1dHMpLFxuICAgIHdpbmRvd1NlbnRlbmNlcyhkYXRhLndpbmRvd3M/LlthbGlhc10sIGxvY2FsZSwgZGF0YSksXG4gIF1cbiAgICAuZmlsdGVyKChzZW50ZW5jZSkgPT4gISFzZW50ZW5jZSlcbiAgICAuam9pbignICcpO1xufVxuXG4vLyAnU2VwIDEg4oCTIDE1LCAyMDI2IMK3IHZzIHByZXZpb3VzIG1vbnRoOiBBdWcgMSDigJMgMTUsIDIwMjYnLiBBIGNvbXBhcmlzb25cbi8vIHdpdGggbm8gY3VycmVudCB3aW5kb3cgeWV0IGhhcyBubyBsaW5lIChpdHMgbm9fd2luZG93IG5vdGUgc2F5cyBzbyk7IGFcbi8vIGNvbXBvbmVudCB3aXRob3V0IGEgY29tcGFyaXNvbiBzaG93cyBpdHMgdGltZWZyYW1lJ3MgZGF5cy4gJycgd2hlbiB0aGUgZGF0YVxuLy8gaGFzIG5laXRoZXIuIFRoZSBub3RlJ3MgZmlyc3QgbGluZSwgYW5kIHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgZXhwb3J0cydcbi8vIHN1YnRpdGxlIHVuZGVyIGEgY2hhcnQncyBvciBhIGxpc3QncyB0aXRsZS5cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnRXaW5kb3dzTGluZShkYXRhOiBDb21wb25lbnROb3RlRGF0YSwgY29udGV4dDogQ29tcG9uZW50Tm90ZUNvbnRleHQpOiBzdHJpbmcge1xuICBjb25zdCBjb21wYXJpc29uID0gZGF0YS5jb21wYXJpc29uO1xuXG4gIGlmIChjb21wYXJpc29uKSB7XG4gICAgcmV0dXJuIGNvbXBhcmlzb24uY3VycmVudCA/IGNvbXBhcmlzb25XaW5kb3dzTGluZShjb21wYXJpc29uLCBjb21wYXJpc29uLmN1cnJlbnQsIGNvbnRleHQubG9jYWxlKSA6ICcnO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEudGltZWZyYW1lID8gZm9ybWF0RGF5V2luZG93KGRhdGEudGltZWZyYW1lLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmxvY2FsZSkgOiAnJztcbn1cblxuLy8gUmVhZCBvbiBvbmUgZGF5LCB0aGUgbGluZSBuYW1lcyB0aGUgZGF5cyB0aGUgdmFsdWVzIGFyZSByZWFkIG9uOiAnT24gU2VwXG4vLyAxNSwgMjAyNiDCtyB2cyBwcmV2aW91cyBtb250aDogQXVnIDMxLCAyMDI2Jy5cbmZ1bmN0aW9uIGNvbXBhcmlzb25XaW5kb3dzTGluZShcbiAgY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbixcbiAgY3VycmVudFdpbmRvdzogQ29tcGFyaXNvbldpbmRvdyxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBpZiAoaXNSZWFkT25PbmVEYXkoY29tcGFyaXNvbikpIHtcbiAgICBjb25zdCBwcmlvcnMgPSAoY29tcGFyaXNvbi5vZmZzZXRzID8/IFtdKS5tYXAoKG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHByaW9yID0gY29tcGFyaXNvbi5wcmlvcnM/LltpbmRleF07XG4gICAgICBjb25zdCBkYXkgPSBwcmlvciA/IGZvcm1hdERheVJhbmdlKHByaW9yLmVuZCwgcHJpb3IuZW5kLCBsb2NhbGUpIDogJyc7XG5cbiAgICAgIHJldHVybiBkYXkgPyBgJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX06ICR7ZGF5fWAgOiBjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBbZm9ybWF0UmVhZGluZ0RheShjdXJyZW50V2luZG93LCBsb2NhbGUsIHRydWUpLCAuLi5wcmlvcnNdXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhIXBhcnQpXG4gICAgICAuam9pbihXSU5ET1dTX1NFUEFSQVRPUik7XG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gZm9ybWF0RGF5V2luZG93KGN1cnJlbnRXaW5kb3csIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSk7XG4gIGNvbnN0IHByaW9ycyA9IChjb21wYXJpc29uLm9mZnNldHMgPz8gW10pLm1hcCgob2Zmc2V0LCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBwcmlvcldpbmRvd1RleHQob2Zmc2V0LCBjb21wYXJpc29uLnByaW9ycz8uW2luZGV4XSwgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFtjdXJyZW50LCAuLi5wcmlvcnNdXG4gICAgLmZpbHRlcigocGFydCkgPT4gISFwYXJ0KVxuICAgIC5qb2luKFdJTkRPV1NfU0VQQVJBVE9SKTtcbn1cblxuLy8gT25lIHByaW9yIGxhbmU6ICd2cyBwcmV2aW91cyBtb250aDogQXVnIDEg4oCTIDE1LCAyMDI2Jywgb3IgaXRzIGxhYmVsIGFsb25lXG4vLyB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgbm8gd2luZG93IGZvciBpdC5cbmZ1bmN0aW9uIHByaW9yV2luZG93VGV4dChcbiAgb2Zmc2V0OiBDb21wYXJpc29uT2Zmc2V0LFxuICBwcmlvcjogQ29tcGFyaXNvbldpbmRvdyB8IHVuZGVmaW5lZCxcbiAgdGltZXpvbmU6IHN0cmluZyxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBsYWJlbCA9IGNvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQpO1xuICBjb25zdCBkYXlzID0gcHJpb3IgPyBmb3JtYXREYXlXaW5kb3cocHJpb3IsIHRpbWV6b25lLCBsb2NhbGUpIDogJyc7XG5cbiAgcmV0dXJuIGRheXMgPyBgJHtsYWJlbH06ICR7ZGF5c31gIDogbGFiZWw7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmlzb25Ob3Rlcyhjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChjb21wYXJpc29uPy5ub3RlcyA/PyBbXSkubWFwKChjb2RlKSA9PiBjb21wYXJpc29uTm90ZVRleHQoY29kZSwgY29tcGFyaXNvbikpO1xufVxuXG4vLyBXaHkgYSBLUEkgY2FyZCdzIGRlbHRhIHJlYWRzIGFzIGl0IGRvZXMgKCdObyBiYXNlbGluZTogdGhlIHByZXZpb3VzIHBlcmlvZFxuLy8gaGFzIG5vIGRhdGEuJyksIG5hbWluZyB0aGUgYmFzZWxpbmUgYnkgd2hhdCB0aGUgZmlyc3QgbGFuZSBjb21wYXJlcyBhZ2FpbnN0LlxuZnVuY3Rpb24ga3BpTm90ZShcbiAga3BpOiBDb21wb25lbnRLcGkgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB7XG4gIHJldHVybiBrcGk/Lm5vdGUgPyBrcGlOb3RlVGV4dChrcGkubm90ZSwgY29tcGFyaXNvbj8ub2Zmc2V0cz8uWzBdPy5hZ2FpbnN0KSA6ICcnO1xufVxuXG4vLyBPbmUgbGluZSBwZXIgd2luZG93ZWQgdmFsdWUsIG5hbWVkIGJ5IGl0cyBjb2x1bW4gd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbC5cbmZ1bmN0aW9uIHdpbmRvd0Rlc2NyaXB0aW9ucyhkYXRhOiBDb21wb25lbnROb3RlRGF0YSwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdpbmRvd3MgPSBPYmplY3QuZW50cmllcyhkYXRhLndpbmRvd3MgPz8ge30pO1xuXG4gIHJldHVybiB3aW5kb3dzLm1hcCgoW2FsaWFzLCBtZXRhXSkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSB3aW5kb3dUZXh0KG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSk7XG5cbiAgICByZXR1cm4gd2luZG93cy5sZW5ndGggPiAxID8gYCR7YWxpYXN9OiAke3RleHR9YCA6IHRleHQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3aW5kb3dOb3RlcyhkYXRhOiBDb21wb25lbnROb3RlRGF0YSwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGRhdGEud2luZG93cyA/PyB7fSlcbiAgICAuZmxhdE1hcCgobWV0YSkgPT4gKG1ldGEubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gd2luZG93Tm90ZVRleHQoY29kZSwgbWV0YSwgbG9jYWxlLCBkYXRhLmdyYW51bGFyaXR5KSkpO1xufVxuXG4vLyBBIGNvbXBhcmVkIGNvbHVtbidzIHdpbmRvd3MuIEluIHJhbmdlIG1vZGUgZXZlcnkgcm93IGNvbXBhcmVzIHRoZSBzYW1lIHR3b1xuLy8gd2luZG93cywgc28gdGhleSBhcmUgbmFtZWQsIGFuZCByZWFkIG9uIG9uZSBkYXkgdGhlIGRheXMgdGhlIHZhbHVlcyBhcmVcbi8vIHJlYWQgb24gYXJlOyBvdmVyIGEgc2VyaWVzIG9yIGEgc3BpbmUgb2YgcGVyaW9kcyBlYWNoIHJvdyBjb21wYXJlcyBpdHMgb3duXG4vLyBwZXJpb2QsIHNvIG9ubHkgdGhlIGxhbmUgaXMuXG5mdW5jdGlvbiBjb21wYXJpc29uU2VudGVuY2UoXG4gIG91dHB1dDogT3V0cHV0TWV0YSxcbiAgY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgaWYgKCFvdXRwdXQucm9sZSB8fCAhY29tcGFyaXNvbikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IG9mZnNldCA9IGNvbXBhcmlzb24ub2Zmc2V0cz8uWyhvdXRwdXQub2Zmc2V0ID8/IDEpIC0gMV0gPz8gbnVsbDtcbiAgY29uc3QgY3VycmVudCA9IGNvbXBhcmlzb24uY3VycmVudCA/IGZvcm1hdERheVdpbmRvdyhjb21wYXJpc29uLmN1cnJlbnQsIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSkgOiAnJztcbiAgY29uc3QgcHJpb3JXaW5kb3cgPSBjb21wYXJpc29uLnByaW9ycz8uWyhvdXRwdXQub2Zmc2V0ID8/IDEpIC0gMV07XG4gIGNvbnN0IHByaW9yID0gcHJpb3JXaW5kb3cgPyBmb3JtYXREYXlXaW5kb3cocHJpb3JXaW5kb3csIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSkgOiAnJztcblxuICBpZiAoY29tcGFyaXNvbi5tb2RlID09PSAncmFuZ2UnICYmIGN1cnJlbnQgJiYgKG91dHB1dC5yb2xlID09PSAnY3VycmVudCcgfHwgcHJpb3IpKSB7XG4gICAgcmV0dXJuIHJhbmdlU2VudGVuY2Uob3V0cHV0LnJvbGUsIGN1cnJlbnQsIHByaW9yLCBvZmZzZXQpO1xuICB9XG5cbiAgaWYgKGlzUmVhZE9uT25lRGF5KGNvbXBhcmlzb24pICYmIGNvbXBhcmlzb24uY3VycmVudCAmJiBwcmlvcldpbmRvdykge1xuICAgIHJldHVybiByZWFkaW5nRGF5U2VudGVuY2Uob3V0cHV0LnJvbGUsIGNvbXBhcmlzb24uY3VycmVudCwgcHJpb3JXaW5kb3csIG9mZnNldCwgbG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQucm9sZSA9PT0gJ2N1cnJlbnQnIHx8ICFvZmZzZXQgPyAnJyA6IGAke1JPTEVfTEVBRFNbb3V0cHV0LnJvbGVdfSAke2NvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQpfS5gO1xufVxuXG5mdW5jdGlvbiByYW5nZVNlbnRlbmNlKHJvbGU6IE91dHB1dFJvbGUsIGN1cnJlbnQ6IHN0cmluZywgcHJpb3I6IHN0cmluZywgb2Zmc2V0OiBDb21wYXJpc29uT2Zmc2V0IHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocm9sZSkge1xuICAgIGNhc2UgJ2N1cnJlbnQnOlxuICAgICAgcmV0dXJuIGBWYWx1ZSBmb3IgJHtjdXJyZW50fS5gO1xuICAgIGNhc2UgJ3ByaW9yJzpcbiAgICAgIHJldHVybiBvZmZzZXQgPyBgUHJpb3IgdmFsdWUgZm9yICR7cHJpb3J9ICgke2NvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQpfSkuYCA6IGBQcmlvciB2YWx1ZSBmb3IgJHtwcmlvcn0uYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGAke1JPTEVfTEVBRFNbcm9sZV19IGZyb20gJHtwcmlvcn0gdG8gJHtjdXJyZW50fS5gO1xuICB9XG59XG5cbi8vIEEgY29sdW1uIG9mIGEgY29tcGFyaXNvbiByZWFkIG9uIG9uZSBkYXksIG5hbWVkIGJ5IHRoZSBkYXlzIGl0cyB2YWx1ZXMgYXJlXG4vLyByZWFkIG9uOiAnUHJpb3IgdmFsdWUgb24gQXVnIDMxLCAyMDI2ICh2cyBwcmV2aW91cyBtb250aCkuJ1xuZnVuY3Rpb24gcmVhZGluZ0RheVNlbnRlbmNlKFxuICByb2xlOiBPdXRwdXRSb2xlLFxuICBjdXJyZW50V2luZG93OiBDb21wYXJpc29uV2luZG93LFxuICBwcmlvcldpbmRvdzogQ29tcGFyaXNvbldpbmRvdyxcbiAgb2Zmc2V0OiBDb21wYXJpc29uT2Zmc2V0IHwgbnVsbCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBjdXJyZW50ID0gZm9ybWF0UmVhZGluZ0RheShjdXJyZW50V2luZG93LCBsb2NhbGUpO1xuICBjb25zdCBwcmlvciA9IGZvcm1hdFJlYWRpbmdEYXkocHJpb3JXaW5kb3csIGxvY2FsZSk7XG5cbiAgc3dpdGNoIChyb2xlKSB7XG4gICAgY2FzZSAnY3VycmVudCc6XG4gICAgICByZXR1cm4gYFZhbHVlICR7Y3VycmVudH0uYDtcbiAgICBjYXNlICdwcmlvcic6XG4gICAgICByZXR1cm4gb2Zmc2V0ID8gYFByaW9yIHZhbHVlICR7cHJpb3J9ICgke2NvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQpfSkuYCA6IGBQcmlvciB2YWx1ZSAke3ByaW9yfS5gO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYCR7Uk9MRV9MRUFEU1tyb2xlXX0gZnJvbSB0aGUgdmFsdWUgJHtwcmlvcn0gdG8gdGhlIHZhbHVlICR7Y3VycmVudH0uYDtcbiAgfVxufVxuXG4vLyAnUmFuayBieSBSZXZlbnVlLCAxIGJlaW5nIHRoZSBsYXJnZXN0LCB3aXRoaW4gZWFjaCBSZWdpb24uIFRpZWQgdmFsdWVzIHNoYXJlXG4vLyBhIHJhbmsgKDEsIDEsIDMpLicgQSBtZWFzdXJlIHdyaXR0ZW4gYXMgaXRzIG93biByYW5rIHJhbmtzIGJ5IHRoZSB2YWx1ZSBpdFxuLy8gd291bGQgb3RoZXJ3aXNlIHNob3csIHNvIGl0IG5hbWVzIG5vIG90aGVyIG1lYXN1cmUgKCdSYW5rLCAxIGJlaW5nIHRoZVxuLy8gbGFyZ2VzdCwgYWNyb3NzIGFsbCByb3dzLicpLlxuZnVuY3Rpb24gcmFua1NlbnRlbmNlKG91dHB1dDogT3V0cHV0TWV0YSwgb3V0cHV0czogUmVjb3JkPHN0cmluZywgT3V0cHV0TWV0YT4gfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3QgcmFuayA9IG91dHB1dC5raW5kID09PSAncmFuaycgPyBvdXRwdXQucmFuayA6IG51bGw7XG5cbiAgaWYgKCFyYW5rKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZW5kID0gcmFuay5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ3NtYWxsZXN0JyA6ICdsYXJnZXN0JztcbiAgY29uc3Qgc2NvcGUgPSByYW5rLndpdGhpbj8ubGVuZ3RoID8gYHdpdGhpbiBlYWNoICR7am9pbk5hbWVzKHJhbmsud2l0aGluKX1gIDogJ2Fjcm9zcyBhbGwgcm93cyc7XG4gIGNvbnN0IHRpZXMgPSByYW5rLm1ldGhvZCA9PT0gJ2RlbnNlJyA/ICcxLCAxLCAyJyA6ICcxLCAxLCAzJztcbiAgY29uc3QgYnkgPSBpc093bk91dHB1dChvdXRwdXQsIG91dHB1dHMpID8gJycgOiBgIGJ5ICR7b3V0cHV0Lm1lYXN1cmV9YDtcblxuICByZXR1cm4gYFJhbmske2J5fSwgMSBiZWluZyB0aGUgJHtlbmR9LCAke3Njb3BlfS4gVGllZCB2YWx1ZXMgc2hhcmUgYSByYW5rICgke3RpZXN9KS4gYFxuICAgICsgRklMVEVSRURfUk9XU19TRU5URU5DRTtcbn1cblxuLy8gJ1NoYXJlIG9mIHRoZSB0b3RhbCBSZXZlbnVlIHdpdGhpbiBlYWNoIFJlZ2lvbi4nIEEgbWVhc3VyZSB3cml0dGVuIGFzIGl0c1xuLy8gb3duIHNoYXJlIG5hbWVzIG5vIG90aGVyIG1lYXN1cmUgKCdTaGFyZSBvZiB0aGUgdG90YWwgd2l0aGluIGVhY2hcbi8vIFJlZ2lvbi4nLCAnU2hhcmUgb2YgdGhlIHRvdGFsIGFjcm9zcyBhbGwgcm93cy4nKS5cbmZ1bmN0aW9uIHNoYXJlU2VudGVuY2Uob3V0cHV0OiBPdXRwdXRNZXRhLCBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBPdXRwdXRNZXRhPiB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBzaGFyZSA9IG91dHB1dC5raW5kID09PSAnc2hhcmUnID8gb3V0cHV0LnNoYXJlIDogbnVsbDtcblxuICBpZiAoIXNoYXJlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGlzT3duT3V0cHV0KG91dHB1dCwgb3V0cHV0cykpIHtcbiAgICBjb25zdCBzY29wZSA9IHNoYXJlLndpdGhpbj8ubGVuZ3RoID8gYHdpdGhpbiBlYWNoICR7am9pbk5hbWVzKHNoYXJlLndpdGhpbil9YCA6ICdhY3Jvc3MgYWxsIHJvd3MnO1xuXG4gICAgcmV0dXJuIGBTaGFyZSBvZiB0aGUgdG90YWwgJHtzY29wZX0uICR7RklMVEVSRURfUk9XU19TRU5URU5DRX1gO1xuICB9XG5cbiAgY29uc3Qgc2NvcGUgPSBzaGFyZS53aXRoaW4/Lmxlbmd0aCA/IGAgd2l0aGluIGVhY2ggJHtqb2luTmFtZXMoc2hhcmUud2l0aGluKX1gIDogJyc7XG5cbiAgcmV0dXJuIGBTaGFyZSBvZiB0aGUgdG90YWwgJHtvdXRwdXQubWVhc3VyZX0ke3Njb3BlfS4gJHtGSUxURVJFRF9ST1dTX1NFTlRFTkNFfWA7XG59XG5cbi8vIFdoZXRoZXIgYSByYW5rIG9yIGEgc2hhcmUgaXMgaXRzIG1lYXN1cmUncyBvd24gb3V0cHV0OiB0aGUgc2VydmVyIHdyaXRlcyBhXG4vLyBtZWFzdXJlIHdpdGggYSByYW5rIG9yIGEgc2hhcmUgYXMgdGhhdCByYW5rIG9yIHNoYXJlLCBzbyBpdHMgbWVhc3VyZSBpcyBhXG4vLyBjb2x1bW4gb2YgdGhlIHNhbWUga2luZCAoaXRzZWxmLCBvciBmb3IgYSBwcmlvciBvciBhIGNoYW5nZSB0aGUgY3VycmVudFxuLy8gY29sdW1uKSwgbmV2ZXIgYSB2YWx1ZSBvZiBpdHMgb3duIHRvIG5hbWUuXG5mdW5jdGlvbiBpc093bk91dHB1dChvdXRwdXQ6IE91dHB1dE1ldGEsIG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIE91dHB1dE1ldGE+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3V0cHV0cz8uW291dHB1dC5tZWFzdXJlXT8ua2luZCA9PT0gb3V0cHV0LmtpbmQ7XG59XG5cbi8vIEEgd2luZG93ZWQgY29sdW1uOiB3aGF0IGl0IGlzLCB0aGVuIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLlxuZnVuY3Rpb24gd2luZG93U2VudGVuY2VzKFxuICBtZXRhOiBXaW5kb3dNZXRhIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsXG4pOiBzdHJpbmcge1xuICBpZiAoIW1ldGEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBub3RlcyA9IChtZXRhLm5vdGVzID8/IFtdKS5tYXAoKGNvZGUpID0+IHdpbmRvd05vdGVUZXh0KGNvZGUsIG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSkpO1xuXG4gIHJldHVybiBbYCR7d2luZG93VGV4dChtZXRhLCBsb2NhbGUsIGRhdGEuZ3JhbnVsYXJpdHkpfS5gLCAuLi5ub3Rlc10uam9pbignICcpO1xufVxuXG4vLyAnUmVnaW9uJywgJ1JlZ2lvbiBhbmQgQ2hhbm5lbCcsICdSZWdpb24sIENoYW5uZWwgYW5kIFBsYW4nLlxuZnVuY3Rpb24gam9pbk5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lcy5sZW5ndGggPiAxXG4gICAgPyBgJHtuYW1lcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bmFtZXNbbmFtZXMubGVuZ3RoIC0gMV19YFxuICAgIDogbmFtZXMuam9pbignJyk7XG59XG4iXX0=