@firestitch/report 18.6.1 → 18.8.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 (97) hide show
  1. package/app/reports/components/component-chart/component-chart.component.d.ts +6 -7
  2. package/app/reports/components/component-kpi/component-kpi.component.d.ts +17 -9
  3. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  4. package/app/reports/components/component-list/component-list.component.d.ts +39 -10
  5. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  6. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -10
  7. package/app/reports/components/report-component/report-component.component.d.ts +5 -12
  8. package/app/reports/data/report.data.d.ts +2 -3
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  10. package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
  11. package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
  12. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -2
  13. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  14. package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
  15. package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
  16. package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
  17. package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
  18. package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
  19. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  20. package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
  21. package/app/reports/enums/report-number-units.enum.d.ts +6 -0
  22. package/app/reports/enums/report-value-format.enum.d.ts +5 -0
  23. package/app/reports/export/offscreen-chart.d.ts +2 -2
  24. package/app/reports/export/report-export-collector.service.d.ts +37 -8
  25. package/app/reports/export/report-pdf.service.d.ts +6 -0
  26. package/app/reports/export/report-pptx.service.d.ts +24 -0
  27. package/app/reports/format.d.ts +64 -3
  28. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  29. package/app/reports/interfaces/report.interface.d.ts +205 -14
  30. package/app/reports/kpi-card.d.ts +48 -0
  31. package/app/reports/layout.d.ts +0 -9
  32. package/app/reports/list-config.d.ts +16 -0
  33. package/app/reports/option-builder.d.ts +76 -9
  34. package/app/reports/output-notes.d.ts +14 -0
  35. package/app/reports/pipes/report-date.pipe.d.ts +2 -1
  36. package/app/reports/pipes/report-number.pipe.d.ts +8 -0
  37. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  38. package/app/reports/report-filter-items.d.ts +5 -2
  39. package/app/reports/report-url-state.d.ts +4 -0
  40. package/app/reports/services/report-filter-state.service.d.ts +27 -2
  41. package/app/reports/theme/palette.d.ts +6 -0
  42. package/app/reports/theme/typography.d.ts +2 -0
  43. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +23 -20
  44. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +56 -29
  45. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  46. package/esm2022/app/reports/components/component-list/component-list.component.mjs +218 -32
  47. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  48. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -61
  49. package/esm2022/app/reports/components/report-component/report-component.component.mjs +99 -100
  50. package/esm2022/app/reports/data/report.data.mjs +20 -7
  51. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  52. package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
  53. package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
  54. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +138 -20
  55. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  56. package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
  57. package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
  58. package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
  59. package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
  60. package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
  61. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  62. package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
  63. package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
  64. package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
  65. package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
  66. package/esm2022/app/reports/export/report-export-collector.service.mjs +186 -40
  67. package/esm2022/app/reports/export/report-pdf.service.mjs +332 -67
  68. package/esm2022/app/reports/export/report-pptx.service.mjs +765 -106
  69. package/esm2022/app/reports/format.mjs +917 -57
  70. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  71. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  72. package/esm2022/app/reports/kpi-card.mjs +174 -0
  73. package/esm2022/app/reports/layout.mjs +1 -46
  74. package/esm2022/app/reports/list-config.mjs +106 -0
  75. package/esm2022/app/reports/option-builder.mjs +1457 -117
  76. package/esm2022/app/reports/output-notes.mjs +158 -0
  77. package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
  78. package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
  79. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  80. package/esm2022/app/reports/report-filter-items.mjs +28 -3
  81. package/esm2022/app/reports/report-url-state.mjs +56 -15
  82. package/esm2022/app/reports/services/report-filter-state.service.mjs +274 -22
  83. package/esm2022/app/reports/theme/echarts.mjs +8 -2
  84. package/esm2022/app/reports/theme/palette.mjs +35 -1
  85. package/esm2022/app/reports/theme/typography.mjs +8 -1
  86. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  87. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  88. package/esm2022/public_api.mjs +10 -1
  89. package/fesm2022/{firestitch-report-echarts-Djtmaxj1.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +9 -3
  90. package/fesm2022/firestitch-report-echarts-qCBE3LqM.mjs.map +1 -0
  91. package/fesm2022/{firestitch-report-firestitch-report-D3zseBZc.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +5523 -875
  92. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  93. package/fesm2022/firestitch-report.mjs +1 -1
  94. package/package.json +1 -1
  95. package/public_api.d.ts +9 -0
  96. package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +0 -1
  97. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +0 -1
@@ -1,11 +1,13 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
- import { format } from 'date-fns';
3
2
  import { forkJoin, from, map, of } from 'rxjs';
4
3
  import { catchError, mergeMap, toArray } from 'rxjs/operators';
5
4
  import { ReportData } from '../data/report.data';
6
- import { formatReportDate, getZonedNow, resolveReportTimezone } from '../format';
5
+ import { ReportListColumnFormat } from '../enums/report-list-column-format.enum';
6
+ import { DAY_LONG, formatLocalDate, formatNumber, formatOutputValue, formatReportDate, hasNumberFormat, resolveReportTimezone, } from '../format';
7
7
  import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
8
- import { pivotHeadings } from '../option-builder';
8
+ import { LIST_TOTAL_LABEL, listHiddenColumns, listOutputColumns, listTotalsLabelColumn, } from '../list-config';
9
+ import { pivotColumnSpecs } from '../option-builder';
10
+ import { componentNoteLines, componentWindowsLine } from '../output-notes';
9
11
  import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
10
12
  import { ReportFilterStateService } from '../services/report-filter-state.service';
11
13
  import * as i0 from "@angular/core";
@@ -31,52 +33,176 @@ const EXPORT_CONCURRENCY = 3;
31
33
  export function emptyLabel(item) {
32
34
  return item.data ? 'No data' : 'Could not be generated';
33
35
  }
36
+ // A component's title as an exported file prints it. A searched list says so,
37
+ // since its table holds only the matching rows: 'Orders (matching "north")'.
38
+ // An untitled one reads 'Matching "north"'. '' when there is nothing to print.
39
+ // Shared by the PDF and the deck, continuation pages included.
40
+ export function exportTitle(component, search) {
41
+ const title = component.title ?? '';
42
+ if (!search) {
43
+ return title;
44
+ }
45
+ return title ? `${title} (matching "${search}")` : `Matching "${search}"`;
46
+ }
34
47
  // Whether a tile's query failed. A text block has no query, so it never did.
35
48
  export function isFailed(item) {
36
49
  return !item.data && item.component.type !== 'text';
37
50
  }
38
51
  // The lines under the report's name on the PDF title page and the title slide:
39
52
  // the export date, the active filters, then what the numbers are measured in.
40
- // The date is today in the report's zone, the same day its filters resolve
41
- // "today" to.
53
+ // The date always leads (the PowerPoint marks that line as written in the
54
+ // report's locale). It is today in the report's zone, the same day its filters
55
+ // resolve "today" to, written in the report's locale.
42
56
  export function coverLines(collected) {
43
57
  return [
44
- format(getZonedNow(resolveReportTimezone(collected.report)), 'MMMM d, yyyy'),
58
+ formatLocalDate(new Date(), collected.formatContext.locale, DAY_LONG, resolveReportTimezone(collected.report)),
45
59
  ...collected.filterSummary,
46
60
  ...collected.contextLines,
47
61
  ];
48
62
  }
49
- // An exported list cell, reading like the on-screen cell: the SQL already
50
- // carries the formatting, so the value goes out verbatim. A date column is the
51
- // one value the browser renders, and it renders through the same function as
52
- // the screen, in the report's zone.
53
- export function exportCell(value, columnFormat, timezone) {
63
+ // An exported list cell, reading like the on-screen cell, through the same
64
+ // functions as the screen: a date column renders in the report's zone and
65
+ // locale, and a column with number-format keys (a cross-tab's cells through
66
+ // its cellFormat) in the report's locale and currency. Any other value goes
67
+ // out verbatim, and an empty one as ''. CSV never comes through here: its
68
+ // values stay raw.
69
+ //
70
+ // An output column is written by what it holds, as the screen's cell is
71
+ // (formatOutputValue): a signed change, a percent change, a change of a rate
72
+ // in points, a rank, a share. Its row gives a change the prior beside it, so
73
+ // a missing baseline ('—') reads apart from a zero one ('n/a').
74
+ export function exportCell(value, column, timezone, context, row) {
75
+ const output = column.output;
76
+ if (output) {
77
+ return formatOutputValue(value, output.output, column, context, {
78
+ measureSpec: output.measureSpec,
79
+ prior: output.priorAlias && row ? row[output.priorAlias] : undefined,
80
+ floor: output.floor,
81
+ empty: '',
82
+ }).text;
83
+ }
54
84
  if (value === null || value === undefined) {
55
85
  return '';
56
86
  }
57
- return columnFormat === 'date' ? formatReportDate(value, timezone) : String(value);
58
- }
59
- // The columns an exported list table draws. A cross-tab's columns arrive with
60
- // its rows (the row key first, then one per pivot value), since only the
61
- // result knows the pivot values; a plain list draws its configured columns,
62
- // else every column the query returned.
63
- export function listColumns(component, data) {
64
- const config = (component.config ?? {});
65
- if (!config.pivotBy?.column && config.columns?.length) {
66
- return config.columns;
87
+ if (column.format === ReportListColumnFormat.Date) {
88
+ return formatReportDate(value, timezone, context.locale);
67
89
  }
68
- return data.columns.map((column) => ({ column }));
90
+ return hasNumberFormat(column) ? formatNumber(value, column, context, { empty: '' }) : String(value);
69
91
  }
70
- // The heading over each column of listColumns(). A cross-tab is headed as on
71
- // screen, by pivotHeadings(), so its time-pivot headings are formatted periods
72
- // rather than raw period-starts; a plain list's columns keep their configured
73
- // labels.
74
- export function listHeadings(component, data) {
92
+ // The columns an exported list table draws. A cross-tab's arrive with its
93
+ // rows (the row key first, then one per pivot value), since only the result
94
+ // knows the pivot values, and are built by pivotColumnSpecs() as on screen:
95
+ // headed by its periods in the report's locale, each pivot value formatted by
96
+ // cellFormat. A plain list draws its configured columns but the ones the
97
+ // viewer hid (`hidden`, kept to listHiddenColumns, so never all of them),
98
+ // else every column the query returned, as it came. Output columns (the
99
+ // data's outputs, a cross-tab cell through cellMeasures) carry how they are
100
+ // written; without those keys the columns are exactly as before.
101
+ export function listColumns(component, data, locale, hidden = []) {
75
102
  const config = (component.config ?? {});
76
103
  if (config.pivotBy?.column) {
77
- return pivotHeadings(config, data);
104
+ return withOutputColumns(pivotColumnSpecs(config, data, locale), data, []);
105
+ }
106
+ if (config.columns?.length) {
107
+ const hiddenNames = listHiddenColumns(config, hidden);
108
+ return withOutputColumns(config.columns
109
+ .filter((column) => !hiddenNames.includes(column.column))
110
+ .map((column) => ({ ...column, numeric: hasNumberFormat(column) })), data, config.columns);
111
+ }
112
+ return withOutputColumns(data.columns.map((column) => ({ column, numeric: false })), data, []);
113
+ }
114
+ // The columns with their output metadata attached (listOutputColumns, as the
115
+ // screen's list resolves it): an output column holds numbers and is written
116
+ // by what it holds. Unchanged when the data has no outputs.
117
+ function withOutputColumns(columns, data, authored) {
118
+ if (!data.outputs) {
119
+ return columns;
120
+ }
121
+ const outputs = listOutputColumns(columns, data, authored);
122
+ return columns.map((column) => (outputs[column.column]
123
+ ? { ...column, numeric: true, output: outputs[column.column] }
124
+ : column));
125
+ }
126
+ // The heading over each column of listColumns(): a plain list's configured
127
+ // label, else its column; a cross-tab's heading from pivotColumnSpecs().
128
+ export function listHeadings(component, data, locale, hidden = []) {
129
+ return listColumns(component, data, locale, hidden).map((column) => column.label || column.column);
130
+ }
131
+ // An exported list's totals row, one cell per column of listColumns(): each
132
+ // total written like its column's cells, and LIST_TOTAL_LABEL in the first
133
+ // column when that column holds no total (a cross-tab's row key). null when
134
+ // the list has no totals. The CSV never carries one: its rows stay raw.
135
+ export function listTotalsRow(data, columns, timezone, context) {
136
+ const totals = data.totals;
137
+ if (!totals) {
138
+ return null;
78
139
  }
79
- return listColumns(component, data).map((column) => column.label || column.column);
140
+ const label = listTotalsLabelColumn(columns, totals);
141
+ return columns.map((column) => (column.column === label
142
+ ? LIST_TOTAL_LABEL
143
+ : exportCell(totals[column.column], column, timezone, context, totals)));
144
+ }
145
+ // The subtitle under a chart's or a list's title: the days it reads, and the
146
+ // days each comparison lane reads ('Sep 1 – 15, 2026 · vs previous month:
147
+ // Aug 1 – 15, 2026'), as the screen's note opens with. '' without a
148
+ // comparison or a timeframe, and for a KPI, whose card prints its own window
149
+ // line.
150
+ export function exportWindowsLine(item, timezone, locale) {
151
+ if (!item.data || item.component.type === 'kpi') {
152
+ return '';
153
+ }
154
+ return componentWindowsLine(item.data, { locale, timezone });
155
+ }
156
+ // The note lines under a component's box: why a comparison reads as it does,
157
+ // a KPI's delta note, and what each windowed value is and why. The days are
158
+ // left out (the subtitle or the KPI card prints them), and the window
159
+ // descriptions are in, since a file has no tooltip or header to carry them.
160
+ // Empty when the data has none of the keys.
161
+ export function exportNoteLines(item, timezone, locale) {
162
+ return componentNoteLines(item.data, { locale, timezone }, { windows: false, windowDescriptions: true });
163
+ }
164
+ // Whether a KPI card has more to draw than its value and label. Without, both
165
+ // exports draw the tile exactly as they always have.
166
+ export function kpiCardHasExtras(view, notes) {
167
+ return !!(view.delta || view.window || view.target || view.sparkline || notes.length);
168
+ }
169
+ // Which parts of a KPI card fit a tile `available` tall. A short tile sheds the
170
+ // sparkline first, then the target line, then the notes; the value, its label
171
+ // and the delta row always stay, and the window line stays whenever the card
172
+ // shows a comparison (its days are what the delta is measured over). The
173
+ // sparkline needs values to draw.
174
+ export function kpiExportParts(view, notes, available, heights) {
175
+ const parts = {
176
+ delta: !!view.delta,
177
+ window: !!view.window,
178
+ target: !!view.target,
179
+ sparkline: !!view.sparkline?.values.some((value) => value !== null),
180
+ notes: [...notes],
181
+ };
182
+ const height = () => kpiExportHeight(view, parts, heights);
183
+ if (height() > available) {
184
+ parts.sparkline = false;
185
+ }
186
+ if (height() > available) {
187
+ parts.target = false;
188
+ }
189
+ while (height() > available && parts.notes.length) {
190
+ parts.notes.pop();
191
+ }
192
+ if (height() > available && !parts.delta) {
193
+ parts.window = false;
194
+ }
195
+ return parts;
196
+ }
197
+ // How tall the card's drawn parts stand together, in the heights' unit.
198
+ export function kpiExportHeight(view, parts, heights) {
199
+ return heights.value
200
+ + (view.label ? heights.label : 0)
201
+ + (parts.delta ? heights.delta : 0)
202
+ + (parts.window ? heights.window : 0)
203
+ + (parts.target ? heights.target : 0)
204
+ + (parts.sparkline ? heights.sparkline : 0)
205
+ + parts.notes.length * heights.note;
80
206
  }
81
207
  // The last row of an exported list table that stops short of its result: how
82
208
  // many rows the file leaves out and where the whole set can be had. Each
@@ -143,13 +269,16 @@ export class ReportExportCollectorService {
143
269
  pages,
144
270
  filterSummary,
145
271
  contextLines: this._contextLines(report),
272
+ formatContext: this._filterState.formatContext(),
146
273
  };
147
274
  }));
148
275
  }
149
276
  // "Report Period: Jun 12, 2025 – Jun 12, 2026", "Region: North, East" — one
150
277
  // line per filter group that has an active session value, then the group-by
151
278
  // line. The filter bar as the viewer reads it: the PDF and PowerPoint covers
152
- // print it, and the report zip export sends it for its notes file.
279
+ // print it, and the report zip export sends it for its notes file. Dates are
280
+ // written in the report's locale, so the notes name the period as the cover
281
+ // does.
153
282
  //
154
283
  // A select group stores ids, so its line has to be named off the option list
155
284
  // before it can be printed; a date or keyword group already holds its own
@@ -185,32 +314,49 @@ export class ReportExportCollectorService {
185
314
  }
186
315
  _componentData(report, component, listRows) {
187
316
  if (component.type === 'text') {
188
- return of({ component, data: null });
317
+ return of({ component, data: null, hiddenColumns: [] });
189
318
  }
190
319
  const filters = this._filterState.resolveForComponent(component);
191
320
  // A time-series chart carries the viewer's group-by grain so the export
192
321
  // re-buckets exactly as the screen does; lists carry their export paging
193
- // and the viewer's header sort, so the table reads in the screen's order.
322
+ // and the viewer's header sort and search, so the table reads in the
323
+ // screen's order and holds the screen's rows.
194
324
  //
195
325
  // The time-series check deliberately mirrors the server's canonical
196
326
  // ReportQueryRunner::_isTimeSeriesChart, so a product pinned to an older
197
327
  // framework does not re-bucket a non-time chart.
198
328
  const frequency = this._filterState.frequency();
199
329
  const isTimeSeries = component.type === 'chart' && component.config?.xAxis?.kind === 'time';
330
+ const search = component.type === 'list'
331
+ ? this._filterState.listSearch(component.id) ?? undefined
332
+ : undefined;
200
333
  const state = component.type === 'list'
201
- ? { page: 1, pageSize: listRows, sort: this._filterState.listSort(component.id) ?? undefined }
334
+ ? { page: 1, pageSize: listRows, sort: this._filterState.listSort(component.id) ?? undefined, search }
202
335
  : (isTimeSeries && frequency ? { frequency } : {});
336
+ // The table leaves out the columns the viewer hid. The rows are fetched
337
+ // whole, as the screen fetches them, and the renderers drop the cells.
338
+ const hiddenColumns = [...this._filterState.hiddenColumns(component.id)];
203
339
  // handlers: false keeps the app's global error dialog out of this. A failed
204
340
  // tile is reported once, by the export gate, naming the pages it cost —
205
341
  // never as ten stacked modals carrying the database's own wording.
342
+ //
343
+ // A search the server could not apply (searchNote: the list has no text
344
+ // column) narrowed nothing, so the item does not carry it.
206
345
  return this._reportData.componentData(report.id, component.id, filters, state, true, { handlers: false })
207
- .pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
346
+ .pipe(map((data) => (search && !data?.searchNote
347
+ ? { component, data, search, hiddenColumns }
348
+ : { component, data, hiddenColumns })), catchError(() => of({ component, data: null, hiddenColumns })));
208
349
  }
209
- // The zone the server resolved, as its IANA id. Only the server's value is
210
- // printed: the browser's zone (resolveReportTimezone's fallback for an older
211
- // server) is not what the numbers were measured in.
350
+ // The zone the server resolved, as its IANA id, and the currency it says
351
+ // the report's money is in (a label: nothing is converted). Only the
352
+ // server's values are printed: the browser's zone (resolveReportTimezone's
353
+ // fallback for an older server) is not what the numbers were measured in,
354
+ // and an older server names no currency at all.
212
355
  _contextLines(report) {
213
- return report.effectiveTimezone ? [`Timezone: ${report.effectiveTimezone}`] : [];
356
+ return [
357
+ ...(report.effectiveTimezone ? [`Timezone: ${report.effectiveTimezone}`] : []),
358
+ ...(report.effectiveCurrency ? [`Currency: ${report.effectiveCurrency}`] : []),
359
+ ];
214
360
  }
215
361
  // One select group's line, with its stored ids resolved to the same names the
216
362
  // on-screen chips show — a cover reading "Organization: 8774, 8777" tells the
@@ -228,7 +374,7 @@ export class ReportExportCollectorService {
228
374
  // Rendered off the same calendar day the filter sends to the server, so the
229
375
  // cover's period is the period the numbers behind it were queried for.
230
376
  _date(value) {
231
- return dateBoundLabel(value) ?? '…';
377
+ return dateBoundLabel(value, this._filterState.formatContext().locale) ?? '…';
232
378
  }
233
379
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
234
380
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService });
@@ -236,4 +382,4 @@ export class ReportExportCollectorService {
236
382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
237
383
  type: Injectable
238
384
  }] });
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBYyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakYsT0FBTyxFQUdMLG1CQUFtQixHQU1wQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7O0FBaUNuRixnREFBZ0Q7QUFDaEQsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IscUVBQXFFO0FBQ3JFLEVBQUU7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QUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUM5RSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNOLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQy9ELEtBQUssQ0FBQyxLQUF1QztRQUNuRCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDdEMsQ0FBQzt3R0FsS1UsNEJBQTRCOzRHQUE1Qiw0QkFBNEI7OzRGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1lcmdlTWFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBmb3JtYXRSZXBvcnREYXRlLCBnZXRab25lZE5vdywgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcGl2b3RIZWFkaW5ncyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSB0aGVcbiAgLy8gc2VydmVyIHJlc29sdmVkIGZvciB0aGUgcmVwb3J0LiBFbXB0eSB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBvbmUsXG4gIC8vIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlciB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xufVxuXG4vLyBPbmUgZXhwb3J0ZWQgbGlzdCBjb2x1bW46IHRoZSBjZWxsIGtleSBhbmQgaG93IGl0IGlzIHNob3duLlxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRMaXN0Q29sdW1uIHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG59XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVycyByZXNvbHZlXG4vLyBcInRvZGF5XCIgdG8uXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXQoZ2V0Wm9uZWROb3cocmVzb2x2ZVJlcG9ydFRpbWV6b25lKGNvbGxlY3RlZC5yZXBvcnQpKSwgJ01NTU0gZCwgeXl5eScpLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbDogdGhlIFNRTCBhbHJlYWR5XG4vLyBjYXJyaWVzIHRoZSBmb3JtYXR0aW5nLCBzbyB0aGUgdmFsdWUgZ29lcyBvdXQgdmVyYmF0aW0uIEEgZGF0ZSBjb2x1bW4gaXMgdGhlXG4vLyBvbmUgdmFsdWUgdGhlIGJyb3dzZXIgcmVuZGVycywgYW5kIGl0IHJlbmRlcnMgdGhyb3VnaCB0aGUgc2FtZSBmdW5jdGlvbiBhc1xuLy8gdGhlIHNjcmVlbiwgaW4gdGhlIHJlcG9ydCdzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Q2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRpbWV6b25lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJyA/IGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIHRpbWV6b25lKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucyBhcnJpdmUgd2l0aFxuLy8gaXRzIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZVxuLy8gcmVzdWx0IGtub3dzIHRoZSBwaXZvdCB2YWx1ZXM7IGEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zLFxuLy8gZWxzZSBldmVyeSBjb2x1bW4gdGhlIHF1ZXJ5IHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RDb2x1bW5zKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKCFjb25maWcucGl2b3RCeT8uY29sdW1uICYmIGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4gfSkpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCkuIEEgY3Jvc3MtdGFiIGlzIGhlYWRlZCBhcyBvblxuLy8gc2NyZWVuLCBieSBwaXZvdEhlYWRpbmdzKCksIHNvIGl0cyB0aW1lLXBpdm90IGhlYWRpbmdzIGFyZSBmb3JtYXR0ZWQgcGVyaW9kc1xuLy8gcmF0aGVyIHRoYW4gcmF3IHBlcmlvZC1zdGFydHM7IGEgcGxhaW4gbGlzdCdzIGNvbHVtbnMga2VlcCB0aGVpciBjb25maWd1cmVkXG4vLyBsYWJlbHMuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcblxuICBpZiAoY29uZmlnLnBpdm90Qnk/LmNvbHVtbikge1xuICAgIHJldHVybiBwaXZvdEhlYWRpbmdzKGNvbmZpZywgZGF0YSk7XG4gIH1cblxuICByZXR1cm4gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4pO1xufVxuXG4vLyBUaGUgbGFzdCByb3cgb2YgYW4gZXhwb3J0ZWQgbGlzdCB0YWJsZSB0aGF0IHN0b3BzIHNob3J0IG9mIGl0cyByZXN1bHQ6IGhvd1xuLy8gbWFueSByb3dzIHRoZSBmaWxlIGxlYXZlcyBvdXQgYW5kIHdoZXJlIHRoZSB3aG9sZSBzZXQgY2FuIGJlIGhhZC4gRWFjaFxuLy8gZm9ybWF0IGZldGNoZXMgaXRzIG93biBudW1iZXIgb2Ygcm93cyAoUERGX0xJU1RfUk9XUywgUFBUWF9MSVNUX1JPV1MpLCBhbmRcbi8vIGJvdGggbmFtZSB3aGF0IGlzIGxlZnQgd2l0aCB0aGlzIG9uZSBzZW50ZW5jZS5cbmV4cG9ydCBmdW5jdGlvbiBtb3JlUm93c05vdGljZShyZW1haW5pbmc6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBg4oCmICR7cmVtYWluaW5nfSBtb3JlIHJvdyhzKSDigJQgdXNlIHRoZSBjb21wb25lbnQncyBDU1YgZXhwb3J0IGZvciB0aGUgZnVsbCBkYXRhc2V0YDtcbn1cblxuLy8gVGhlIHBhZ2VzIG9mIGEgY29sbGVjdGVkIHJlcG9ydCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIHRpbGUgd2hvc2UgcXVlcnlcbi8vIGZhaWxlZCDigJQgd2hhdCB0aGUgZXhwb3J0IGdhdGUgbmFtZXMgdG8gdGhlIHVzZXIsIGFuZCB3aGF0IG1ha2VzIFwic29tZSBvZiB0aGlzXG4vLyBmaWxlIGlzIG1pc3NpbmdcIiBhIGZhY3QgdGhlIGNhbGxlciBjYW4gYWN0IG9uIHJhdGhlciB0aGFuIGEgdGhpbmcgdGhleSBub3RpY2Vcbi8vIGluIHRoZSBQREYgYWZ0ZXJ3YXJkcy5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsZWRQYWdlTmFtZXMoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBzdHJpbmdbXSB7XG4gIC8vIE51bWJlcmVkIGJlZm9yZSB0aGUgZmlsdGVyIOKAlCBhbiB1bm5hbWVkIHBhZ2UgNCB0aGF0IGZhaWxlZCBoYXMgdG8gcmVhZFxuICAvLyBcIlBhZ2UgNFwiLCBub3QgXCJQYWdlIDFcIiBiZWNhdXNlIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBmaXJzdCBmYWlsdXJlLlxuICByZXR1cm4gY29sbGVjdGVkLnBhZ2VzXG4gICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIG51bWJlcjogaW5kZXggKyAxIH0pKVxuICAgIC5maWx0ZXIoKHsgcGFnZSB9KSA9PiBwYWdlLmNvbXBvbmVudHMuc29tZShpc0ZhaWxlZCkpXG4gICAgLm1hcCgoeyBwYWdlLCBudW1iZXIgfSkgPT4gcGFnZS5wYWdlLm5hbWUgfHwgYFBhZ2UgJHtudW1iZXJ9YCk7XG59XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlXG4vLyBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdCBpcyBzbyB0aGUgY2FsbGVyIGNhbiBSRVBPUlQgd2hhdCBmYWlsZWQsIG5vdCBzbyBpdCBjYW5cbi8vIGJlIGlnbm9yZWQ6IHNlZSBmYWlsZWRQYWdlTmFtZXMoKSBhbmQgdGhlIGV4cG9ydCBnYXRlIHRoYXQgdXNlcyBpdC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gIC8vIGxpc3RSb3dzIGlzIGhvdyBtYW55IHJvd3MgZWFjaCBsaXN0IGZldGNoZXM6IHRoZSByZW5kZXJlcidzIG93biBjYXAsIHNpbmNlXG4gIC8vIGEgUERGIHRhYmxlIGNvbnRpbnVlcyBvbnRvIGV4dHJhIHBhZ2VzIGFuZCBhIHNsaWRlIHRhYmxlIGNhbm5vdC5cbiAgcHVibGljIGNvbGxlY3QocmVwb3J0OiBSZXBvcnQsIGxpc3RSb3dzOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbGxlY3RlZFJlcG9ydD4ge1xuICAgIGNvbnN0IHNsb3RzOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCB9W10gPSBbXTtcblxuICAgIHJlcG9ydC5wYWdlcy5mb3JFYWNoKChwYWdlLCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHBhZ2UuY29tcG9uZW50cykge1xuICAgICAgICBzbG90cy5wdXNoKHsgcGFnZUluZGV4LCBjb21wb25lbnQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUZXh0IGJsb2NrcyBoYXZlIG5vdGhpbmcgdG8gZmV0Y2gg4oCUIHRoZXkgcmlkZSB0aHJvdWdoIHdpdGggbm8gZGF0YS4gVGhlXG4gICAgLy8gaGVhZGVyL2Zvb3RlciAocmVwb3J0Lm1hc3RlcikgaXMgcmVhZCBieSB0aGUgcmVuZGVyZXJzIHN0cmFpZ2h0IG9mZiB0aGVcbiAgICAvLyByZXBvcnQgZm9yIHRoZSBzYW1lIHJlYXNvbi5cblxuICAgIC8vIFJlbGVhc2VkIGEgZmV3IGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbGwgYXQgb25jZS4gbWVyZ2VNYXAgY29tcGxldGVzIG91dFxuICAgIC8vIG9mIG9yZGVyLCBzbyBlYWNoIHJlc3VsdCBjYXJyaWVzIHRoZSBzbG90IGl0IGNhbWUgZnJvbSBhbmQgdGhlIHJvd3MgYXJlXG4gICAgLy8gZmlsZWQgYnkgaW5kZXgg4oCUIHRoZSBkZWNrJ3MgcGFnZSBvcmRlciBjYW4ndCBkZXBlbmQgb24gd2hpY2ggcXVlcnlcbiAgICAvLyBoYXBwZW5lZCB0byBmaW5pc2ggZmlyc3QuXG4gICAgY29uc3QgYWxsJCA9IHNsb3RzLmxlbmd0aFxuICAgICAgPyBmcm9tKHNsb3RzLm1hcCgoc2xvdCwgaW5kZXgpID0+ICh7IHNsb3QsIGluZGV4IH0pKSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAoeyBzbG90LCBpbmRleCB9KSA9PiB0aGlzLl9jb21wb25lbnREYXRhKHJlcG9ydCwgc2xvdC5jb21wb25lbnQsIGxpc3RSb3dzKVxuICAgICAgICAgICAgICAucGlwZShtYXAoKGl0ZW0pID0+ICh7IGl0ZW0sIGluZGV4IH0pKSksXG4gICAgICAgICAgICBFWFBPUlRfQ09OQ1VSUkVOQ1ksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIClcbiAgICAgIDogb2YoW10gYXMgeyBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQ7IGluZGV4OiBudW1iZXIgfVtdKTtcblxuICAgIC8vIFRoZSBzdW1tYXJ5IHJpZGVzIGFsb25nc2lkZSB0aGUgY29tcG9uZW50IGRhdGEgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgYXRcbiAgICAvLyB0aGUgZW5kLCBiZWNhdXNlIG5hbWluZyBhIHNlbGVjdCBmaWx0ZXIncyB2YWx1ZXMgaXMgaXRzZWxmIGEgcmVxdWVzdC5cbiAgICByZXR1cm4gZm9ya0pvaW4oeyBjb2xsZWN0ZWQ6IGFsbCQsIGZpbHRlclN1bW1hcnk6IHRoaXMuZ2V0RmlsdGVyU3VtbWFyeShyZXBvcnQpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgZmlsdGVyU3VtbWFyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXSA9IHJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IHBhZ2UsIGNvbXBvbmVudHM6IFtdIH0pKTtcblxuICAgICAgICAgIFsuLi5jb2xsZWN0ZWRdXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaCgoeyBpdGVtLCBpbmRleCB9KSA9PiB7XG4gICAgICAgICAgICAgIHBhZ2VzW3Nsb3RzW2luZGV4XS5wYWdlSW5kZXhdLmNvbXBvbmVudHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgICAgIHBhZ2VzLFxuICAgICAgICAgICAgZmlsdGVyU3VtbWFyeSxcbiAgICAgICAgICAgIGNvbnRleHRMaW5lczogdGhpcy5fY29udGV4dExpbmVzKHJlcG9ydCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gXCJSZXBvcnQgUGVyaW9kOiBKdW4gMTIsIDIwMjUg4oCTIEp1biAxMiwgMjAyNlwiLCBcIlJlZ2lvbjogTm9ydGgsIEVhc3RcIiDigJQgb25lXG4gIC8vIGxpbmUgcGVyIGZpbHRlciBncm91cCB0aGF0IGhhcyBhbiBhY3RpdmUgc2Vzc2lvbiB2YWx1ZSwgdGhlbiB0aGUgZ3JvdXAtYnlcbiAgLy8gbGluZS4gVGhlIGZpbHRlciBiYXIgYXMgdGhlIHZpZXdlciByZWFkcyBpdDogdGhlIFBERiBhbmQgUG93ZXJQb2ludCBjb3ZlcnNcbiAgLy8gcHJpbnQgaXQsIGFuZCB0aGUgcmVwb3J0IHppcCBleHBvcnQgc2VuZHMgaXQgZm9yIGl0cyBub3RlcyBmaWxlLlxuICAvL1xuICAvLyBBIHNlbGVjdCBncm91cCBzdG9yZXMgaWRzLCBzbyBpdHMgbGluZSBoYXMgdG8gYmUgbmFtZWQgb2ZmIHRoZSBvcHRpb24gbGlzdFxuICAvLyBiZWZvcmUgaXQgY2FuIGJlIHByaW50ZWQ7IGEgZGF0ZSBvciBrZXl3b3JkIGdyb3VwIGFscmVhZHkgaG9sZHMgaXRzIG93blxuICAvLyBkaXNwbGF5IHZhbHVlIGFuZCByZXNvbHZlcyBzeW5jaHJvbm91c2x5LlxuICBwdWJsaWMgZ2V0RmlsdGVyU3VtbWFyeShyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBjb25zdCBsaW5lczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCk7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGdyb3VwLmxhYmVsIHx8ICdGaWx0ZXInO1xuXG4gICAgICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke3RoaXMuX2RhdGUodmFsdWUuc3RhcnQpfSDigJMgJHt0aGlzLl9kYXRlKHZhbHVlLmVuZCl9YCkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKHRoaXMuX3NlbGVjdExpbmUobGFiZWwsIGdyb3VwLCByZXBvcnQuaWQsIHZhbHVlLnZhbHVlcykpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiBcIiR7dmFsdWUudmFsdWUudHJpbSgpfVwiYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncm91cC1ieSBncmFpbiwgdW5kZXIgdGhlIHJlcG9ydCdzIG93biBuYW1lIGZvciB0aGUgY29udHJvbCDigJQgYSBjb3ZlclxuICAgIC8vIHNoZWV0IHJlYWRpbmcgXCJGcmVxdWVuY3lcIiB3aGVuIHRoZSByZXBvcnQgY2FsbHMgaXQgXCJQZXJpb2RcIiBkZXNjcmliZXMgYVxuICAgIC8vIGNvbnRyb2wgdGhlIHJlYWRlciBjYW5ub3QgZmluZCBvbiBzY3JlZW4uXG4gICAgY29uc3QgZ3JhbnVsYXJpdHkgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBpZiAoZ3JhbnVsYXJpdHkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEdSQU5VTEFSSVRZX09QVElPTlMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xuICAgICAgY29uc3QgbGFiZWwgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknO1xuICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7b3B0aW9uPy5uYW1lID8/IGdyYW51bGFyaXR5fWApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMubGVuZ3RoID8gZm9ya0pvaW4obGluZXMpIDogb2YoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxpc3RSb3dzOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD4ge1xuICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nXG4gICAgLy8gYW5kIHRoZSB2aWV3ZXIncyBoZWFkZXIgc29ydCwgc28gdGhlIHRhYmxlIHJlYWRzIGluIHRoZSBzY3JlZW4ncyBvcmRlci5cbiAgICAvL1xuICAgIC8vIFRoZSB0aW1lLXNlcmllcyBjaGVjayBkZWxpYmVyYXRlbHkgbWlycm9ycyB0aGUgc2VydmVyJ3MgY2Fub25pY2FsXG4gICAgLy8gUmVwb3J0UXVlcnlSdW5uZXI6Ol9pc1RpbWVTZXJpZXNDaGFydCwgc28gYSBwcm9kdWN0IHBpbm5lZCB0byBhbiBvbGRlclxuICAgIC8vIGZyYW1ld29yayBkb2VzIG5vdCByZS1idWNrZXQgYSBub24tdGltZSBjaGFydC5cbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBpc1RpbWVTZXJpZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiBjb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IGxpc3RSb3dzLCBzb3J0OiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydChjb21wb25lbnQuaWQpID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBleHBvcnQgZ2F0ZSwgbmFtaW5nIHRoZSBwYWdlcyBpdCBjb3N0IOKAlFxuICAgIC8vIG5ldmVyIGFzIHRlbiBzdGFja2VkIG1vZGFscyBjYXJyeWluZyB0aGUgZGF0YWJhc2UncyBvd24gd29yZGluZy5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSwgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+ICh7IGNvbXBvbmVudCwgZGF0YSB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLiBPbmx5IHRoZSBzZXJ2ZXIncyB2YWx1ZSBpc1xuICAvLyBwcmludGVkOiB0aGUgYnJvd3NlcidzIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSdzIGZhbGxiYWNrIGZvciBhbiBvbGRlclxuICAvLyBzZXJ2ZXIpIGlzIG5vdCB3aGF0IHRoZSBudW1iZXJzIHdlcmUgbWVhc3VyZWQgaW4uXG4gIHByaXZhdGUgX2NvbnRleHRMaW5lcyhyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YscUJBQXFCLEdBQ3RCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFHTCxtQkFBbUIsR0FTcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlD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aEMsV0FBVyxDQUNqQixLQUFhLEVBQ2IsS0FBd0IsRUFDeEIsUUFBZ0IsRUFDaEIsTUFBaUI7UUFFakIsT0FBTyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7YUFDcEYsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQzlFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNuRixDQUFDO0lBQ04sQ0FBQztJQUVELDRFQUE0RTtJQUM1RSx1RUFBdUU7SUFDL0QsS0FBSyxDQUFDLEtBQXVDO1FBQ25ELE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNoRixDQUFDO3dHQXRMVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHtcbiAgREFZX0xPTkcsXG4gIGZvcm1hdExvY2FsRGF0ZSxcbiAgZm9ybWF0TnVtYmVyLFxuICBmb3JtYXRPdXRwdXRWYWx1ZSxcbiAgZm9ybWF0UmVwb3J0RGF0ZSxcbiAgaGFzTnVtYmVyRm9ybWF0LFxuICByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIExpc3RDb2x1bW4sXG4gIExpc3RDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS3BpQ2FyZFZpZXcgfSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBsaXN0SGlkZGVuQ29sdW1ucyxcbiAgbGlzdE91dHB1dENvbHVtbnMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGNvbXBvbmVudE5vdGVMaW5lcywgY29tcG9uZW50V2luZG93c0xpbmUgfSBmcm9tICcuLi9vdXRwdXQtbm90ZXMnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kTGFiZWwsIGxvYWRHcm91cE9wdGlvbnMsIHJlc29sdmVPcHRpb25WYWx1ZXMgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRDb21wb25lbnQge1xuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgLy8gbnVsbCA9IGl0cyBxdWVyeSBmYWlsZWQ7IGV4cG9ydHMgc2hvdyBhIG5vdGUuIEFsd2F5cyBudWxsIGZvciBhIHRleHRcbiAgLy8gYmxvY2ssIHdoaWNoIGhhcyBubyBxdWVyeSDigJQgc2VlIGlzRmFpbGVkKCkuXG4gIGRhdGE6IENvbXBvbmVudERhdGEgfCBudWxsO1xuICAvLyBUaGUgdGV4dCBhIGxpc3Qgd2FzIHNlYXJjaGVkIGJ5IHdoZW4gaXQgd2FzIGZldGNoZWQ7IGFic2VudCB3aGVuIGl0c1xuICAvLyBzZWFyY2ggYm94IHdhcyBlbXB0eSwgYW5kIGZvciBldmVyeSBvdGhlciBjb21wb25lbnQuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIHBsYWluIGxpc3QsIHdoaWNoIGl0cyB0YWJsZSBsZWF2ZXNcbiAgLy8gb3V0IChsaXN0Q29sdW1ucyk7IGVtcHR5IGZvciBldmVyeSBvdGhlciBjb21wb25lbnQuXG4gIGhpZGRlbkNvbHVtbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFBhZ2Uge1xuICBwYWdlOiBSZXBvcnRQYWdlO1xuICBjb21wb25lbnRzOiBDb2xsZWN0ZWRDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRSZXBvcnQge1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXTtcbiAgLy8gSHVtYW4tcmVhZGFibGUgbGluZXMgZGVzY3JpYmluZyB0aGUgYWN0aXZlIGZpbHRlcnMsIGZvciB0aGUgdGl0bGUgc2xpZGUvcGFnZS5cbiAgZmlsdGVyU3VtbWFyeTogc3RyaW5nW107XG4gIC8vIFdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2U6IHRoZSB6b25lIGFuZFxuICAvLyB0aGUgY3VycmVuY3kgdGhlIHNlcnZlciByZXNvbHZlZCBmb3IgdGhlIHJlcG9ydC4gRWFjaCBpcyBsZWZ0IG91dCB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBpdCwgcmF0aGVyIHRoYW4gYSBndWVzcyB0aGF0IHdvdWxkIGJlIHdyb25nIHdoZW5ldmVyXG4gIC8vIHRoZSBkZWZhdWx0IGFwcGxpZXMuXG4gIGNvbnRleHRMaW5lczogc3RyaW5nW107XG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAoaXRzIGxvY2FsZSwgY3VycmVuY3lcbiAgLy8gYW5kIHBlcmNlbnQgZm9ybSksIHJlYWQgb25jZSBzbyBldmVyeSBwYWdlIG9mIHRoZSBmaWxlIGFncmVlcy5cbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbn1cblxuLy8gT25lIGV4cG9ydGVkIGxpc3QgY29sdW1uOiB0aGUgY2VsbCBrZXksIGl0cyBoZWFkaW5nIGFuZCBpdHMgZm9ybWF0LCBhbmRcbi8vIHdoZXRoZXIgaXRzIGNlbGxzIGFyZSBmb3JtYXR0ZWQgbnVtYmVycywgd2hpY2ggZXZlcnkgZXhwb3J0IHJpZ2h0LWFsaWduc1xuLy8gKGhlYWRlciBpbmNsdWRlZCkgYXMgdGhlIHNjcmVlbiBkb2VzLiBBIGNvbHVtbiB0aGF0IGhvbGRzIGEgY29tcGFyZWQsXG4vLyB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQgY2FycmllcyBob3cgaXQgaXMgd3JpdHRlbiAob3V0cHV0KSwgYW5kXG4vLyBob2xkcyBudW1iZXJzIHdoZXRoZXIgb3Igbm90IGl0IG5hbWVzIGEgZm9ybWF0LlxuZXhwb3J0IHR5cGUgRXhwb3J0TGlzdENvbHVtbiA9IExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW47IG91dHB1dD86IExpc3RPdXRwdXRDb2x1bW4gfTtcblxuLy8gSG93IHRhbGwgZWFjaCBwYXJ0IG9mIGFuIGV4cG9ydGVkIEtQSSBjYXJkIGlzLCBpbiB0aGUgcmVuZGVyZXIncyB1bml0XG4vLyAocG9pbnRzIGluIHRoZSBQREYsIGluY2hlcyBpbiB0aGUgZGVjaykuIEEgbm90ZSBpcyBvbmUgbGluZS5cbmV4cG9ydCBpbnRlcmZhY2UgS3BpRXhwb3J0SGVpZ2h0cyB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGxhYmVsOiBudW1iZXI7XG4gIGRlbHRhOiBudW1iZXI7XG4gIHdpbmRvdzogbnVtYmVyO1xuICB0YXJnZXQ6IG51bWJlcjtcbiAgc3BhcmtsaW5lOiBudW1iZXI7XG4gIG5vdGU6IG51bWJlcjtcbn1cblxuLy8gVGhlIHBhcnRzIG9mIGEgS1BJIGNhcmQgYW4gZXhwb3J0IGRyYXdzOiB0aGUgdmFsdWUgYW5kIGl0cyBsYWJlbCBhbHdheXMsXG4vLyB0aGUgcmVzdCB3aGVuIHRoZSBjYXJkIGhhcyB0aGVtIGFuZCB0aGUgdGlsZSBoYXMgcm9vbSAoa3BpRXhwb3J0UGFydHMpLlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRQYXJ0cyB7XG4gIGRlbHRhOiBib29sZWFuO1xuICB3aW5kb3c6IGJvb2xlYW47XG4gIHRhcmdldDogYm9vbGVhbjtcbiAgc3BhcmtsaW5lOiBib29sZWFuO1xuICBub3Rlczogc3RyaW5nW107XG59XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBBIGNvbXBvbmVudCdzIHRpdGxlIGFzIGFuIGV4cG9ydGVkIGZpbGUgcHJpbnRzIGl0LiBBIHNlYXJjaGVkIGxpc3Qgc2F5cyBzbyxcbi8vIHNpbmNlIGl0cyB0YWJsZSBob2xkcyBvbmx5IHRoZSBtYXRjaGluZyByb3dzOiAnT3JkZXJzIChtYXRjaGluZyBcIm5vcnRoXCIpJy5cbi8vIEFuIHVudGl0bGVkIG9uZSByZWFkcyAnTWF0Y2hpbmcgXCJub3J0aFwiJy4gJycgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHByaW50LlxuLy8gU2hhcmVkIGJ5IHRoZSBQREYgYW5kIHRoZSBkZWNrLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgYWx3YXlzIGxlYWRzICh0aGUgUG93ZXJQb2ludCBtYXJrcyB0aGF0IGxpbmUgYXMgd3JpdHRlbiBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSkuIEl0IGlzIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLCB0aGUgc2FtZSBkYXkgaXRzIGZpbHRlcnNcbi8vIHJlc29sdmUgXCJ0b2RheVwiIHRvLCB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXRMb2NhbERhdGUoXG4gICAgICBuZXcgRGF0ZSgpLFxuICAgICAgY29sbGVjdGVkLmZvcm1hdENvbnRleHQubG9jYWxlLFxuICAgICAgREFZX0xPTkcsXG4gICAgICByZXNvbHZlUmVwb3J0VGltZXpvbmUoY29sbGVjdGVkLnJlcG9ydCksXG4gICAgKSxcbiAgICAuLi5jb2xsZWN0ZWQuZmlsdGVyU3VtbWFyeSxcbiAgICAuLi5jb2xsZWN0ZWQuY29udGV4dExpbmVzLFxuICBdO1xufVxuXG4vLyBBbiBleHBvcnRlZCBsaXN0IGNlbGwsIHJlYWRpbmcgbGlrZSB0aGUgb24tc2NyZWVuIGNlbGwsIHRocm91Z2ggdGhlIHNhbWVcbi8vIGZ1bmN0aW9ucyBhcyB0aGUgc2NyZWVuOiBhIGRhdGUgY29sdW1uIHJlbmRlcnMgaW4gdGhlIHJlcG9ydCdzIHpvbmUgYW5kXG4vLyBsb2NhbGUsIGFuZCBhIGNvbHVtbiB3aXRoIG51bWJlci1mb3JtYXQga2V5cyAoYSBjcm9zcy10YWIncyBjZWxscyB0aHJvdWdoXG4vLyBpdHMgY2VsbEZvcm1hdCkgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSBhbmQgY3VycmVuY3kuIEFueSBvdGhlciB2YWx1ZSBnb2VzXG4vLyBvdXQgdmVyYmF0aW0sIGFuZCBhbiBlbXB0eSBvbmUgYXMgJycuIENTViBuZXZlciBjb21lcyB0aHJvdWdoIGhlcmU6IGl0c1xuLy8gdmFsdWVzIHN0YXkgcmF3LlxuLy9cbi8vIEFuIG91dHB1dCBjb2x1bW4gaXMgd3JpdHRlbiBieSB3aGF0IGl0IGhvbGRzLCBhcyB0aGUgc2NyZWVuJ3MgY2VsbCBpc1xuLy8gKGZvcm1hdE91dHB1dFZhbHVlKTogYSBzaWduZWQgY2hhbmdlLCBhIHBlcmNlbnQgY2hhbmdlLCBhIGNoYW5nZSBvZiBhIHJhdGVcbi8vIGluIHBvaW50cywgYSByYW5rLCBhIHNoYXJlLiBJdHMgcm93IGdpdmVzIGEgY2hhbmdlIHRoZSBwcmlvciBiZXNpZGUgaXQsIHNvXG4vLyBhIG1pc3NpbmcgYmFzZWxpbmUgKCfigJQnKSByZWFkcyBhcGFydCBmcm9tIGEgemVybyBvbmUgKCduL2EnKS5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRDZWxsKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29sdW1uOiBMaXN0Q29sdW1uICYgeyBvdXRwdXQ/OiBMaXN0T3V0cHV0Q29sdW1uIH0sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIHJvdz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG91dHB1dCA9IGNvbHVtbi5vdXRwdXQ7XG5cbiAgaWYgKG91dHB1dCkge1xuICAgIHJldHVybiBmb3JtYXRPdXRwdXRWYWx1ZSh2YWx1ZSwgb3V0cHV0Lm91dHB1dCwgY29sdW1uLCBjb250ZXh0LCB7XG4gICAgICBtZWFzdXJlU3BlYzogb3V0cHV0Lm1lYXN1cmVTcGVjLFxuICAgICAgcHJpb3I6IG91dHB1dC5wcmlvckFsaWFzICYmIHJvdyA/IHJvd1tvdXRwdXQucHJpb3JBbGlhc10gOiB1bmRlZmluZWQsXG4gICAgICBmbG9vcjogb3V0cHV0LmZsb29yLFxuICAgICAgZW1wdHk6ICcnLFxuICAgIH0pLnRleHQ7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgdGltZXpvbmUsIGNvbnRleHQubG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSA/IGZvcm1hdE51bWJlcih2YWx1ZSwgY29sdW1uLCBjb250ZXh0LCB7IGVtcHR5OiAnJyB9KSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgYXJyaXZlIHdpdGggaXRzXG4vLyByb3dzICh0aGUgcm93IGtleSBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlKSwgc2luY2Ugb25seSB0aGUgcmVzdWx0XG4vLyBrbm93cyB0aGUgcGl2b3QgdmFsdWVzLCBhbmQgYXJlIGJ1aWx0IGJ5IHBpdm90Q29sdW1uU3BlY3MoKSBhcyBvbiBzY3JlZW46XG4vLyBoZWFkZWQgYnkgaXRzIHBlcmlvZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgZWFjaCBwaXZvdCB2YWx1ZSBmb3JtYXR0ZWQgYnlcbi8vIGNlbGxGb3JtYXQuIEEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zIGJ1dCB0aGUgb25lcyB0aGVcbi8vIHZpZXdlciBoaWQgKGBoaWRkZW5gLCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zLCBzbyBuZXZlciBhbGwgb2YgdGhlbSksXG4vLyBlbHNlIGV2ZXJ5IGNvbHVtbiB0aGUgcXVlcnkgcmV0dXJuZWQsIGFzIGl0IGNhbWUuIE91dHB1dCBjb2x1bW5zICh0aGVcbi8vIGRhdGEncyBvdXRwdXRzLCBhIGNyb3NzLXRhYiBjZWxsIHRocm91Z2ggY2VsbE1lYXN1cmVzKSBjYXJyeSBob3cgdGhleSBhcmVcbi8vIHdyaXR0ZW47IHdpdGhvdXQgdGhvc2Uga2V5cyB0aGUgY29sdW1ucyBhcmUgZXhhY3RseSBhcyBiZWZvcmUuXG5leHBvcnQgZnVuY3Rpb24gbGlzdENvbHVtbnMoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKGNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMocGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIGxvY2FsZSksIGRhdGEsIFtdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuY29sdW1ucz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgaGlkZGVuTmFtZXMgPSBsaXN0SGlkZGVuQ29sdW1ucyhjb25maWcsIGhpZGRlbik7XG5cbiAgICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMoXG4gICAgICBjb25maWcuY29sdW1uc1xuICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+ICFoaWRkZW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSlcbiAgICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBjb25maWcuY29sdW1ucyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHdpdGhPdXRwdXRDb2x1bW5zKGRhdGEuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uLCBudW1lcmljOiBmYWxzZSB9KSksIGRhdGEsIFtdKTtcbn1cblxuLy8gVGhlIGNvbHVtbnMgd2l0aCB0aGVpciBvdXRwdXQgbWV0YWRhdGEgYXR0YWNoZWQgKGxpc3RPdXRwdXRDb2x1bW5zLCBhcyB0aGVcbi8vIHNjcmVlbidzIGxpc3QgcmVzb2x2ZXMgaXQpOiBhbiBvdXRwdXQgY29sdW1uIGhvbGRzIG51bWJlcnMgYW5kIGlzIHdyaXR0ZW5cbi8vIGJ5IHdoYXQgaXQgaG9sZHMuIFVuY2hhbmdlZCB3aGVuIHRoZSBkYXRhIGhhcyBubyBvdXRwdXRzLlxuZnVuY3Rpb24gd2l0aE91dHB1dENvbHVtbnMoXG4gIGNvbHVtbnM6IEV4cG9ydExpc3RDb2x1bW5bXSxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgYXV0aG9yZWQ6IHJlYWRvbmx5IExpc3RDb2x1bW5bXSxcbik6IEV4cG9ydExpc3RDb2x1bW5bXSB7XG4gIGlmICghZGF0YS5vdXRwdXRzKSB7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBjb25zdCBvdXRwdXRzID0gbGlzdE91dHB1dENvbHVtbnMoY29sdW1ucywgZGF0YSwgYXV0aG9yZWQpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAob3V0cHV0c1tjb2x1bW4uY29sdW1uXVxuICAgID8geyAuLi5jb2x1bW4sIG51bWVyaWM6IHRydWUsIG91dHB1dDogb3V0cHV0c1tjb2x1bW4uY29sdW1uXSB9XG4gICAgOiBjb2x1bW4pKTtcbn1cblxuLy8gVGhlIGhlYWRpbmcgb3ZlciBlYWNoIGNvbHVtbiBvZiBsaXN0Q29sdW1ucygpOiBhIHBsYWluIGxpc3QncyBjb25maWd1cmVkXG4vLyBsYWJlbCwgZWxzZSBpdHMgY29sdW1uOyBhIGNyb3NzLXRhYidzIGhlYWRpbmcgZnJvbSBwaXZvdENvbHVtblNwZWNzKCkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGhpZGRlbjogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgbG9jYWxlLCBoaWRkZW4pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbik7XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QncyB0b3RhbHMgcm93LCBvbmUgY2VsbCBwZXIgY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGVhY2hcbi8vIHRvdGFsIHdyaXR0ZW4gbGlrZSBpdHMgY29sdW1uJ3MgY2VsbHMsIGFuZCBMSVNUX1RPVEFMX0xBQkVMIGluIHRoZSBmaXJzdFxuLy8gY29sdW1uIHdoZW4gdGhhdCBjb2x1bW4gaG9sZHMgbm8gdG90YWwgKGEgY3Jvc3MtdGFiJ3Mgcm93IGtleSkuIG51bGwgd2hlblxuLy8gdGhlIGxpc3QgaGFzIG5vIHRvdGFscy4gVGhlIENTViBuZXZlciBjYXJyaWVzIG9uZTogaXRzIHJvd3Mgc3RheSByYXcuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRvdGFsc1JvdyhcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY29sdW1uczogcmVhZG9ubHkgRXhwb3J0TGlzdENvbHVtbltdLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3QgdG90YWxzID0gZGF0YS50b3RhbHM7XG5cbiAgaWYgKCF0b3RhbHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxhYmVsID0gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKGNvbHVtbnMsIHRvdGFscyk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChjb2x1bW4uY29sdW1uID09PSBsYWJlbFxuICAgID8gTElTVF9UT1RBTF9MQUJFTFxuICAgIDogZXhwb3J0Q2VsbCh0b3RhbHNbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgdGltZXpvbmUsIGNvbnRleHQsIHRvdGFscykpKTtcbn1cblxuLy8gVGhlIHN1YnRpdGxlIHVuZGVyIGEgY2hhcnQncyBvciBhIGxpc3QncyB0aXRsZTogdGhlIGRheXMgaXQgcmVhZHMsIGFuZCB0aGVcbi8vIGRheXMgZWFjaCBjb21wYXJpc29uIGxhbmUgcmVhZHMgKCdTZXAgMSDigJMgMTUsIDIwMjYgwrcgdnMgcHJldmlvdXMgbW9udGg6XG4vLyBBdWcgMSDigJMgMTUsIDIwMjYnKSwgYXMgdGhlIHNjcmVlbidzIG5vdGUgb3BlbnMgd2l0aC4gJycgd2l0aG91dCBhXG4vLyBjb21wYXJpc29uIG9yIGEgdGltZWZyYW1lLCBhbmQgZm9yIGEgS1BJLCB3aG9zZSBjYXJkIHByaW50cyBpdHMgb3duIHdpbmRvd1xuLy8gbGluZS5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRXaW5kb3dzTGluZShpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIHRpbWV6b25lOiBzdHJpbmcsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgaWYgKCFpdGVtLmRhdGEgfHwgaXRlbS5jb21wb25lbnQudHlwZSA9PT0gJ2twaScpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50V2luZG93c0xpbmUoaXRlbS5kYXRhLCB7IGxvY2FsZSwgdGltZXpvbmUgfSk7XG59XG5cbi8vIFRoZSBub3RlIGxpbmVzIHVuZGVyIGEgY29tcG9uZW50J3MgYm94OiB3aHkgYSBjb21wYXJpc29uIHJlYWRzIGFzIGl0IGRvZXMsXG4vLyBhIEtQSSdzIGRlbHRhIG5vdGUsIGFuZCB3aGF0IGVhY2ggd2luZG93ZWQgdmFsdWUgaXMgYW5kIHdoeS4gVGhlIGRheXMgYXJlXG4vLyBsZWZ0IG91dCAodGhlIHN1YnRpdGxlIG9yIHRoZSBLUEkgY2FyZCBwcmludHMgdGhlbSksIGFuZCB0aGUgd2luZG93XG4vLyBkZXNjcmlwdGlvbnMgYXJlIGluLCBzaW5jZSBhIGZpbGUgaGFzIG5vIHRvb2x0aXAgb3IgaGVhZGVyIHRvIGNhcnJ5IHRoZW0uXG4vLyBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZSBrZXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5vdGVMaW5lcyhpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIHRpbWV6b25lOiBzdHJpbmcsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50Tm90ZUxpbmVzKGl0ZW0uZGF0YSwgeyBsb2NhbGUsIHRpbWV6b25lIH0sIHsgd2luZG93czogZmFsc2UsIHdpbmRvd0Rlc2NyaXB0aW9uczogdHJ1ZSB9KTtcbn1cblxuLy8gV2hldGhlciBhIEtQSSBjYXJkIGhhcyBtb3JlIHRvIGRyYXcgdGhhbiBpdHMgdmFsdWUgYW5kIGxhYmVsLiBXaXRob3V0LCBib3RoXG4vLyBleHBvcnRzIGRyYXcgdGhlIHRpbGUgZXhhY3RseSBhcyB0aGV5IGFsd2F5cyBoYXZlLlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUNhcmRIYXNFeHRyYXModmlldzogS3BpQ2FyZFZpZXcsIG5vdGVzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEodmlldy5kZWx0YSB8fCB2aWV3LndpbmRvdyB8fCB2aWV3LnRhcmdldCB8fCB2aWV3LnNwYXJrbGluZSB8fCBub3Rlcy5sZW5ndGgpO1xufVxuXG4vLyBXaGljaCBwYXJ0cyBvZiBhIEtQSSBjYXJkIGZpdCBhIHRpbGUgYGF2YWlsYWJsZWAgdGFsbC4gQSBzaG9ydCB0aWxlIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lIGZpcnN0LCB0aGVuIHRoZSB0YXJnZXQgbGluZSwgdGhlbiB0aGUgbm90ZXM7IHRoZSB2YWx1ZSwgaXRzIGxhYmVsXG4vLyBhbmQgdGhlIGRlbHRhIHJvdyBhbHdheXMgc3RheSwgYW5kIHRoZSB3aW5kb3cgbGluZSBzdGF5cyB3aGVuZXZlciB0aGUgY2FyZFxuLy8gc2hvd3MgYSBjb21wYXJpc29uIChpdHMgZGF5cyBhcmUgd2hhdCB0aGUgZGVsdGEgaXMgbWVhc3VyZWQgb3ZlcikuIFRoZVxuLy8gc3BhcmtsaW5lIG5lZWRzIHZhbHVlcyB0byBkcmF3LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydFBhcnRzKFxuICB2aWV3OiBLcGlDYXJkVmlldyxcbiAgbm90ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBhdmFpbGFibGU6IG51bWJlcixcbiAgaGVpZ2h0czogS3BpRXhwb3J0SGVpZ2h0cyxcbik6IEtwaUV4cG9ydFBhcnRzIHtcbiAgY29uc3QgcGFydHM6IEtwaUV4cG9ydFBhcnRzID0ge1xuICAgIGRlbHRhOiAhIXZpZXcuZGVsdGEsXG4gICAgd2luZG93OiAhIXZpZXcud2luZG93LFxuICAgIHRhcmdldDogISF2aWV3LnRhcmdldCxcbiAgICBzcGFya2xpbmU6ICEhdmlldy5zcGFya2xpbmU/LnZhbHVlcy5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwpLFxuICAgIG5vdGVzOiBbLi4ubm90ZXNdLFxuICB9O1xuICBjb25zdCBoZWlnaHQgPSAoKSA9PiBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIGhlaWdodHMpO1xuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSkge1xuICAgIHBhcnRzLnNwYXJrbGluZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGhlaWdodCgpID4gYXZhaWxhYmxlKSB7XG4gICAgcGFydHMudGFyZ2V0ID0gZmFsc2U7XG4gIH1cblxuICB3aGlsZSAoaGVpZ2h0KCkgPiBhdmFpbGFibGUgJiYgcGFydHMubm90ZXMubGVuZ3RoKSB7XG4gICAgcGFydHMubm90ZXMucG9wKCk7XG4gIH1cblxuICBpZiAoaGVpZ2h0KCkgPiBhdmFpbGFibGUgJiYgIXBhcnRzLmRlbHRhKSB7XG4gICAgcGFydHMud2luZG93ID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIEhvdyB0YWxsIHRoZSBjYXJkJ3MgZHJhd24gcGFydHMgc3RhbmQgdG9nZXRoZXIsIGluIHRoZSBoZWlnaHRzJyB1bml0LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydEhlaWdodCh2aWV3OiBLcGlDYXJkVmlldywgcGFydHM6IEtwaUV4cG9ydFBhcnRzLCBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzKTogbnVtYmVyIHtcbiAgcmV0dXJuIGhlaWdodHMudmFsdWVcbiAgICArICh2aWV3LmxhYmVsID8gaGVpZ2h0cy5sYWJlbCA6IDApXG4gICAgKyAocGFydHMuZGVsdGEgPyBoZWlnaHRzLmRlbHRhIDogMClcbiAgICArIChwYXJ0cy53aW5kb3cgPyBoZWlnaHRzLndpbmRvdyA6IDApXG4gICAgKyAocGFydHMudGFyZ2V0ID8gaGVpZ2h0cy50YXJnZXQgOiAwKVxuICAgICsgKHBhcnRzLnNwYXJrbGluZSA/IGhlaWdodHMuc3BhcmtsaW5lIDogMClcbiAgICArIHBhcnRzLm5vdGVzLmxlbmd0aCAqIGhlaWdodHMubm90ZTtcbn1cblxuLy8gVGhlIGxhc3Qgcm93IG9mIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgdGhhdCBzdG9wcyBzaG9ydCBvZiBpdHMgcmVzdWx0OiBob3dcbi8vIG1hbnkgcm93cyB0aGUgZmlsZSBsZWF2ZXMgb3V0IGFuZCB3aGVyZSB0aGUgd2hvbGUgc2V0IGNhbiBiZSBoYWQuIEVhY2hcbi8vIGZvcm1hdCBmZXRjaGVzIGl0cyBvd24gbnVtYmVyIG9mIHJvd3MgKFBERl9MSVNUX1JPV1MsIFBQVFhfTElTVF9ST1dTKSwgYW5kXG4vLyBib3RoIG5hbWUgd2hhdCBpcyBsZWZ0IHdpdGggdGhpcyBvbmUgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gbW9yZVJvd3NOb3RpY2UocmVtYWluaW5nOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYOKApiAke3JlbWFpbmluZ30gbW9yZSByb3cocykg4oCUIHVzZSB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydCBmb3IgdGhlIGZ1bGwgZGF0YXNldGA7XG59XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNvbGxlY3RlZCByZXBvcnQgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB0aWxlIHdob3NlIHF1ZXJ5XG4vLyBmYWlsZWQg4oCUIHdoYXQgdGhlIGV4cG9ydCBnYXRlIG5hbWVzIHRvIHRoZSB1c2VyLCBhbmQgd2hhdCBtYWtlcyBcInNvbWUgb2YgdGhpc1xuLy8gZmlsZSBpcyBtaXNzaW5nXCIgYSBmYWN0IHRoZSBjYWxsZXIgY2FuIGFjdCBvbiByYXRoZXIgdGhhbiBhIHRoaW5nIHRoZXkgbm90aWNlXG4vLyBpbiB0aGUgUERGIGFmdGVyd2FyZHMuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICAvLyBOdW1iZXJlZCBiZWZvcmUgdGhlIGZpbHRlciDigJQgYW4gdW5uYW1lZCBwYWdlIDQgdGhhdCBmYWlsZWQgaGFzIHRvIHJlYWRcbiAgLy8gXCJQYWdlIDRcIiwgbm90IFwiUGFnZSAxXCIgYmVjYXVzZSBpdCBoYXBwZW5lZCB0byBiZSB0aGUgZmlyc3QgZmFpbHVyZS5cbiAgcmV0dXJuIGNvbGxlY3RlZC5wYWdlc1xuICAgIC5tYXAoKHBhZ2UsIGluZGV4KSA9PiAoeyBwYWdlLCBudW1iZXI6IGluZGV4ICsgMSB9KSlcbiAgICAuZmlsdGVyKCh7IHBhZ2UgfSkgPT4gcGFnZS5jb21wb25lbnRzLnNvbWUoaXNGYWlsZWQpKVxuICAgIC5tYXAoKHsgcGFnZSwgbnVtYmVyIH0pID0+IHBhZ2UucGFnZS5uYW1lIHx8IGBQYWdlICR7bnVtYmVyfWApO1xufVxuXG4vLyBHYXRoZXJzIGV2ZXJ5dGhpbmcgYW4gZXhwb3J0IG5lZWRzOiBldmVyeSBjb21wb25lbnQncyBkYXRhIGFjcm9zcyBBTEwgcGFnZXNcbi8vICh0aGUgY2FudmFzIG9ubHkgcmVuZGVycyB0aGUgYWN0aXZlIHBhZ2UsIHNvIGV4cG9ydHMgY2FuJ3Qgc2NyYXBlIHRoZVxuLy8gc2NyZWVuKSwgZmV0Y2hlZCBmcmVzaCB3aXRoIHRoZSB2aWV3ZXIncyBjdXJyZW50IGZpbHRlciBzdGF0ZS5cbi8vXG4vLyBBIGZhaWxlZCBjb21wb25lbnQgcmVzb2x2ZXMgdG8gYSBudWxsIGBkYXRhYCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZVxuLy8gY29sbGVjdGlvbiDigJQgYnV0IHRoYXQgaXMgc28gdGhlIGNhbGxlciBjYW4gUkVQT1JUIHdoYXQgZmFpbGVkLCBub3Qgc28gaXQgY2FuXG4vLyBiZSBpZ25vcmVkOiBzZWUgZmFpbGVkUGFnZU5hbWVzKCkgYW5kIHRoZSBleHBvcnQgZ2F0ZSB0aGF0IHVzZXMgaXQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICAvLyBsaXN0Um93cyBpcyBob3cgbWFueSByb3dzIGVhY2ggbGlzdCBmZXRjaGVzOiB0aGUgcmVuZGVyZXIncyBvd24gY2FwLCBzaW5jZVxuICAvLyBhIFBERiB0YWJsZSBjb250aW51ZXMgb250byBleHRyYSBwYWdlcyBhbmQgYSBzbGlkZSB0YWJsZSBjYW5ub3QuXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBzbG90czogeyBwYWdlSW5kZXg6IG51bWJlcjsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCwgY29tcG9uZW50IH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGV4dCBibG9ja3MgaGF2ZSBub3RoaW5nIHRvIGZldGNoIOKAlCB0aGV5IHJpZGUgdGhyb3VnaCB3aXRoIG5vIGRhdGEuIFRoZVxuICAgIC8vIGhlYWRlci9mb290ZXIgKHJlcG9ydC5tYXN0ZXIpIGlzIHJlYWQgYnkgdGhlIHJlbmRlcmVycyBzdHJhaWdodCBvZmYgdGhlXG4gICAgLy8gcmVwb3J0IGZvciB0aGUgc2FtZSByZWFzb24uXG5cbiAgICAvLyBSZWxlYXNlZCBhIGZldyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuIG1lcmdlTWFwIGNvbXBsZXRlcyBvdXRcbiAgICAvLyBvZiBvcmRlciwgc28gZWFjaCByZXN1bHQgY2FycmllcyB0aGUgc2xvdCBpdCBjYW1lIGZyb20gYW5kIHRoZSByb3dzIGFyZVxuICAgIC8vIGZpbGVkIGJ5IGluZGV4IOKAlCB0aGUgZGVjaydzIHBhZ2Ugb3JkZXIgY2FuJ3QgZGVwZW5kIG9uIHdoaWNoIHF1ZXJ5XG4gICAgLy8gaGFwcGVuZWQgdG8gZmluaXNoIGZpcnN0LlxuICAgIGNvbnN0IGFsbCQgPSBzbG90cy5sZW5ndGhcbiAgICAgID8gZnJvbShzbG90cy5tYXAoKHNsb3QsIGluZGV4KSA9PiAoeyBzbG90LCBpbmRleCB9KSkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKFxuICAgICAgICAgICAgKHsgc2xvdCwgaW5kZXggfSkgPT4gdGhpcy5fY29tcG9uZW50RGF0YShyZXBvcnQsIHNsb3QuY29tcG9uZW50LCBsaXN0Um93cylcbiAgICAgICAgICAgICAgLnBpcGUobWFwKChpdGVtKSA9PiAoeyBpdGVtLCBpbmRleCB9KSkpLFxuICAgICAgICAgICAgRVhQT1JUX0NPTkNVUlJFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdIGFzIHsgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50OyBpbmRleDogbnVtYmVyIH1bXSk7XG5cbiAgICAvLyBUaGUgc3VtbWFyeSByaWRlcyBhbG9uZ3NpZGUgdGhlIGNvbXBvbmVudCBkYXRhIHJhdGhlciB0aGFuIGJlaW5nIGJ1aWx0IGF0XG4gICAgLy8gdGhlIGVuZCwgYmVjYXVzZSBuYW1pbmcgYSBzZWxlY3QgZmlsdGVyJ3MgdmFsdWVzIGlzIGl0c2VsZiBhIHJlcXVlc3QuXG4gICAgcmV0dXJuIGZvcmtKb2luKHsgY29sbGVjdGVkOiBhbGwkLCBmaWx0ZXJTdW1tYXJ5OiB0aGlzLmdldEZpbHRlclN1bW1hcnkocmVwb3J0KSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBjb2xsZWN0ZWQsIGZpbHRlclN1bW1hcnkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW10gPSByZXBvcnQucGFnZXMubWFwKChwYWdlKSA9PiAoeyBwYWdlLCBjb21wb25lbnRzOiBbXSB9KSk7XG5cbiAgICAgICAgICBbLi4uY29sbGVjdGVkXVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KVxuICAgICAgICAgICAgLmZvckVhY2goKHsgaXRlbSwgaW5kZXggfSkgPT4ge1xuICAgICAgICAgICAgICBwYWdlc1tzbG90c1tpbmRleF0ucGFnZUluZGV4XS5jb21wb25lbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBwYWdlcyxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICAgICAgICBjb250ZXh0TGluZXM6IHRoaXMuX2NvbnRleHRMaW5lcyhyZXBvcnQpLFxuICAgICAgICAgICAgZm9ybWF0Q29udGV4dDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFwiUmVwb3J0IFBlcmlvZDogSnVuIDEyLCAyMDI1IOKAkyBKdW4gMTIsIDIwMjZcIiwgXCJSZWdpb246IE5vcnRoLCBFYXN0XCIg4oCUIG9uZVxuICAvLyBsaW5lIHBlciBmaWx0ZXIgZ3JvdXAgdGhhdCBoYXMgYW4gYWN0aXZlIHNlc3Npb24gdmFsdWUsIHRoZW4gdGhlIGdyb3VwLWJ5XG4gIC8vIGxpbmUuIFRoZSBmaWx0ZXIgYmFyIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQ6IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgY292ZXJzXG4gIC8vIHByaW50IGl0LCBhbmQgdGhlIHJlcG9ydCB6aXAgZXhwb3J0IHNlbmRzIGl0IGZvciBpdHMgbm90ZXMgZmlsZS4gRGF0ZXMgYXJlXG4gIC8vIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gdGhlIG5vdGVzIG5hbWUgdGhlIHBlcmlvZCBhcyB0aGUgY292ZXJcbiAgLy8gZG9lcy5cbiAgLy9cbiAgLy8gQSBzZWxlY3QgZ3JvdXAgc3RvcmVzIGlkcywgc28gaXRzIGxpbmUgaGFzIHRvIGJlIG5hbWVkIG9mZiB0aGUgb3B0aW9uIGxpc3RcbiAgLy8gYmVmb3JlIGl0IGNhbiBiZSBwcmludGVkOyBhIGRhdGUgb3Iga2V5d29yZCBncm91cCBhbHJlYWR5IGhvbGRzIGl0cyBvd25cbiAgLy8gZGlzcGxheSB2YWx1ZSBhbmQgcmVzb2x2ZXMgc3luY2hyb25vdXNseS5cbiAgcHVibGljIGdldEZpbHRlclN1bW1hcnkocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGluZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCAnRmlsdGVyJztcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHt0aGlzLl9kYXRlKHZhbHVlLnN0YXJ0KX0g4oCTICR7dGhpcy5fZGF0ZSh2YWx1ZS5lbmQpfWApKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0aGlzLl9zZWxlY3RMaW5lKGxhYmVsLCBncm91cCwgcmVwb3J0LmlkLCB2YWx1ZS52YWx1ZXMpKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgZ3JhaW4sIHVuZGVyIHRoZSByZXBvcnQncyBvd24gbmFtZSBmb3IgdGhlIGNvbnRyb2wg4oCUIGEgY292ZXJcbiAgICAvLyBzaGVldCByZWFkaW5nIFwiRnJlcXVlbmN5XCIgd2hlbiB0aGUgcmVwb3J0IGNhbGxzIGl0IFwiUGVyaW9kXCIgZGVzY3JpYmVzIGFcbiAgICAvLyBjb250cm9sIHRoZSByZWFkZXIgY2Fubm90IGZpbmQgb24gc2NyZWVuLlxuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGdyYW51bGFyaXR5KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JztcbiAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke29wdGlvbj8ubmFtZSA/PyBncmFudWxhcml0eX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGZvcmtKb2luKGxpbmVzKSA6IG9mKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBvbmVudERhdGEocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zOiBbXSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIC8vIEEgdGltZS1zZXJpZXMgY2hhcnQgY2FycmllcyB0aGUgdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW4gc28gdGhlIGV4cG9ydFxuICAgIC8vIHJlLWJ1Y2tldHMgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGRvZXM7IGxpc3RzIGNhcnJ5IHRoZWlyIGV4cG9ydCBwYWdpbmdcbiAgICAvLyBhbmQgdGhlIHZpZXdlcidzIGhlYWRlciBzb3J0IGFuZCBzZWFyY2gsIHNvIHRoZSB0YWJsZSByZWFkcyBpbiB0aGVcbiAgICAvLyBzY3JlZW4ncyBvcmRlciBhbmQgaG9sZHMgdGhlIHNjcmVlbidzIHJvd3MuXG4gICAgLy9cbiAgICAvLyBUaGUgdGltZS1zZXJpZXMgY2hlY2sgZGVsaWJlcmF0ZWx5IG1pcnJvcnMgdGhlIHNlcnZlcidzIGNhbm9uaWNhbFxuICAgIC8vIFJlcG9ydFF1ZXJ5UnVubmVyOjpfaXNUaW1lU2VyaWVzQ2hhcnQsIHNvIGEgcHJvZHVjdCBwaW5uZWQgdG8gYW4gb2xkZXJcbiAgICAvLyBmcmFtZXdvcmsgZG9lcyBub3QgcmUtYnVja2V0IGEgbm9uLXRpbWUgY2hhcnQuXG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3QgaXNUaW1lU2VyaWVzID0gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJztcbiAgICBjb25zdCBzZWFyY2ggPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2goY29tcG9uZW50LmlkKSA/PyB1bmRlZmluZWRcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IGxpc3RSb3dzLCBzb3J0OiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydChjb21wb25lbnQuaWQpID8/IHVuZGVmaW5lZCwgc2VhcmNoIH1cbiAgICAgIDogKGlzVGltZVNlcmllcyAmJiBmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pO1xuICAgIC8vIFRoZSB0YWJsZSBsZWF2ZXMgb3V0IHRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkLiBUaGUgcm93cyBhcmUgZmV0Y2hlZFxuICAgIC8vIHdob2xlLCBhcyB0aGUgc2NyZWVuIGZldGNoZXMgdGhlbSwgYW5kIHRoZSByZW5kZXJlcnMgZHJvcCB0aGUgY2VsbHMuXG4gICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IFsuLi50aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudC5pZCldO1xuXG4gICAgLy8gaGFuZGxlcnM6IGZhbHNlIGtlZXBzIHRoZSBhcHAncyBnbG9iYWwgZXJyb3IgZGlhbG9nIG91dCBvZiB0aGlzLiBBIGZhaWxlZFxuICAgIC8vIHRpbGUgaXMgcmVwb3J0ZWQgb25jZSwgYnkgdGhlIGV4cG9ydCBnYXRlLCBuYW1pbmcgdGhlIHBhZ2VzIGl0IGNvc3Qg4oCUXG4gICAgLy8gbmV2ZXIgYXMgdGVuIHN0YWNrZWQgbW9kYWxzIGNhcnJ5aW5nIHRoZSBkYXRhYmFzZSdzIG93biB3b3JkaW5nLlxuICAgIC8vXG4gICAgLy8gQSBzZWFyY2ggdGhlIHNlcnZlciBjb3VsZCBub3QgYXBwbHkgKHNlYXJjaE5vdGU6IHRoZSBsaXN0IGhhcyBubyB0ZXh0XG4gICAgLy8gY29sdW1uKSBuYXJyb3dlZCBub3RoaW5nLCBzbyB0aGUgaXRlbSBkb2VzIG5vdCBjYXJyeSBpdC5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSwgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb2xsZWN0ZWRDb21wb25lbnQgPT4gKHNlYXJjaCAmJiAhZGF0YT8uc2VhcmNoTm90ZVxuICAgICAgICAgID8geyBjb21wb25lbnQsIGRhdGEsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9XG4gICAgICAgICAgOiB7IGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwsIGhpZGRlbkNvbHVtbnMgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLCBhbmQgdGhlIGN1cnJlbmN5IGl0IHNheXNcbiAgLy8gdGhlIHJlcG9ydCdzIG1vbmV5IGlzIGluIChhIGxhYmVsOiBub3RoaW5nIGlzIGNvbnZlcnRlZCkuIE9ubHkgdGhlXG4gIC8vIHNlcnZlcidzIHZhbHVlcyBhcmUgcHJpbnRlZDogdGhlIGJyb3dzZXIncyB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUnc1xuICAvLyBmYWxsYmFjayBmb3IgYW4gb2xkZXIgc2VydmVyKSBpcyBub3Qgd2hhdCB0aGUgbnVtYmVycyB3ZXJlIG1lYXN1cmVkIGluLFxuICAvLyBhbmQgYW4gb2xkZXIgc2VydmVyIG5hbWVzIG5vIGN1cnJlbmN5IGF0IGFsbC5cbiAgcHJpdmF0ZSBfY29udGV4dExpbmVzKHJlcG9ydDogUmVwb3J0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXSksXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5ID8gW2BDdXJyZW5jeTogJHtyZXBvcnQuZWZmZWN0aXZlQ3VycmVuY3l9YF0gOiBbXSksXG4gICAgXTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==