@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
@@ -0,0 +1,14 @@
1
+ // What a formula value works out of the query values it reads on its page
2
+ // (config.formula.of): change is a - b, percent_change (a - b) / |b| as a 0-1
3
+ // fraction, ratio a / b, and sum adds 2 to 10 values. The server evaluates
4
+ // it; the viewer only formats the number.
5
+ //
6
+ // Mirrors the server's ValueFormulaEnum value for value.
7
+ export var ReportValueFormula;
8
+ (function (ReportValueFormula) {
9
+ ReportValueFormula["Change"] = "change";
10
+ ReportValueFormula["PercentChange"] = "percent_change";
11
+ ReportValueFormula["Ratio"] = "ratio";
12
+ ReportValueFormula["Sum"] = "sum";
13
+ })(ReportValueFormula || (ReportValueFormula = {}));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZhbHVlLWZvcm11bGEuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybXVsYS5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YseURBQXlEO0FBQ3pELE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDNUIsdUNBQWlCLENBQUE7SUFDakIsc0RBQWdDLENBQUE7SUFDaEMscUNBQWUsQ0FBQTtJQUNmLGlDQUFXLENBQUE7QUFDYixDQUFDLEVBTFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUs3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFdoYXQgYSBmb3JtdWxhIHZhbHVlIHdvcmtzIG91dCBvZiB0aGUgcXVlcnkgdmFsdWVzIGl0IHJlYWRzIG9uIGl0cyBwYWdlXG4vLyAoY29uZmlnLmZvcm11bGEub2YpOiBjaGFuZ2UgaXMgYSAtIGIsIHBlcmNlbnRfY2hhbmdlIChhIC0gYikgLyB8YnwgYXMgYSAwLTFcbi8vIGZyYWN0aW9uLCByYXRpbyBhIC8gYiwgYW5kIHN1bSBhZGRzIDIgdG8gMTAgdmFsdWVzLiBUaGUgc2VydmVyIGV2YWx1YXRlc1xuLy8gaXQ7IHRoZSB2aWV3ZXIgb25seSBmb3JtYXRzIHRoZSBudW1iZXIuXG4vL1xuLy8gTWlycm9ycyB0aGUgc2VydmVyJ3MgVmFsdWVGb3JtdWxhRW51bSB2YWx1ZSBmb3IgdmFsdWUuXG5leHBvcnQgZW51bSBSZXBvcnRWYWx1ZUZvcm11bGEge1xuICBDaGFuZ2UgPSAnY2hhbmdlJyxcbiAgUGVyY2VudENoYW5nZSA9ICdwZXJjZW50X2NoYW5nZScsXG4gIFJhdGlvID0gJ3JhdGlvJyxcbiAgU3VtID0gJ3N1bScsXG59XG4iXX0=
@@ -10,7 +10,12 @@ import { pivotColumnSpecs } from '../option-builder';
10
10
  import { componentNoteLines, componentWindowsLine } from '../output-notes';
11
11
  import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
12
12
  import { ReportFilterStateService } from '../services/report-filter-state.service';
13
+ import { textPlain } from '../text';
14
+ import { failedValueKeys, isDrawn, shownValues, textValues, valueKeys, } from '../values';
13
15
  import * as i0 from "@angular/core";
16
+ // How far a KPI card's rows shrink to fit a short tile. A tile shorter still
17
+ // lets the card run past its foot rather than print it unreadably small.
18
+ const KPI_EXPORT_MIN_SCALE = 0.5;
14
19
  // How many tile queries an export runs at once.
15
20
  //
16
21
  // Not a politeness setting — it is the difference between a deck and a broken
@@ -22,6 +27,13 @@ import * as i0 from "@angular/core";
22
27
  // where the queries start taking it back off each other, and past that it buys
23
28
  // failures.
24
29
  const EXPORT_CONCURRENCY = 3;
30
+ // What the export gates call the header and footer: when a value they show
31
+ // came back without its number, and when one of their text blocks does not
32
+ // fit its box.
33
+ export const HEADER_FOOTER_NAME = 'Header & footer';
34
+ // How much of a text block's words the export gates quote to name a block that
35
+ // does not fit its box.
36
+ const OVERFLOW_SNIPPET_LENGTH = 40;
25
37
  // What a component with nothing to draw prints in the exported file.
26
38
  //
27
39
  // The two cases must not read alike. A tile that returned no rows is a finding
@@ -48,6 +60,17 @@ export function exportTitle(component, search) {
48
60
  export function isFailed(item) {
49
61
  return !item.data && item.component.type !== 'text';
50
62
  }
63
+ // A text block that does not fit its box in a built file, as the overflow gate
64
+ // names it: under its page (HEADER_FOOTER_NAME for a header or footer block)
65
+ // and by the start of its words, on one line. Shared by the PDF and the deck.
66
+ export function textOverflow(component, page, tokens) {
67
+ const text = textPlain(component.config?.html ?? '', tokens).replace(/\s+/g, ' ').trim();
68
+ return {
69
+ componentId: component.id,
70
+ page,
71
+ snippet: text.length > OVERFLOW_SNIPPET_LENGTH ? `${text.slice(0, OVERFLOW_SNIPPET_LENGTH).trimEnd()}…` : text,
72
+ };
73
+ }
51
74
  // The lines under the report's name on the PDF title page and the title slide:
52
75
  // the export date, the active filters, then what the numbers are measured in.
53
76
  // The date always leads (the PowerPoint marks that line as written in the
@@ -170,7 +193,9 @@ export function kpiCardHasExtras(view, notes) {
170
193
  // sparkline first, then the target line, then the notes; the value, its label
171
194
  // and the delta row always stay, and the window line stays whenever the card
172
195
  // shows a comparison (its days are what the delta is measured over). The
173
- // sparkline needs values to draw.
196
+ // sparkline needs values to draw. When what stays is still too tall, every
197
+ // row shrinks by the same scale, down to KPI_EXPORT_MIN_SCALE; by then the
198
+ // sparkline, the target and the notes are gone.
174
199
  export function kpiExportParts(view, notes, available, heights) {
175
200
  const parts = {
176
201
  delta: !!view.delta,
@@ -178,6 +203,7 @@ export function kpiExportParts(view, notes, available, heights) {
178
203
  target: !!view.target,
179
204
  sparkline: !!view.sparkline?.values.some((value) => value !== null),
180
205
  notes: [...notes],
206
+ scale: 1,
181
207
  };
182
208
  const height = () => kpiExportHeight(view, parts, heights);
183
209
  if (height() > available) {
@@ -192,8 +218,24 @@ export function kpiExportParts(view, notes, available, heights) {
192
218
  if (height() > available && !parts.delta) {
193
219
  parts.window = false;
194
220
  }
221
+ if (height() > available) {
222
+ parts.scale = Math.max(KPI_EXPORT_MIN_SCALE, Math.max(0, available) / height());
223
+ }
195
224
  return parts;
196
225
  }
226
+ // The heights scaled by the parts' scale: what the renderer lays the card
227
+ // out with, its text sized by the same scale.
228
+ export function scaledKpiHeights(heights, scale) {
229
+ return {
230
+ value: heights.value * scale,
231
+ label: heights.label * scale,
232
+ delta: heights.delta * scale,
233
+ window: heights.window * scale,
234
+ target: heights.target * scale,
235
+ sparkline: heights.sparkline * scale,
236
+ note: heights.note * scale,
237
+ };
238
+ }
197
239
  // How tall the card's drawn parts stand together, in the heights' unit.
198
240
  export function kpiExportHeight(view, parts, heights) {
199
241
  return heights.value
@@ -212,66 +254,70 @@ export function moreRowsNotice(remaining) {
212
254
  return `… ${remaining} more row(s) — use the component's CSV export for the full dataset`;
213
255
  }
214
256
  // The pages of a collected report that have at least one tile whose query
215
- // failed — what the export gate names to the user, and what makes "some of this
216
- // file is missing" a fact the caller can act on rather than a thing they notice
217
- // in the PDF afterwards.
257
+ // failed, or whose text shows a value that came back without its number, then
258
+ // HEADER_FOOTER_NAME when the header or footer shows one on a page that shows
259
+ // the master — what the failure gate names to the user, and what makes "some
260
+ // of this file is missing" a fact the caller can act on rather than a thing
261
+ // they notice in the PDF afterwards.
218
262
  export function failedPageNames(collected) {
219
263
  // Numbered before the filter — an unnamed page 4 that failed has to read
220
264
  // "Page 4", not "Page 1" because it happened to be the first failure.
221
- return collected.pages
265
+ const names = collected.pages
222
266
  .map((page, index) => ({ page, number: index + 1 }))
223
- .filter(({ page }) => page.components.some(isFailed))
267
+ .filter(({ page }) => page.components.some(isFailed)
268
+ || showsFailedValue(page.components.map((item) => item.component), page.failedValues))
224
269
  .map(({ page, number }) => page.page.name || `Page ${number}`);
270
+ const master = collected.report.master;
271
+ const showsMaster = collected.pages.some(({ page }) => !page.masterHidden);
272
+ if (master && showsMaster && showsFailedValue(master.components, collected.masterFailedValues)) {
273
+ names.push(HEADER_FOOTER_NAME);
274
+ }
275
+ return names;
276
+ }
277
+ // Whether any of the text blocks shows one of the failed value keys.
278
+ function showsFailedValue(components, failed) {
279
+ const shown = new Set(components
280
+ .filter((component) => component.type === 'text')
281
+ .flatMap((component) => valueKeys(component.config?.html)));
282
+ return failed.some((key) => shown.has(key));
225
283
  }
226
284
  // Gathers everything an export needs: every component's data across ALL pages
227
285
  // (the canvas only renders the active page, so exports can't scrape the
228
- // screen), fetched fresh with the viewer's current filter state.
286
+ // screen), and the numbers of the values their text reads, fetched fresh with
287
+ // the viewer's current filter state.
229
288
  //
230
- // A failed component resolves to a null `data` rather than failing the whole
231
- // collection — but that is so the caller can REPORT what failed, not so it can
232
- // be ignored: see failedPageNames() and the export gate that uses it.
289
+ // A failed component resolves to a null `data`, and a failed value to a key in
290
+ // its page's failedValues, rather than failing the whole collection — but that
291
+ // is so the caller can REPORT what failed, not so it can be ignored: see
292
+ // failedPageNames() and the failure gate that uses it.
233
293
  export class ReportExportCollectorService {
234
294
  _reportData = inject(ReportData);
235
295
  _filterState = inject(ReportFilterStateService);
236
296
  // listRows is how many rows each list fetches: the renderer's own cap, since
237
297
  // a PDF table continues onto extra pages and a slide table cannot.
238
298
  collect(report, listRows) {
239
- const slots = [];
240
- report.pages.forEach((page, pageIndex) => {
241
- for (const component of page.components) {
242
- slots.push({ pageIndex, component });
243
- }
244
- });
245
- // Text blocks have nothing to fetch — they ride through with no data. The
246
- // header/footer (report.master) is read by the renderers straight off the
247
- // report for the same reason.
248
- // Released a few at a time rather than all at once. mergeMap completes out
249
- // of order, so each result carries the slot it came from and the rows are
250
- // filed by index — the deck's page order can't depend on which query
251
- // happened to finish first.
252
- const all$ = slots.length
253
- ? from(slots.map((slot, index) => ({ slot, index })))
254
- .pipe(mergeMap(({ slot, index }) => this._componentData(report, slot.component, listRows)
255
- .pipe(map((item) => ({ item, index }))), EXPORT_CONCURRENCY), toArray())
299
+ const jobs = this._jobs(report);
300
+ const formatContext = this._filterState.formatContext();
301
+ // Released a few at a time rather than all at once, a page's values in the
302
+ // same queue as the tiles, so they never add to the queries already
303
+ // running. mergeMap completes out of order, so each result carries the job
304
+ // it came from and the rows are filed by index — the deck's page order
305
+ // can't depend on which query happened to finish first.
306
+ const all$ = jobs.length
307
+ ? from(jobs.map((job, index) => ({ job, index })))
308
+ .pipe(mergeMap(({ job, index }) => this._runJob(report, job, listRows, formatContext)
309
+ .pipe(map((result) => ({ result, index }))), EXPORT_CONCURRENCY), toArray())
256
310
  : of([]);
257
311
  // The summary rides alongside the component data rather than being built at
258
312
  // the end, because naming a select filter's values is itself a request.
259
313
  return forkJoin({ collected: all$, filterSummary: this.getFilterSummary(report) })
260
- .pipe(map(({ collected, filterSummary }) => {
261
- const pages = report.pages.map((page) => ({ page, components: [] }));
262
- [...collected]
263
- .sort((a, b) => a.index - b.index)
264
- .forEach(({ item, index }) => {
265
- pages[slots[index].pageIndex].components.push(item);
266
- });
267
- return {
268
- report,
269
- pages,
270
- filterSummary,
271
- contextLines: this._contextLines(report),
272
- formatContext: this._filterState.formatContext(),
273
- };
274
- }));
314
+ .pipe(map(({ collected, filterSummary }) => ({
315
+ report,
316
+ ...this._file(report, collected, formatContext),
317
+ filterSummary,
318
+ contextLines: this._contextLines(report),
319
+ formatContext,
320
+ })));
275
321
  }
276
322
  // "Report Period: Jun 12, 2025 – Jun 12, 2026", "Region: North, East" — one
277
323
  // line per filter group that has an active session value, then the group-by
@@ -312,6 +358,44 @@ export class ReportExportCollectorService {
312
358
  }
313
359
  return lines.length ? forkJoin(lines) : of([]);
314
360
  }
361
+ // Every request the export makes, in page order: each page's tiles, then the
362
+ // values its text shows; the header and footer's values last, when some page
363
+ // shows the master. Text blocks have nothing to fetch of their own — they
364
+ // ride through with no data, and their tokens are filled from their layer's
365
+ // values. A value is read only through its layer's request, never as a tile.
366
+ // The header/footer blocks (report.master) are read by the renderers
367
+ // straight off the report.
368
+ _jobs(report) {
369
+ const jobs = [];
370
+ report.pages.forEach((page, pageIndex) => {
371
+ page.components
372
+ .filter(isDrawn)
373
+ .forEach((component) => jobs.push({ kind: 'component', pageIndex, component }));
374
+ jobs.push(...this._valuesJobs(page, pageIndex));
375
+ });
376
+ if (report.master && report.pages.some((page) => !page.masterHidden)) {
377
+ jobs.push(...this._valuesJobs(report.master, null));
378
+ }
379
+ return jobs;
380
+ }
381
+ // A layer's one values job, or none when its text shows no value.
382
+ _valuesJobs(layer, pageIndex) {
383
+ const texts = layer.components.filter((component) => component.type === 'text');
384
+ const values = layer.values ?? [];
385
+ const shown = shownValues(values, texts);
386
+ return shown.length
387
+ ? [{ kind: 'values', pageIndex, pageId: layer.id, values, components: shown }]
388
+ : [];
389
+ }
390
+ // One queued job, its result tagged with the page it is filed under.
391
+ _runJob(report, job, listRows, formatContext) {
392
+ if (job.kind === 'component') {
393
+ return this._componentData(report, job.component, listRows)
394
+ .pipe(map((item) => ({ kind: 'component', pageIndex: job.pageIndex, item })));
395
+ }
396
+ return this._pageValues(report, job.pageId, job.values, job.components, formatContext)
397
+ .pipe(map((collected) => ({ kind: 'values', pageIndex: job.pageIndex, collected })));
398
+ }
315
399
  _componentData(report, component, listRows) {
316
400
  if (component.type === 'text') {
317
401
  return of({ component, data: null, hiddenColumns: [] });
@@ -337,7 +421,7 @@ export class ReportExportCollectorService {
337
421
  // whole, as the screen fetches them, and the renderers drop the cells.
338
422
  const hiddenColumns = [...this._filterState.hiddenColumns(component.id)];
339
423
  // handlers: false keeps the app's global error dialog out of this. A failed
340
- // tile is reported once, by the export gate, naming the pages it cost —
424
+ // tile is reported once, by the failure gate, naming the pages it cost —
341
425
  // never as ten stacked modals carrying the database's own wording.
342
426
  //
343
427
  // A search the server could not apply (searchNote: the list has no text
@@ -347,6 +431,48 @@ export class ReportExportCollectorService {
347
431
  ? { component, data, search, hiddenColumns }
348
432
  : { component, data, hiddenColumns })), catchError(() => of({ component, data: null, hiddenColumns })));
349
433
  }
434
+ // One layer's values, read in one request, as its text's tokens print them.
435
+ // The request carries the filter values of every value on the layer, as the
436
+ // canvas's does: the server decides which values it reads (the shown ones
437
+ // and the operands of the formulas among them) and applies to each only the
438
+ // entries naming its own filters. handlers: false keeps the error dialog out
439
+ // of it, as for a tile. A failed request reads as no rows, so every value
440
+ // the text shows failed and the failure gate names its page; one value's
441
+ // own error fails only that value, and a failed operand fails the formula
442
+ // that reads it.
443
+ _pageValues(report, pageId, values, shown, formatContext) {
444
+ const filters = values.flatMap((component) => this._filterState.resolveForComponent(component));
445
+ return this._reportData.pageValues(report.id, pageId, filters, true, { handlers: false })
446
+ .pipe(map((rows) => new Map((rows ?? []).map((row) => [row.id, row]))), catchError(() => of(new Map())), map((rows) => ({
447
+ values: textValues(values, { rows }, formatContext),
448
+ failedValues: failedValueKeys(shown, rows),
449
+ })));
450
+ }
451
+ // The results filed by page in job order. A layer with no values job (its
452
+ // text shows no value) has no numbers to wait for: its values read as the
453
+ // em dash, and none of them failed.
454
+ _file(report, results, formatContext) {
455
+ const unread = (values) => ({
456
+ values: textValues(values ?? [], { rows: new Map() }, formatContext),
457
+ failedValues: [],
458
+ });
459
+ const pages = report.pages.map((page) => ({ page, components: [], ...unread(page.values) }));
460
+ let master = unread(report.master?.values);
461
+ [...results]
462
+ .sort((a, b) => a.index - b.index)
463
+ .forEach(({ result }) => {
464
+ if (result.kind === 'component') {
465
+ pages[result.pageIndex].components.push(result.item);
466
+ }
467
+ else if (result.pageIndex === null) {
468
+ master = result.collected;
469
+ }
470
+ else {
471
+ Object.assign(pages[result.pageIndex], result.collected);
472
+ }
473
+ });
474
+ return { pages, masterValues: master.values, masterFailedValues: master.failedValues };
475
+ }
350
476
  // The zone the server resolved, as its IANA id, and the currency it says
351
477
  // the report's money is in (a label: nothing is converted). Only the
352
478
  // server's values are printed: the browser's zone (resolveReportTimezone's
@@ -382,4 +508,4 @@ export class ReportExportCollectorService {
382
508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
383
509
  type: Injectable
384
510
  }] });
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==
511
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YscUJBQXFCLEdBQ3RCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFHTCxtQkFBbUIsR0FXcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlD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QThFO0lBQzlFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHdDQUF3QztJQUNoQyxXQUFXLENBQ2pCLEtBQWEsRUFDYixLQUF3QixFQUN4QixRQUFnQixFQUNoQixNQUFpQjtRQUVqQixPQUFPLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQzthQUNwRixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDOUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25GLENBQUM7SUFDTixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHVFQUF1RTtJQUMvRCxLQUFLLENBQUMsS0FBdUM7UUFDbkQsT0FBTyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ2hGLENBQUM7d0dBbFJVLDRCQUE0Qjs0R0FBNUIsNEJBQTRCOzs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBmcm9tLCBtYXAsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtZXJnZU1hcCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1saXN0LWNvbHVtbi1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBEQVlfTE9ORyxcbiAgZm9ybWF0TG9jYWxEYXRlLFxuICBmb3JtYXROdW1iZXIsXG4gIGZvcm1hdE91dHB1dFZhbHVlLFxuICBmb3JtYXRSZXBvcnREYXRlLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRMb2NhbGVUYWcsXG4gIFJlcG9ydE1hc3RlcixcbiAgUmVwb3J0UGFnZSxcbiAgUmVwb3J0UGFnZVZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS3BpQ2FyZFZpZXcgfSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBsaXN0SGlkZGVuQ29sdW1ucyxcbiAgbGlzdE91dHB1dENvbHVtbnMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGNvbXBvbmVudE5vdGVMaW5lcywgY29tcG9uZW50V2luZG93c0xpbmUgfSBmcm9tICcuLi9vdXRwdXQtbm90ZXMnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kTGFiZWwsIGxvYWRHcm91cE9wdGlvbnMsIHJlc29sdmVPcHRpb25WYWx1ZXMgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUZXh0VG9rZW5Db250ZXh0LCBUZXh0VmFsdWUsIHRleHRQbGFpbiB9IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHtcbiAgZmFpbGVkVmFsdWVLZXlzLCBpc0RyYXduLCBzaG93blZhbHVlcywgdGV4dFZhbHVlcywgdmFsdWVLZXlzLFxufSBmcm9tICcuLi92YWx1ZXMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbiAgLy8gVGhlIHRleHQgYSBsaXN0IHdhcyBzZWFyY2hlZCBieSB3aGVuIGl0IHdhcyBmZXRjaGVkOyBhYnNlbnQgd2hlbiBpdHNcbiAgLy8gc2VhcmNoIGJveCB3YXMgZW1wdHksIGFuZCBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBwbGFpbiBsaXN0LCB3aGljaCBpdHMgdGFibGUgbGVhdmVzXG4gIC8vIG91dCAobGlzdENvbHVtbnMpOyBlbXB0eSBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG4gIC8vIFdoYXQgdGhlIHBhZ2UncyB0ZXh0IGJsb2NrcyBmaWxsIHRoZWlyIHt7dmFsdWUuPGtleT59fSB0b2tlbnMgd2l0aCwgYnkga2V5XG4gIC8vICh0ZXh0VmFsdWVzKSwgYW5kIHRoZSBrZXlzIG9mIHRoZSB2YWx1ZXMgaXRzIHRleHQgc2hvd3Mgd2hvc2UgbnVtYmVycyBkaWRcbiAgLy8gbm90IGNvbWUgYmFjazogdGhlIHJlcXVlc3QgZmFpbGVkLCBvciB0aGUgdmFsdWUncyBvd24gcXVlcnkgZGlkLlxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIGZhaWxlZFZhbHVlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlcidzIHZhbHVlcywgYXMgYSBwYWdlJ3M6IHJlYWQgb25jZSBmb3IgdGhlIHdob2xlXG4gIC8vIGZpbGUsIHNpbmNlIGV2ZXJ5IHBhZ2UgdGhhdCBzaG93cyB0aGUgbWFzdGVyIHNob3dzIHRoZSBzYW1lIG51bWJlcnMuXG4gIG1hc3RlclZhbHVlczogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPjtcbiAgbWFzdGVyRmFpbGVkVmFsdWVzOiBzdHJpbmdbXTtcbiAgLy8gSHVtYW4tcmVhZGFibGUgbGluZXMgZGVzY3JpYmluZyB0aGUgYWN0aXZlIGZpbHRlcnMsIGZvciB0aGUgdGl0bGUgc2xpZGUvcGFnZS5cbiAgZmlsdGVyU3VtbWFyeTogc3RyaW5nW107XG4gIC8vIFdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2U6IHRoZSB6b25lIGFuZFxuICAvLyB0aGUgY3VycmVuY3kgdGhlIHNlcnZlciByZXNvbHZlZCBmb3IgdGhlIHJlcG9ydC4gRWFjaCBpcyBsZWZ0IG91dCB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBpdCwgcmF0aGVyIHRoYW4gYSBndWVzcyB0aGF0IHdvdWxkIGJlIHdyb25nIHdoZW5ldmVyXG4gIC8vIHRoZSBkZWZhdWx0IGFwcGxpZXMuXG4gIGNvbnRleHRMaW5lczogc3RyaW5nW107XG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAoaXRzIGxvY2FsZSwgY3VycmVuY3lcbiAgLy8gYW5kIHBlcmNlbnQgZm9ybSksIHJlYWQgb25jZSBzbyBldmVyeSBwYWdlIG9mIHRoZSBmaWxlIGFncmVlcy5cbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbn1cblxuLy8gQSB0ZXh0IGJsb2NrIHdob3NlIHdvcmRzIGRvIG5vdCBmaXQgaXRzIGJveCBpbiBhIGJ1aWx0IGZpbGU6IHRoZSBibG9jaywgdGhlXG4vLyBwYWdlIHRoZSBvdmVyZmxvdyBnYXRlIG5hbWVzIGl0IHVuZGVyIChIRUFERVJfRk9PVEVSX05BTUUgZm9yIGEgaGVhZGVyIG9yXG4vLyBmb290ZXIgYmxvY2spIGFuZCB0aGUgc3RhcnQgb2YgaXRzIHRleHQsIHNvIHRoZSByZWFkZXIgY2FuIGZpbmQgaXQuXG5leHBvcnQgaW50ZXJmYWNlIFRleHRPdmVyZmxvdyB7XG4gIGNvbXBvbmVudElkOiBudW1iZXI7XG4gIHBhZ2U6IHN0cmluZztcbiAgc25pcHBldDogc3RyaW5nO1xufVxuXG4vLyBBIGZpbGUgYnVpbHQgYW5kIG5vdCB5ZXQgc2F2ZWQuIFdoZXRoZXIgdGV4dCBmaXRzIGl0cyBib3ggaXMga25vd24gb25seSBvbmNlXG4vLyB0aGUgZmlsZSBpcyBidWlsdCwgc28gdGhlIGV4cG9ydCBhc2tzIGFib3V0IHRoZSBvdmVyZmxvd3MgYmV0d2VlbiB0aGUgYnVpbGRcbi8vIGFuZCB0aGUgc2F2ZTogYG92ZXJmbG93Tm90ZWAgc2F5cyB3aGF0IHRoaXMgZm9ybWF0IGRvZXMgd2l0aCBzdWNoIHRleHQsIGFuZFxuLy8gYHNhdmVgIHdyaXRlcyB0aGUgZmlsZS5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbHRFeHBvcnQge1xuICBvdmVyZmxvd3M6IFRleHRPdmVyZmxvd1tdO1xuICBvdmVyZmxvd05vdGU6IHN0cmluZztcbiAgc2F2ZTogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIE9uZSBleHBvcnRlZCBsaXN0IGNvbHVtbjogdGhlIGNlbGwga2V5LCBpdHMgaGVhZGluZyBhbmQgaXRzIGZvcm1hdCwgYW5kXG4vLyB3aGV0aGVyIGl0cyBjZWxscyBhcmUgZm9ybWF0dGVkIG51bWJlcnMsIHdoaWNoIGV2ZXJ5IGV4cG9ydCByaWdodC1hbGlnbnNcbi8vIChoZWFkZXIgaW5jbHVkZWQpIGFzIHRoZSBzY3JlZW4gZG9lcy4gQSBjb2x1bW4gdGhhdCBob2xkcyBhIGNvbXBhcmVkLFxuLy8gd2luZG93ZWQsIHJhbmtlZCBvciBzaGFyZWQgb3V0cHV0IGNhcnJpZXMgaG93IGl0IGlzIHdyaXR0ZW4gKG91dHB1dCksIGFuZFxuLy8gaG9sZHMgbnVtYmVycyB3aGV0aGVyIG9yIG5vdCBpdCBuYW1lcyBhIGZvcm1hdC5cbmV4cG9ydCB0eXBlIEV4cG9ydExpc3RDb2x1bW4gPSBMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuOyBvdXRwdXQ/OiBMaXN0T3V0cHV0Q29sdW1uIH07XG5cbi8vIEhvdyB0YWxsIGVhY2ggcGFydCBvZiBhbiBleHBvcnRlZCBLUEkgY2FyZCBpcywgaW4gdGhlIHJlbmRlcmVyJ3MgdW5pdFxuLy8gKHBvaW50cyBpbiB0aGUgUERGLCBpbmNoZXMgaW4gdGhlIGRlY2spLiBBIG5vdGUgaXMgb25lIGxpbmUuXG5leHBvcnQgaW50ZXJmYWNlIEtwaUV4cG9ydEhlaWdodHMge1xuICB2YWx1ZTogbnVtYmVyO1xuICBsYWJlbDogbnVtYmVyO1xuICBkZWx0YTogbnVtYmVyO1xuICB3aW5kb3c6IG51bWJlcjtcbiAgdGFyZ2V0OiBudW1iZXI7XG4gIHNwYXJrbGluZTogbnVtYmVyO1xuICBub3RlOiBudW1iZXI7XG59XG5cbi8vIFRoZSBwYXJ0cyBvZiBhIEtQSSBjYXJkIGFuIGV4cG9ydCBkcmF3czogdGhlIHZhbHVlIGFuZCBpdHMgbGFiZWwgYWx3YXlzLFxuLy8gdGhlIHJlc3Qgd2hlbiB0aGUgY2FyZCBoYXMgdGhlbSBhbmQgdGhlIHRpbGUgaGFzIHJvb20gKGtwaUV4cG9ydFBhcnRzKS5cbi8vIHNjYWxlIHNocmlua3MgdGhlIHJvd3MgYW5kIHRoZWlyIHRleHQgd2hlbiB0aGUgcGFydHMgdGhhdCBhbHdheXMgc3RheSBzdGlsbFxuLy8gc3RhbmQgdGFsbGVyIHRoYW4gdGhlIHRpbGUgKHNjYWxlZEtwaUhlaWdodHMpOiAxIHdoZW4gdGhleSBmaXQuXG5leHBvcnQgaW50ZXJmYWNlIEtwaUV4cG9ydFBhcnRzIHtcbiAgZGVsdGE6IGJvb2xlYW47XG4gIHdpbmRvdzogYm9vbGVhbjtcbiAgdGFyZ2V0OiBib29sZWFuO1xuICBzcGFya2xpbmU6IGJvb2xlYW47XG4gIG5vdGVzOiBzdHJpbmdbXTtcbiAgc2NhbGU6IG51bWJlcjtcbn1cblxuLy8gSG93IGZhciBhIEtQSSBjYXJkJ3Mgcm93cyBzaHJpbmsgdG8gZml0IGEgc2hvcnQgdGlsZS4gQSB0aWxlIHNob3J0ZXIgc3RpbGxcbi8vIGxldHMgdGhlIGNhcmQgcnVuIHBhc3QgaXRzIGZvb3QgcmF0aGVyIHRoYW4gcHJpbnQgaXQgdW5yZWFkYWJseSBzbWFsbC5cbmNvbnN0IEtQSV9FWFBPUlRfTUlOX1NDQUxFID0gMC41O1xuXG4vLyBIb3cgbWFueSB0aWxlIHF1ZXJpZXMgYW4gZXhwb3J0IHJ1bnMgYXQgb25jZS5cbi8vXG4vLyBOb3QgYSBwb2xpdGVuZXNzIHNldHRpbmcg4oCUIGl0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBkZWNrIGFuZCBhIGJyb2tlblxuLy8gb25lLiBUaGVzZSBxdWVyaWVzIGFyZSBoZWF2eSBhbmQgcmVhZCB0aGUgc2FtZSB0YWJsZXMsIHNvIGZpcmluZyBhbGwgb2YgdGhlbVxuLy8gdG9nZXRoZXIgcHV0cyBldmVyeSBvbmUgaW4gY29udGVudGlvbiBmb3IgdGhlIHNhbWUgZGF0YWJhc2UgYXQgdGhlIHNhbWVcbi8vIG1vbWVudCBhbmQgdGhleSBjcm9zcyB0aGUgc3RhdGVtZW50IGNlaWxpbmcgYXMgYSBncm91cDogbWVhc3VyZWQgb24gcmVwb3J0XG4vLyAyOCwgdGVuIHRpbGVzIHRoYXQgZWFjaCBhbnN3ZXIgaW4gOS0yNHMgcnVuIG9uZSBhZnRlciBhbm90aGVyIGFsbCBmYWlsZWQgYXRcbi8vIH4zMHMgd2hlbiByZWxlYXNlZCB0b2dldGhlci4gQ29uY3VycmVuY3kgYnV5cyB3YWxsLWNsb2NrIG9ubHkgdXAgdG8gdGhlIHBvaW50XG4vLyB3aGVyZSB0aGUgcXVlcmllcyBzdGFydCB0YWtpbmcgaXQgYmFjayBvZmYgZWFjaCBvdGhlciwgYW5kIHBhc3QgdGhhdCBpdCBidXlzXG4vLyBmYWlsdXJlcy5cbmNvbnN0IEVYUE9SVF9DT05DVVJSRU5DWSA9IDM7XG5cbi8vIFdoYXQgdGhlIGV4cG9ydCBnYXRlcyBjYWxsIHRoZSBoZWFkZXIgYW5kIGZvb3Rlcjogd2hlbiBhIHZhbHVlIHRoZXkgc2hvd1xuLy8gY2FtZSBiYWNrIHdpdGhvdXQgaXRzIG51bWJlciwgYW5kIHdoZW4gb25lIG9mIHRoZWlyIHRleHQgYmxvY2tzIGRvZXMgbm90XG4vLyBmaXQgaXRzIGJveC5cbmV4cG9ydCBjb25zdCBIRUFERVJfRk9PVEVSX05BTUUgPSAnSGVhZGVyICYgZm9vdGVyJztcblxuLy8gSG93IG11Y2ggb2YgYSB0ZXh0IGJsb2NrJ3Mgd29yZHMgdGhlIGV4cG9ydCBnYXRlcyBxdW90ZSB0byBuYW1lIGEgYmxvY2sgdGhhdFxuLy8gZG9lcyBub3QgZml0IGl0cyBib3guXG5jb25zdCBPVkVSRkxPV19TTklQUEVUX0xFTkdUSCA9IDQwO1xuXG4vLyBPbmUgcmVxdWVzdCBpbiBhbiBleHBvcnQncyBxdWV1ZTogYSB0aWxlJ3MgZGF0YSwgb3IgdGhlIG51bWJlcnMgb2YgdGhlXG4vLyB2YWx1ZXMgb25lIGxheWVyJ3MgdGV4dCByZWFkcywgcmVhZCB0b2dldGhlci4gQSB2YWx1ZXMgam9iJ3MgcGFnZUluZGV4IGlzXG4vLyBudWxsIGZvciB0aGUgaGVhZGVyIGFuZCBmb290ZXIgKHRoZSBtYXN0ZXIpOyBgdmFsdWVzYCBpcyBldmVyeSB2YWx1ZSBvZiB0aGVcbi8vIGxheWVyLCB3aGljaCBuYW1lcyBpdHMgdG9rZW5zIGFuZCB3aG9zZSBmaWx0ZXIgdmFsdWVzIHRoZSByZXF1ZXN0IGNhcnJpZXMsXG4vLyBhbmQgYGNvbXBvbmVudHNgIHRoZSBvbmVzIGl0cyB0ZXh0IHNob3dzLCB3aG9zZSBudW1iZXJzIHRoZSBmYWlsdXJlIGdhdGVcbi8vIHJlcXVpcmVzLlxudHlwZSBDb2xsZWN0Sm9iID1cbiAgfCB7IGtpbmQ6ICdjb21wb25lbnQnOyBwYWdlSW5kZXg6IG51bWJlcjsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfVxuICB8IHtcbiAgICBraW5kOiAndmFsdWVzJztcbiAgICBwYWdlSW5kZXg6IG51bWJlciB8IG51bGw7XG4gICAgcGFnZUlkOiBudW1iZXI7XG4gICAgdmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXTtcbiAgICBjb21wb25lbnRzOiBSZXBvcnRDb21wb25lbnRbXTtcbiAgfTtcblxuLy8gT25lIGxheWVyJ3MgdmFsdWVzIGFzIHRoZSBmaWxlIHByaW50cyB0aGVtLlxudHlwZSBDb2xsZWN0ZWRWYWx1ZXMgPSBQaWNrPENvbGxlY3RlZFBhZ2UsICd2YWx1ZXMnIHwgJ2ZhaWxlZFZhbHVlcyc+O1xuXG4vLyBXaGF0IGEgam9iIGNhbWUgYmFjayB3aXRoLCBhbmQgdGhlIHBhZ2UgaXQgaXMgZmlsZWQgdW5kZXIuXG50eXBlIENvbGxlY3RSZXN1bHQgPVxuICB8IHsga2luZDogJ2NvbXBvbmVudCc7IHBhZ2VJbmRleDogbnVtYmVyOyBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQgfVxuICB8IHsga2luZDogJ3ZhbHVlcyc7IHBhZ2VJbmRleDogbnVtYmVyIHwgbnVsbDsgY29sbGVjdGVkOiBDb2xsZWN0ZWRWYWx1ZXMgfTtcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBBIGNvbXBvbmVudCdzIHRpdGxlIGFzIGFuIGV4cG9ydGVkIGZpbGUgcHJpbnRzIGl0LiBBIHNlYXJjaGVkIGxpc3Qgc2F5cyBzbyxcbi8vIHNpbmNlIGl0cyB0YWJsZSBob2xkcyBvbmx5IHRoZSBtYXRjaGluZyByb3dzOiAnT3JkZXJzIChtYXRjaGluZyBcIm5vcnRoXCIpJy5cbi8vIEFuIHVudGl0bGVkIG9uZSByZWFkcyAnTWF0Y2hpbmcgXCJub3J0aFwiJy4gJycgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHByaW50LlxuLy8gU2hhcmVkIGJ5IHRoZSBQREYgYW5kIHRoZSBkZWNrLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIEEgdGV4dCBibG9jayB0aGF0IGRvZXMgbm90IGZpdCBpdHMgYm94IGluIGEgYnVpbHQgZmlsZSwgYXMgdGhlIG92ZXJmbG93IGdhdGVcbi8vIG5hbWVzIGl0OiB1bmRlciBpdHMgcGFnZSAoSEVBREVSX0ZPT1RFUl9OQU1FIGZvciBhIGhlYWRlciBvciBmb290ZXIgYmxvY2spXG4vLyBhbmQgYnkgdGhlIHN0YXJ0IG9mIGl0cyB3b3Jkcywgb24gb25lIGxpbmUuIFNoYXJlZCBieSB0aGUgUERGIGFuZCB0aGUgZGVjay5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T3ZlcmZsb3coY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHBhZ2U6IHN0cmluZywgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogVGV4dE92ZXJmbG93IHtcbiAgY29uc3QgdGV4dCA9IHRleHRQbGFpbihjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnLCB0b2tlbnMpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLFxuICAgIHBhZ2UsXG4gICAgc25pcHBldDogdGV4dC5sZW5ndGggPiBPVkVSRkxPV19TTklQUEVUX0xFTkdUSCA/IGAke3RleHQuc2xpY2UoMCwgT1ZFUkZMT1dfU05JUFBFVF9MRU5HVEgpLnRyaW1FbmQoKX3igKZgIDogdGV4dCxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIHVuZGVyIHRoZSByZXBvcnQncyBuYW1lIG9uIHRoZSBQREYgdGl0bGUgcGFnZSBhbmQgdGhlIHRpdGxlIHNsaWRlOlxuLy8gdGhlIGV4cG9ydCBkYXRlLCB0aGUgYWN0aXZlIGZpbHRlcnMsIHRoZW4gd2hhdCB0aGUgbnVtYmVycyBhcmUgbWVhc3VyZWQgaW4uXG4vLyBUaGUgZGF0ZSBhbHdheXMgbGVhZHMgKHRoZSBQb3dlclBvaW50IG1hcmtzIHRoYXQgbGluZSBhcyB3cml0dGVuIGluIHRoZVxuLy8gcmVwb3J0J3MgbG9jYWxlKS4gSXQgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVyc1xuLy8gcmVzb2x2ZSBcInRvZGF5XCIgdG8sIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cbmV4cG9ydCBmdW5jdGlvbiBjb3ZlckxpbmVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGZvcm1hdExvY2FsRGF0ZShcbiAgICAgIG5ldyBEYXRlKCksXG4gICAgICBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dC5sb2NhbGUsXG4gICAgICBEQVlfTE9ORyxcbiAgICAgIHJlc29sdmVSZXBvcnRUaW1lem9uZShjb2xsZWN0ZWQucmVwb3J0KSxcbiAgICApLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbCwgdGhyb3VnaCB0aGUgc2FtZVxuLy8gZnVuY3Rpb25zIGFzIHRoZSBzY3JlZW46IGEgZGF0ZSBjb2x1bW4gcmVuZGVycyBpbiB0aGUgcmVwb3J0J3Mgem9uZSBhbmRcbi8vIGxvY2FsZSwgYW5kIGEgY29sdW1uIHdpdGggbnVtYmVyLWZvcm1hdCBrZXlzIChhIGNyb3NzLXRhYidzIGNlbGxzIHRocm91Z2hcbi8vIGl0cyBjZWxsRm9ybWF0KSBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlIGFuZCBjdXJyZW5jeS4gQW55IG90aGVyIHZhbHVlIGdvZXNcbi8vIG91dCB2ZXJiYXRpbSwgYW5kIGFuIGVtcHR5IG9uZSBhcyAnJy4gQ1NWIG5ldmVyIGNvbWVzIHRocm91Z2ggaGVyZTogaXRzXG4vLyB2YWx1ZXMgc3RheSByYXcuXG4vL1xuLy8gQW4gb3V0cHV0IGNvbHVtbiBpcyB3cml0dGVuIGJ5IHdoYXQgaXQgaG9sZHMsIGFzIHRoZSBzY3JlZW4ncyBjZWxsIGlzXG4vLyAoZm9ybWF0T3V0cHV0VmFsdWUpOiBhIHNpZ25lZCBjaGFuZ2UsIGEgcGVyY2VudCBjaGFuZ2UsIGEgY2hhbmdlIG9mIGEgcmF0ZVxuLy8gaW4gcG9pbnRzLCBhIHJhbmssIGEgc2hhcmUuIEl0cyByb3cgZ2l2ZXMgYSBjaGFuZ2UgdGhlIHByaW9yIGJlc2lkZSBpdCwgc29cbi8vIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIHJlYWRzIGFwYXJ0IGZyb20gYSB6ZXJvIG9uZSAoJ24vYScpLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENlbGwoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IExpc3RDb2x1bW4gJiB7IG91dHB1dD86IExpc3RPdXRwdXRDb2x1bW4gfSxcbiAgdGltZXpvbmU6IHN0cmluZyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcm93PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gY29sdW1uLm91dHB1dDtcblxuICBpZiAob3V0cHV0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHZhbHVlLCBvdXRwdXQub3V0cHV0LCBjb2x1bW4sIGNvbnRleHQsIHtcbiAgICAgIG1lYXN1cmVTcGVjOiBvdXRwdXQubWVhc3VyZVNwZWMsXG4gICAgICBwcmlvcjogb3V0cHV0LnByaW9yQWxpYXMgJiYgcm93ID8gcm93W291dHB1dC5wcmlvckFsaWFzXSA6IHVuZGVmaW5lZCxcbiAgICAgIGZsb29yOiBvdXRwdXQuZmxvb3IsXG4gICAgICBlbXB0eTogJycsXG4gICAgfSkudGV4dDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCB0aW1lem9uZSwgY29udGV4dC5sb2NhbGUpO1xuICB9XG5cbiAgcmV0dXJuIGhhc051bWJlckZvcm1hdChjb2x1bW4pID8gZm9ybWF0TnVtYmVyKHZhbHVlLCBjb2x1bW4sIGNvbnRleHQsIHsgZW1wdHk6ICcnIH0pIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuLy8gVGhlIGNvbHVtbnMgYW4gZXhwb3J0ZWQgbGlzdCB0YWJsZSBkcmF3cy4gQSBjcm9zcy10YWIncyBhcnJpdmUgd2l0aCBpdHNcbi8vIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZSByZXN1bHRcbi8vIGtub3dzIHRoZSBwaXZvdCB2YWx1ZXMsIGFuZCBhcmUgYnVpbHQgYnkgcGl2b3RDb2x1bW5TcGVjcygpIGFzIG9uIHNjcmVlbjpcbi8vIGhlYWRlZCBieSBpdHMgcGVyaW9kcyBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBlYWNoIHBpdm90IHZhbHVlIGZvcm1hdHRlZCBieVxuLy8gY2VsbEZvcm1hdC4gQSBwbGFpbiBsaXN0IGRyYXdzIGl0cyBjb25maWd1cmVkIGNvbHVtbnMgYnV0IHRoZSBvbmVzIHRoZVxuLy8gdmlld2VyIGhpZCAoYGhpZGRlbmAsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnMsIHNvIG5ldmVyIGFsbCBvZiB0aGVtKSxcbi8vIGVsc2UgZXZlcnkgY29sdW1uIHRoZSBxdWVyeSByZXR1cm5lZCwgYXMgaXQgY2FtZS4gT3V0cHV0IGNvbHVtbnMgKHRoZVxuLy8gZGF0YSdzIG91dHB1dHMsIGEgY3Jvc3MtdGFiIGNlbGwgdGhyb3VnaCBjZWxsTWVhc3VyZXMpIGNhcnJ5IGhvdyB0aGV5IGFyZVxuLy8gd3JpdHRlbjsgd2l0aG91dCB0aG9zZSBrZXlzIHRoZSBjb2x1bW5zIGFyZSBleGFjdGx5IGFzIGJlZm9yZS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q29sdW1ucyhcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBoaWRkZW46IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4pOiBFeHBvcnRMaXN0Q29sdW1uW10ge1xuICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcblxuICBpZiAoY29uZmlnLnBpdm90Qnk/LmNvbHVtbikge1xuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgbG9jYWxlKSwgZGF0YSwgW10pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICBjb25zdCBoaWRkZW5OYW1lcyA9IGxpc3RIaWRkZW5Db2x1bW5zKGNvbmZpZywgaGlkZGVuKTtcblxuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgICAgIGNvbmZpZy5jb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gIWhpZGRlbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpLFxuICAgICAgZGF0YSxcbiAgICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMoZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIG51bWVyaWM6IGZhbHNlIH0pKSwgZGF0YSwgW10pO1xufVxuXG4vLyBUaGUgY29sdW1ucyB3aXRoIHRoZWlyIG91dHB1dCBtZXRhZGF0YSBhdHRhY2hlZCAobGlzdE91dHB1dENvbHVtbnMsIGFzIHRoZVxuLy8gc2NyZWVuJ3MgbGlzdCByZXNvbHZlcyBpdCk6IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgbnVtYmVycyBhbmQgaXMgd3JpdHRlblxuLy8gYnkgd2hhdCBpdCBob2xkcy4gVW5jaGFuZ2VkIHdoZW4gdGhlIGRhdGEgaGFzIG5vIG91dHB1dHMuXG5mdW5jdGlvbiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgY29sdW1uczogRXhwb3J0TGlzdENvbHVtbltdLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBhdXRob3JlZDogcmVhZG9ubHkgTGlzdENvbHVtbltdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgaWYgKCFkYXRhLm91dHB1dHMpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHMgPSBsaXN0T3V0cHV0Q29sdW1ucyhjb2x1bW5zLCBkYXRhLCBhdXRob3JlZCk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChvdXRwdXRzW2NvbHVtbi5jb2x1bW5dXG4gICAgPyB7IC4uLmNvbHVtbiwgbnVtZXJpYzogdHJ1ZSwgb3V0cHV0OiBvdXRwdXRzW2NvbHVtbi5jb2x1bW5dIH1cbiAgICA6IGNvbHVtbikpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGEgcGxhaW4gbGlzdCdzIGNvbmZpZ3VyZWRcbi8vIGxhYmVsLCBlbHNlIGl0cyBjb2x1bW47IGEgY3Jvc3MtdGFiJ3MgaGVhZGluZyBmcm9tIHBpdm90Q29sdW1uU3BlY3MoKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0SGVhZGluZ3MoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhLCBsb2NhbGUsIGhpZGRlbikubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKTtcbn1cblxuLy8gQW4gZXhwb3J0ZWQgbGlzdCdzIHRvdGFscyByb3csIG9uZSBjZWxsIHBlciBjb2x1bW4gb2YgbGlzdENvbHVtbnMoKTogZWFjaFxuLy8gdG90YWwgd3JpdHRlbiBsaWtlIGl0cyBjb2x1bW4ncyBjZWxscywgYW5kIExJU1RfVE9UQUxfTEFCRUwgaW4gdGhlIGZpcnN0XG4vLyBjb2x1bW4gd2hlbiB0aGF0IGNvbHVtbiBob2xkcyBubyB0b3RhbCAoYSBjcm9zcy10YWIncyByb3cga2V5KS4gbnVsbCB3aGVuXG4vLyB0aGUgbGlzdCBoYXMgbm8gdG90YWxzLiBUaGUgQ1NWIG5ldmVyIGNhcnJpZXMgb25lOiBpdHMgcm93cyBzdGF5IHJhdy5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0VG90YWxzUm93KFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjb2x1bW5zOiByZWFkb25seSBFeHBvcnRMaXN0Q29sdW1uW10sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmdbXSB8IG51bGwge1xuICBjb25zdCB0b3RhbHMgPSBkYXRhLnRvdGFscztcblxuICBpZiAoIXRvdGFscykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBsaXN0VG90YWxzTGFiZWxDb2x1bW4oY29sdW1ucywgdG90YWxzKTtcblxuICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKGNvbHVtbi5jb2x1bW4gPT09IGxhYmVsXG4gICAgPyBMSVNUX1RPVEFMX0xBQkVMXG4gICAgOiBleHBvcnRDZWxsKHRvdGFsc1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCB0aW1lem9uZSwgY29udGV4dCwgdG90YWxzKSkpO1xufVxuXG4vLyBUaGUgc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlOiB0aGUgZGF5cyBpdCByZWFkcywgYW5kIHRoZVxuLy8gZGF5cyBlYWNoIGNvbXBhcmlzb24gbGFuZSByZWFkcyAoJ1NlcCAxIOKAkyAxNSwgMjAyNiDCtyB2cyBwcmV2aW91cyBtb250aDpcbi8vIEF1ZyAxIOKAkyAxNSwgMjAyNicpLCBhcyB0aGUgc2NyZWVuJ3Mgbm90ZSBvcGVucyB3aXRoLiAnJyB3aXRob3V0IGFcbi8vIGNvbXBhcmlzb24gb3IgYSB0aW1lZnJhbWUsIGFuZCBmb3IgYSBLUEksIHdob3NlIGNhcmQgcHJpbnRzIGl0cyBvd24gd2luZG93XG4vLyBsaW5lLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFdpbmRvd3NMaW5lKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBpZiAoIWl0ZW0uZGF0YSB8fCBpdGVtLmNvbXBvbmVudC50eXBlID09PSAna3BpJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRXaW5kb3dzTGluZShpdGVtLmRhdGEsIHsgbG9jYWxlLCB0aW1lem9uZSB9KTtcbn1cblxuLy8gVGhlIG5vdGUgbGluZXMgdW5kZXIgYSBjb21wb25lbnQncyBib3g6IHdoeSBhIGNvbXBhcmlzb24gcmVhZHMgYXMgaXQgZG9lcyxcbi8vIGEgS1BJJ3MgZGVsdGEgbm90ZSwgYW5kIHdoYXQgZWFjaCB3aW5kb3dlZCB2YWx1ZSBpcyBhbmQgd2h5LiBUaGUgZGF5cyBhcmVcbi8vIGxlZnQgb3V0ICh0aGUgc3VidGl0bGUgb3IgdGhlIEtQSSBjYXJkIHByaW50cyB0aGVtKSwgYW5kIHRoZSB3aW5kb3dcbi8vIGRlc2NyaXB0aW9ucyBhcmUgaW4sIHNpbmNlIGEgZmlsZSBoYXMgbm8gdG9vbHRpcCBvciBoZWFkZXIgdG8gY2FycnkgdGhlbS5cbi8vIEVtcHR5IHdoZW4gdGhlIGRhdGEgaGFzIG5vbmUgb2YgdGhlIGtleXMuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Tm90ZUxpbmVzKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROb3RlTGluZXMoaXRlbS5kYXRhLCB7IGxvY2FsZSwgdGltZXpvbmUgfSwgeyB3aW5kb3dzOiBmYWxzZSwgd2luZG93RGVzY3JpcHRpb25zOiB0cnVlIH0pO1xufVxuXG4vLyBXaGV0aGVyIGEgS1BJIGNhcmQgaGFzIG1vcmUgdG8gZHJhdyB0aGFuIGl0cyB2YWx1ZSBhbmQgbGFiZWwuIFdpdGhvdXQsIGJvdGhcbi8vIGV4cG9ydHMgZHJhdyB0aGUgdGlsZSBleGFjdGx5IGFzIHRoZXkgYWx3YXlzIGhhdmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpQ2FyZEhhc0V4dHJhcyh2aWV3OiBLcGlDYXJkVmlldywgbm90ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhISh2aWV3LmRlbHRhIHx8IHZpZXcud2luZG93IHx8IHZpZXcudGFyZ2V0IHx8IHZpZXcuc3BhcmtsaW5lIHx8IG5vdGVzLmxlbmd0aCk7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIGEgS1BJIGNhcmQgZml0IGEgdGlsZSBgYXZhaWxhYmxlYCB0YWxsLiBBIHNob3J0IHRpbGUgc2hlZHMgdGhlXG4vLyBzcGFya2xpbmUgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBsaW5lLCB0aGVuIHRoZSBub3RlczsgdGhlIHZhbHVlLCBpdHMgbGFiZWxcbi8vIGFuZCB0aGUgZGVsdGEgcm93IGFsd2F5cyBzdGF5LCBhbmQgdGhlIHdpbmRvdyBsaW5lIHN0YXlzIHdoZW5ldmVyIHRoZSBjYXJkXG4vLyBzaG93cyBhIGNvbXBhcmlzb24gKGl0cyBkYXlzIGFyZSB3aGF0IHRoZSBkZWx0YSBpcyBtZWFzdXJlZCBvdmVyKS4gVGhlXG4vLyBzcGFya2xpbmUgbmVlZHMgdmFsdWVzIHRvIGRyYXcuIFdoZW4gd2hhdCBzdGF5cyBpcyBzdGlsbCB0b28gdGFsbCwgZXZlcnlcbi8vIHJvdyBzaHJpbmtzIGJ5IHRoZSBzYW1lIHNjYWxlLCBkb3duIHRvIEtQSV9FWFBPUlRfTUlOX1NDQUxFOyBieSB0aGVuIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGUgdGFyZ2V0IGFuZCB0aGUgbm90ZXMgYXJlIGdvbmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpRXhwb3J0UGFydHMoXG4gIHZpZXc6IEtwaUNhcmRWaWV3LFxuICBub3RlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGF2YWlsYWJsZTogbnVtYmVyLFxuICBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLFxuKTogS3BpRXhwb3J0UGFydHMge1xuICBjb25zdCBwYXJ0czogS3BpRXhwb3J0UGFydHMgPSB7XG4gICAgZGVsdGE6ICEhdmlldy5kZWx0YSxcbiAgICB3aW5kb3c6ICEhdmlldy53aW5kb3csXG4gICAgdGFyZ2V0OiAhIXZpZXcudGFyZ2V0LFxuICAgIHNwYXJrbGluZTogISF2aWV3LnNwYXJrbGluZT8udmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gbnVsbCksXG4gICAgbm90ZXM6IFsuLi5ub3Rlc10sXG4gICAgc2NhbGU6IDEsXG4gIH07XG4gIGNvbnN0IGhlaWdodCA9ICgpID0+IGtwaUV4cG9ydEhlaWdodCh2aWV3LCBwYXJ0cywgaGVpZ2h0cyk7XG5cbiAgaWYgKGhlaWdodCgpID4gYXZhaWxhYmxlKSB7XG4gICAgcGFydHMuc3BhcmtsaW5lID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaGVpZ2h0KCkgPiBhdmFpbGFibGUpIHtcbiAgICBwYXJ0cy50YXJnZXQgPSBmYWxzZTtcbiAgfVxuXG4gIHdoaWxlIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiBwYXJ0cy5ub3Rlcy5sZW5ndGgpIHtcbiAgICBwYXJ0cy5ub3Rlcy5wb3AoKTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiAhcGFydHMuZGVsdGEpIHtcbiAgICBwYXJ0cy53aW5kb3cgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSkge1xuICAgIHBhcnRzLnNjYWxlID0gTWF0aC5tYXgoS1BJX0VYUE9SVF9NSU5fU0NBTEUsIE1hdGgubWF4KDAsIGF2YWlsYWJsZSkgLyBoZWlnaHQoKSk7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFRoZSBoZWlnaHRzIHNjYWxlZCBieSB0aGUgcGFydHMnIHNjYWxlOiB3aGF0IHRoZSByZW5kZXJlciBsYXlzIHRoZSBjYXJkXG4vLyBvdXQgd2l0aCwgaXRzIHRleHQgc2l6ZWQgYnkgdGhlIHNhbWUgc2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVkS3BpSGVpZ2h0cyhoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLCBzY2FsZTogbnVtYmVyKTogS3BpRXhwb3J0SGVpZ2h0cyB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IGhlaWdodHMudmFsdWUgKiBzY2FsZSxcbiAgICBsYWJlbDogaGVpZ2h0cy5sYWJlbCAqIHNjYWxlLFxuICAgIGRlbHRhOiBoZWlnaHRzLmRlbHRhICogc2NhbGUsXG4gICAgd2luZG93OiBoZWlnaHRzLndpbmRvdyAqIHNjYWxlLFxuICAgIHRhcmdldDogaGVpZ2h0cy50YXJnZXQgKiBzY2FsZSxcbiAgICBzcGFya2xpbmU6IGhlaWdodHMuc3BhcmtsaW5lICogc2NhbGUsXG4gICAgbm90ZTogaGVpZ2h0cy5ub3RlICogc2NhbGUsXG4gIH07XG59XG5cbi8vIEhvdyB0YWxsIHRoZSBjYXJkJ3MgZHJhd24gcGFydHMgc3RhbmQgdG9nZXRoZXIsIGluIHRoZSBoZWlnaHRzJyB1bml0LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydEhlaWdodCh2aWV3OiBLcGlDYXJkVmlldywgcGFydHM6IEtwaUV4cG9ydFBhcnRzLCBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzKTogbnVtYmVyIHtcbiAgcmV0dXJuIGhlaWdodHMudmFsdWVcbiAgICArICh2aWV3LmxhYmVsID8gaGVpZ2h0cy5sYWJlbCA6IDApXG4gICAgKyAocGFydHMuZGVsdGEgPyBoZWlnaHRzLmRlbHRhIDogMClcbiAgICArIChwYXJ0cy53aW5kb3cgPyBoZWlnaHRzLndpbmRvdyA6IDApXG4gICAgKyAocGFydHMudGFyZ2V0ID8gaGVpZ2h0cy50YXJnZXQgOiAwKVxuICAgICsgKHBhcnRzLnNwYXJrbGluZSA/IGhlaWdodHMuc3BhcmtsaW5lIDogMClcbiAgICArIHBhcnRzLm5vdGVzLmxlbmd0aCAqIGhlaWdodHMubm90ZTtcbn1cblxuLy8gVGhlIGxhc3Qgcm93IG9mIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgdGhhdCBzdG9wcyBzaG9ydCBvZiBpdHMgcmVzdWx0OiBob3dcbi8vIG1hbnkgcm93cyB0aGUgZmlsZSBsZWF2ZXMgb3V0IGFuZCB3aGVyZSB0aGUgd2hvbGUgc2V0IGNhbiBiZSBoYWQuIEVhY2hcbi8vIGZvcm1hdCBmZXRjaGVzIGl0cyBvd24gbnVtYmVyIG9mIHJvd3MgKFBERl9MSVNUX1JPV1MsIFBQVFhfTElTVF9ST1dTKSwgYW5kXG4vLyBib3RoIG5hbWUgd2hhdCBpcyBsZWZ0IHdpdGggdGhpcyBvbmUgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gbW9yZVJvd3NOb3RpY2UocmVtYWluaW5nOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYOKApiAke3JlbWFpbmluZ30gbW9yZSByb3cocykg4oCUIHVzZSB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydCBmb3IgdGhlIGZ1bGwgZGF0YXNldGA7XG59XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNvbGxlY3RlZCByZXBvcnQgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB0aWxlIHdob3NlIHF1ZXJ5XG4vLyBmYWlsZWQsIG9yIHdob3NlIHRleHQgc2hvd3MgYSB2YWx1ZSB0aGF0IGNhbWUgYmFjayB3aXRob3V0IGl0cyBudW1iZXIsIHRoZW5cbi8vIEhFQURFUl9GT09URVJfTkFNRSB3aGVuIHRoZSBoZWFkZXIgb3IgZm9vdGVyIHNob3dzIG9uZSBvbiBhIHBhZ2UgdGhhdCBzaG93c1xuLy8gdGhlIG1hc3RlciDigJQgd2hhdCB0aGUgZmFpbHVyZSBnYXRlIG5hbWVzIHRvIHRoZSB1c2VyLCBhbmQgd2hhdCBtYWtlcyBcInNvbWVcbi8vIG9mIHRoaXMgZmlsZSBpcyBtaXNzaW5nXCIgYSBmYWN0IHRoZSBjYWxsZXIgY2FuIGFjdCBvbiByYXRoZXIgdGhhbiBhIHRoaW5nXG4vLyB0aGV5IG5vdGljZSBpbiB0aGUgUERGIGFmdGVyd2FyZHMuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICAvLyBOdW1iZXJlZCBiZWZvcmUgdGhlIGZpbHRlciDigJQgYW4gdW5uYW1lZCBwYWdlIDQgdGhhdCBmYWlsZWQgaGFzIHRvIHJlYWRcbiAgLy8gXCJQYWdlIDRcIiwgbm90IFwiUGFnZSAxXCIgYmVjYXVzZSBpdCBoYXBwZW5lZCB0byBiZSB0aGUgZmlyc3QgZmFpbHVyZS5cbiAgY29uc3QgbmFtZXMgPSBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKVxuICAgICAgfHwgc2hvd3NGYWlsZWRWYWx1ZShwYWdlLmNvbXBvbmVudHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbXBvbmVudCksIHBhZ2UuZmFpbGVkVmFsdWVzKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbiAgY29uc3QgbWFzdGVyID0gY29sbGVjdGVkLnJlcG9ydC5tYXN0ZXI7XG4gIGNvbnN0IHNob3dzTWFzdGVyID0gY29sbGVjdGVkLnBhZ2VzLnNvbWUoKHsgcGFnZSB9KSA9PiAhcGFnZS5tYXN0ZXJIaWRkZW4pO1xuXG4gIGlmIChtYXN0ZXIgJiYgc2hvd3NNYXN0ZXIgJiYgc2hvd3NGYWlsZWRWYWx1ZShtYXN0ZXIuY29tcG9uZW50cywgY29sbGVjdGVkLm1hc3RlckZhaWxlZFZhbHVlcykpIHtcbiAgICBuYW1lcy5wdXNoKEhFQURFUl9GT09URVJfTkFNRSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8vIFdoZXRoZXIgYW55IG9mIHRoZSB0ZXh0IGJsb2NrcyBzaG93cyBvbmUgb2YgdGhlIGZhaWxlZCB2YWx1ZSBrZXlzLlxuZnVuY3Rpb24gc2hvd3NGYWlsZWRWYWx1ZShjb21wb25lbnRzOiBSZXBvcnRDb21wb25lbnRbXSwgZmFpbGVkOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzaG93biA9IG5ldyBTZXQoY29tcG9uZW50c1xuICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0JylcbiAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB2YWx1ZUtleXMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCkpKTtcblxuICByZXR1cm4gZmFpbGVkLnNvbWUoKGtleSkgPT4gc2hvd24uaGFzKGtleSkpO1xufVxuXG4vLyBHYXRoZXJzIGV2ZXJ5dGhpbmcgYW4gZXhwb3J0IG5lZWRzOiBldmVyeSBjb21wb25lbnQncyBkYXRhIGFjcm9zcyBBTEwgcGFnZXNcbi8vICh0aGUgY2FudmFzIG9ubHkgcmVuZGVycyB0aGUgYWN0aXZlIHBhZ2UsIHNvIGV4cG9ydHMgY2FuJ3Qgc2NyYXBlIHRoZVxuLy8gc2NyZWVuKSwgYW5kIHRoZSBudW1iZXJzIG9mIHRoZSB2YWx1ZXMgdGhlaXIgdGV4dCByZWFkcywgZmV0Y2hlZCBmcmVzaCB3aXRoXG4vLyB0aGUgdmlld2VyJ3MgY3VycmVudCBmaWx0ZXIgc3RhdGUuXG4vL1xuLy8gQSBmYWlsZWQgY29tcG9uZW50IHJlc29sdmVzIHRvIGEgbnVsbCBgZGF0YWAsIGFuZCBhIGZhaWxlZCB2YWx1ZSB0byBhIGtleSBpblxuLy8gaXRzIHBhZ2UncyBmYWlsZWRWYWx1ZXMsIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGNvbGxlY3Rpb24g4oCUIGJ1dCB0aGF0XG4vLyBpcyBzbyB0aGUgY2FsbGVyIGNhbiBSRVBPUlQgd2hhdCBmYWlsZWQsIG5vdCBzbyBpdCBjYW4gYmUgaWdub3JlZDogc2VlXG4vLyBmYWlsZWRQYWdlTmFtZXMoKSBhbmQgdGhlIGZhaWx1cmUgZ2F0ZSB0aGF0IHVzZXMgaXQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICAvLyBsaXN0Um93cyBpcyBob3cgbWFueSByb3dzIGVhY2ggbGlzdCBmZXRjaGVzOiB0aGUgcmVuZGVyZXIncyBvd24gY2FwLCBzaW5jZVxuICAvLyBhIFBERiB0YWJsZSBjb250aW51ZXMgb250byBleHRyYSBwYWdlcyBhbmQgYSBzbGlkZSB0YWJsZSBjYW5ub3QuXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBqb2JzID0gdGhpcy5fam9icyhyZXBvcnQpO1xuICAgIGNvbnN0IGZvcm1hdENvbnRleHQgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCk7XG5cbiAgICAvLyBSZWxlYXNlZCBhIGZldyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UsIGEgcGFnZSdzIHZhbHVlcyBpbiB0aGVcbiAgICAvLyBzYW1lIHF1ZXVlIGFzIHRoZSB0aWxlcywgc28gdGhleSBuZXZlciBhZGQgdG8gdGhlIHF1ZXJpZXMgYWxyZWFkeVxuICAgIC8vIHJ1bm5pbmcuIG1lcmdlTWFwIGNvbXBsZXRlcyBvdXQgb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIGpvYlxuICAgIC8vIGl0IGNhbWUgZnJvbSBhbmQgdGhlIHJvd3MgYXJlIGZpbGVkIGJ5IGluZGV4IOKAlCB0aGUgZGVjaydzIHBhZ2Ugb3JkZXJcbiAgICAvLyBjYW4ndCBkZXBlbmQgb24gd2hpY2ggcXVlcnkgaGFwcGVuZWQgdG8gZmluaXNoIGZpcnN0LlxuICAgIGNvbnN0IGFsbCQgPSBqb2JzLmxlbmd0aFxuICAgICAgPyBmcm9tKGpvYnMubWFwKChqb2IsIGluZGV4KSA9PiAoeyBqb2IsIGluZGV4IH0pKSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAoeyBqb2IsIGluZGV4IH0pID0+IHRoaXMuX3J1bkpvYihyZXBvcnQsIGpvYiwgbGlzdFJvd3MsIGZvcm1hdENvbnRleHQpXG4gICAgICAgICAgICAgIC5waXBlKG1hcCgocmVzdWx0KSA9PiAoeyByZXN1bHQsIGluZGV4IH0pKSksXG4gICAgICAgICAgICBFWFBPUlRfQ09OQ1VSUkVOQ1ksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIClcbiAgICAgIDogb2YoW10gYXMgeyByZXN1bHQ6IENvbGxlY3RSZXN1bHQ7IGluZGV4OiBudW1iZXIgfVtdKTtcblxuICAgIC8vIFRoZSBzdW1tYXJ5IHJpZGVzIGFsb25nc2lkZSB0aGUgY29tcG9uZW50IGRhdGEgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgYXRcbiAgICAvLyB0aGUgZW5kLCBiZWNhdXNlIG5hbWluZyBhIHNlbGVjdCBmaWx0ZXIncyB2YWx1ZXMgaXMgaXRzZWxmIGEgcmVxdWVzdC5cbiAgICByZXR1cm4gZm9ya0pvaW4oeyBjb2xsZWN0ZWQ6IGFsbCQsIGZpbHRlclN1bW1hcnk6IHRoaXMuZ2V0RmlsdGVyU3VtbWFyeShyZXBvcnQpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgZmlsdGVyU3VtbWFyeSB9KSA9PiAoe1xuICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgICAuLi50aGlzLl9maWxlKHJlcG9ydCwgY29sbGVjdGVkLCBmb3JtYXRDb250ZXh0KSxcbiAgICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgICAgIGNvbnRleHRMaW5lczogdGhpcy5fY29udGV4dExpbmVzKHJlcG9ydCksXG4gICAgICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFwiUmVwb3J0IFBlcmlvZDogSnVuIDEyLCAyMDI1IOKAkyBKdW4gMTIsIDIwMjZcIiwgXCJSZWdpb246IE5vcnRoLCBFYXN0XCIg4oCUIG9uZVxuICAvLyBsaW5lIHBlciBmaWx0ZXIgZ3JvdXAgdGhhdCBoYXMgYW4gYWN0aXZlIHNlc3Npb24gdmFsdWUsIHRoZW4gdGhlIGdyb3VwLWJ5XG4gIC8vIGxpbmUuIFRoZSBmaWx0ZXIgYmFyIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQ6IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgY292ZXJzXG4gIC8vIHByaW50IGl0LCBhbmQgdGhlIHJlcG9ydCB6aXAgZXhwb3J0IHNlbmRzIGl0IGZvciBpdHMgbm90ZXMgZmlsZS4gRGF0ZXMgYXJlXG4gIC8vIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gdGhlIG5vdGVzIG5hbWUgdGhlIHBlcmlvZCBhcyB0aGUgY292ZXJcbiAgLy8gZG9lcy5cbiAgLy9cbiAgLy8gQSBzZWxlY3QgZ3JvdXAgc3RvcmVzIGlkcywgc28gaXRzIGxpbmUgaGFzIHRvIGJlIG5hbWVkIG9mZiB0aGUgb3B0aW9uIGxpc3RcbiAgLy8gYmVmb3JlIGl0IGNhbiBiZSBwcmludGVkOyBhIGRhdGUgb3Iga2V5d29yZCBncm91cCBhbHJlYWR5IGhvbGRzIGl0cyBvd25cbiAgLy8gZGlzcGxheSB2YWx1ZSBhbmQgcmVzb2x2ZXMgc3luY2hyb25vdXNseS5cbiAgcHVibGljIGdldEZpbHRlclN1bW1hcnkocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGluZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCAnRmlsdGVyJztcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHt0aGlzLl9kYXRlKHZhbHVlLnN0YXJ0KX0g4oCTICR7dGhpcy5fZGF0ZSh2YWx1ZS5lbmQpfWApKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0aGlzLl9zZWxlY3RMaW5lKGxhYmVsLCBncm91cCwgcmVwb3J0LmlkLCB2YWx1ZS52YWx1ZXMpKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgZ3JhaW4sIHVuZGVyIHRoZSByZXBvcnQncyBvd24gbmFtZSBmb3IgdGhlIGNvbnRyb2wg4oCUIGEgY292ZXJcbiAgICAvLyBzaGVldCByZWFkaW5nIFwiRnJlcXVlbmN5XCIgd2hlbiB0aGUgcmVwb3J0IGNhbGxzIGl0IFwiUGVyaW9kXCIgZGVzY3JpYmVzIGFcbiAgICAvLyBjb250cm9sIHRoZSByZWFkZXIgY2Fubm90IGZpbmQgb24gc2NyZWVuLlxuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGdyYW51bGFyaXR5KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JztcbiAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke29wdGlvbj8ubmFtZSA/PyBncmFudWxhcml0eX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGZvcmtKb2luKGxpbmVzKSA6IG9mKFtdKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHJlcXVlc3QgdGhlIGV4cG9ydCBtYWtlcywgaW4gcGFnZSBvcmRlcjogZWFjaCBwYWdlJ3MgdGlsZXMsIHRoZW4gdGhlXG4gIC8vIHZhbHVlcyBpdHMgdGV4dCBzaG93czsgdGhlIGhlYWRlciBhbmQgZm9vdGVyJ3MgdmFsdWVzIGxhc3QsIHdoZW4gc29tZSBwYWdlXG4gIC8vIHNob3dzIHRoZSBtYXN0ZXIuIFRleHQgYmxvY2tzIGhhdmUgbm90aGluZyB0byBmZXRjaCBvZiB0aGVpciBvd24g4oCUIHRoZXlcbiAgLy8gcmlkZSB0aHJvdWdoIHdpdGggbm8gZGF0YSwgYW5kIHRoZWlyIHRva2VucyBhcmUgZmlsbGVkIGZyb20gdGhlaXIgbGF5ZXInc1xuICAvLyB2YWx1ZXMuIEEgdmFsdWUgaXMgcmVhZCBvbmx5IHRocm91Z2ggaXRzIGxheWVyJ3MgcmVxdWVzdCwgbmV2ZXIgYXMgYSB0aWxlLlxuICAvLyBUaGUgaGVhZGVyL2Zvb3RlciBibG9ja3MgKHJlcG9ydC5tYXN0ZXIpIGFyZSByZWFkIGJ5IHRoZSByZW5kZXJlcnNcbiAgLy8gc3RyYWlnaHQgb2ZmIHRoZSByZXBvcnQuXG4gIHByaXZhdGUgX2pvYnMocmVwb3J0OiBSZXBvcnQpOiBDb2xsZWN0Sm9iW10ge1xuICAgIGNvbnN0IGpvYnM6IENvbGxlY3RKb2JbXSA9IFtdO1xuXG4gICAgcmVwb3J0LnBhZ2VzLmZvckVhY2goKHBhZ2UsIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgcGFnZS5jb21wb25lbnRzXG4gICAgICAgIC5maWx0ZXIoaXNEcmF3bilcbiAgICAgICAgLmZvckVhY2goKGNvbXBvbmVudCkgPT4gam9icy5wdXNoKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleCwgY29tcG9uZW50IH0pKTtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHBhZ2UsIHBhZ2VJbmRleCkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlcG9ydC5tYXN0ZXIgJiYgcmVwb3J0LnBhZ2VzLnNvbWUoKHBhZ2UpID0+ICFwYWdlLm1hc3RlckhpZGRlbikpIHtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHJlcG9ydC5tYXN0ZXIsIG51bGwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9icztcbiAgfVxuXG4gIC8vIEEgbGF5ZXIncyBvbmUgdmFsdWVzIGpvYiwgb3Igbm9uZSB3aGVuIGl0cyB0ZXh0IHNob3dzIG5vIHZhbHVlLlxuICBwcml2YXRlIF92YWx1ZXNKb2JzKGxheWVyOiBSZXBvcnRQYWdlIHwgUmVwb3J0TWFzdGVyLCBwYWdlSW5kZXg6IG51bWJlciB8IG51bGwpOiBDb2xsZWN0Sm9iW10ge1xuICAgIGNvbnN0IHRleHRzID0gbGF5ZXIuY29tcG9uZW50cy5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jyk7XG4gICAgY29uc3QgdmFsdWVzID0gbGF5ZXIudmFsdWVzID8/IFtdO1xuICAgIGNvbnN0IHNob3duID0gc2hvd25WYWx1ZXModmFsdWVzLCB0ZXh0cyk7XG5cbiAgICByZXR1cm4gc2hvd24ubGVuZ3RoXG4gICAgICA/IFt7IGtpbmQ6ICd2YWx1ZXMnLCBwYWdlSW5kZXgsIHBhZ2VJZDogbGF5ZXIuaWQsIHZhbHVlcywgY29tcG9uZW50czogc2hvd24gfV1cbiAgICAgIDogW107XG4gIH1cblxuICAvLyBPbmUgcXVldWVkIGpvYiwgaXRzIHJlc3VsdCB0YWdnZWQgd2l0aCB0aGUgcGFnZSBpdCBpcyBmaWxlZCB1bmRlci5cbiAgcHJpdmF0ZSBfcnVuSm9iKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGpvYjogQ29sbGVjdEpvYixcbiAgICBsaXN0Um93czogbnVtYmVyLFxuICAgIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gICk6IE9ic2VydmFibGU8Q29sbGVjdFJlc3VsdD4ge1xuICAgIGlmIChqb2Iua2luZCA9PT0gJ2NvbXBvbmVudCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnREYXRhKHJlcG9ydCwgam9iLmNvbXBvbmVudCwgbGlzdFJvd3MpXG4gICAgICAgIC5waXBlKG1hcCgoaXRlbSk6IENvbGxlY3RSZXN1bHQgPT4gKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleDogam9iLnBhZ2VJbmRleCwgaXRlbSB9KSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wYWdlVmFsdWVzKHJlcG9ydCwgam9iLnBhZ2VJZCwgam9iLnZhbHVlcywgam9iLmNvbXBvbmVudHMsIGZvcm1hdENvbnRleHQpXG4gICAgICAucGlwZShtYXAoKGNvbGxlY3RlZCk6IENvbGxlY3RSZXN1bHQgPT4gKHsga2luZDogJ3ZhbHVlcycsIHBhZ2VJbmRleDogam9iLnBhZ2VJbmRleCwgY29sbGVjdGVkIH0pKSk7XG4gIH1cblxuICBwcml2YXRlIF9jb21wb25lbnREYXRhKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PiB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHJldHVybiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCwgaGlkZGVuQ29sdW1uczogW10gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nXG4gICAgLy8gYW5kIHRoZSB2aWV3ZXIncyBoZWFkZXIgc29ydCBhbmQgc2VhcmNoLCBzbyB0aGUgdGFibGUgcmVhZHMgaW4gdGhlXG4gICAgLy8gc2NyZWVuJ3Mgb3JkZXIgYW5kIGhvbGRzIHRoZSBzY3JlZW4ncyByb3dzLlxuICAgIC8vXG4gICAgLy8gVGhlIHRpbWUtc2VyaWVzIGNoZWNrIGRlbGliZXJhdGVseSBtaXJyb3JzIHRoZSBzZXJ2ZXIncyBjYW5vbmljYWxcbiAgICAvLyBSZXBvcnRRdWVyeVJ1bm5lcjo6X2lzVGltZVNlcmllc0NoYXJ0LCBzbyBhIHByb2R1Y3QgcGlubmVkIHRvIGFuIG9sZGVyXG4gICAgLy8gZnJhbWV3b3JrIGRvZXMgbm90IHJlLWJ1Y2tldCBhIG5vbi10aW1lIGNoYXJ0LlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc2VhcmNoID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKGNvbXBvbmVudC5pZCkgPz8gdW5kZWZpbmVkXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB7IHBhZ2U6IDEsIHBhZ2VTaXplOiBsaXN0Um93cywgc29ydDogdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQoY29tcG9uZW50LmlkKSA/PyB1bmRlZmluZWQsIHNlYXJjaCB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcbiAgICAvLyBUaGUgdGFibGUgbGVhdmVzIG91dCB0aGUgY29sdW1ucyB0aGUgdmlld2VyIGhpZC4gVGhlIHJvd3MgYXJlIGZldGNoZWRcbiAgICAvLyB3aG9sZSwgYXMgdGhlIHNjcmVlbiBmZXRjaGVzIHRoZW0sIGFuZCB0aGUgcmVuZGVyZXJzIGRyb3AgdGhlIGNlbGxzLlxuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSBbLi4udGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpXTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBmYWlsdXJlIGdhdGUsIG5hbWluZyB0aGUgcGFnZXMgaXQgY29zdCDigJRcbiAgICAvLyBuZXZlciBhcyB0ZW4gc3RhY2tlZCBtb2RhbHMgY2FycnlpbmcgdGhlIGRhdGFiYXNlJ3Mgb3duIHdvcmRpbmcuXG4gICAgLy9cbiAgICAvLyBBIHNlYXJjaCB0aGUgc2VydmVyIGNvdWxkIG5vdCBhcHBseSAoc2VhcmNoTm90ZTogdGhlIGxpc3QgaGFzIG5vIHRleHRcbiAgICAvLyBjb2x1bW4pIG5hcnJvd2VkIG5vdGhpbmcsIHNvIHRoZSBpdGVtIGRvZXMgbm90IGNhcnJ5IGl0LlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEocmVwb3J0LmlkLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSk6IENvbGxlY3RlZENvbXBvbmVudCA9PiAoc2VhcmNoICYmICFkYXRhPy5zZWFyY2hOb3RlXG4gICAgICAgICAgPyB7IGNvbXBvbmVudCwgZGF0YSwgc2VhcmNoLCBoaWRkZW5Db2x1bW5zIH1cbiAgICAgICAgICA6IHsgY29tcG9uZW50LCBkYXRhLCBoaWRkZW5Db2x1bW5zIH0pKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCwgaGlkZGVuQ29sdW1ucyB9KSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gT25lIGxheWVyJ3MgdmFsdWVzLCByZWFkIGluIG9uZSByZXF1ZXN0LCBhcyBpdHMgdGV4dCdzIHRva2VucyBwcmludCB0aGVtLlxuICAvLyBUaGUgcmVxdWVzdCBjYXJyaWVzIHRoZSBmaWx0ZXIgdmFsdWVzIG9mIGV2ZXJ5IHZhbHVlIG9uIHRoZSBsYXllciwgYXMgdGhlXG4gIC8vIGNhbnZhcydzIGRvZXM6IHRoZSBzZXJ2ZXIgZGVjaWRlcyB3aGljaCB2YWx1ZXMgaXQgcmVhZHMgKHRoZSBzaG93biBvbmVzXG4gIC8vIGFuZCB0aGUgb3BlcmFuZHMgb2YgdGhlIGZvcm11bGFzIGFtb25nIHRoZW0pIGFuZCBhcHBsaWVzIHRvIGVhY2ggb25seSB0aGVcbiAgLy8gZW50cmllcyBuYW1pbmcgaXRzIG93biBmaWx0ZXJzLiBoYW5kbGVyczogZmFsc2Uga2VlcHMgdGhlIGVycm9yIGRpYWxvZyBvdXRcbiAgLy8gb2YgaXQsIGFzIGZvciBhIHRpbGUuIEEgZmFpbGVkIHJlcXVlc3QgcmVhZHMgYXMgbm8gcm93cywgc28gZXZlcnkgdmFsdWVcbiAgLy8gdGhlIHRleHQgc2hvd3MgZmFpbGVkIGFuZCB0aGUgZmFpbHVyZSBnYXRlIG5hbWVzIGl0cyBwYWdlOyBvbmUgdmFsdWUnc1xuICAvLyBvd24gZXJyb3IgZmFpbHMgb25seSB0aGF0IHZhbHVlLCBhbmQgYSBmYWlsZWQgb3BlcmFuZCBmYWlscyB0aGUgZm9ybXVsYVxuICAvLyB0aGF0IHJlYWRzIGl0LlxuICBwcml2YXRlIF9wYWdlVmFsdWVzKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHBhZ2VJZDogbnVtYmVyLFxuICAgIHZhbHVlczogUmVwb3J0Q29tcG9uZW50W10sXG4gICAgc2hvd246IFJlcG9ydENvbXBvbmVudFtdLFxuICAgIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gICk6IE9ic2VydmFibGU8Q29sbGVjdGVkVmFsdWVzPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHZhbHVlcy5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5wYWdlVmFsdWVzKHJlcG9ydC5pZCwgcGFnZUlkLCBmaWx0ZXJzLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocm93cykgPT4gbmV3IE1hcCgocm93cyA/PyBbXSkubWFwKChyb3cpID0+IFtyb3cuaWQsIHJvd10pKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobmV3IE1hcDxudW1iZXIsIFJlcG9ydFBhZ2VWYWx1ZT4oKSkpLFxuICAgICAgICBtYXAoKHJvd3MpID0+ICh7XG4gICAgICAgICAgdmFsdWVzOiB0ZXh0VmFsdWVzKHZhbHVlcywgeyByb3dzIH0sIGZvcm1hdENvbnRleHQpLFxuICAgICAgICAgIGZhaWxlZFZhbHVlczogZmFpbGVkVmFsdWVLZXlzKHNob3duLCByb3dzKSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXN1bHRzIGZpbGVkIGJ5IHBhZ2UgaW4gam9iIG9yZGVyLiBBIGxheWVyIHdpdGggbm8gdmFsdWVzIGpvYiAoaXRzXG4gIC8vIHRleHQgc2hvd3Mgbm8gdmFsdWUpIGhhcyBubyBudW1iZXJzIHRvIHdhaXQgZm9yOiBpdHMgdmFsdWVzIHJlYWQgYXMgdGhlXG4gIC8vIGVtIGRhc2gsIGFuZCBub25lIG9mIHRoZW0gZmFpbGVkLlxuICBwcml2YXRlIF9maWxlKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHJlc3VsdHM6IHsgcmVzdWx0OiBDb2xsZWN0UmVzdWx0OyBpbmRleDogbnVtYmVyIH1bXSxcbiAgICBmb3JtYXRDb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICApOiBQaWNrPENvbGxlY3RlZFJlcG9ydCwgJ3BhZ2VzJyB8ICdtYXN0ZXJWYWx1ZXMnIHwgJ21hc3RlckZhaWxlZFZhbHVlcyc+IHtcbiAgICBjb25zdCB1bnJlYWQgPSAodmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXSB8IHVuZGVmaW5lZCk6IENvbGxlY3RlZFZhbHVlcyA9PiAoe1xuICAgICAgdmFsdWVzOiB0ZXh0VmFsdWVzKHZhbHVlcyA/PyBbXSwgeyByb3dzOiBuZXcgTWFwKCkgfSwgZm9ybWF0Q29udGV4dCksXG4gICAgICBmYWlsZWRWYWx1ZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW10gPSByZXBvcnQucGFnZXMubWFwKChwYWdlKSA9PiAoeyBwYWdlLCBjb21wb25lbnRzOiBbXSwgLi4udW5yZWFkKHBhZ2UudmFsdWVzKSB9KSk7XG4gICAgbGV0IG1hc3RlciA9IHVucmVhZChyZXBvcnQubWFzdGVyPy52YWx1ZXMpO1xuXG4gICAgWy4uLnJlc3VsdHNdXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAuZm9yRWFjaCgoeyByZXN1bHQgfSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmtpbmQgPT09ICdjb21wb25lbnQnKSB7XG4gICAgICAgICAgcGFnZXNbcmVzdWx0LnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKHJlc3VsdC5pdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQucGFnZUluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgbWFzdGVyID0gcmVzdWx0LmNvbGxlY3RlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHBhZ2VzW3Jlc3VsdC5wYWdlSW5kZXhdLCByZXN1bHQuY29sbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBwYWdlcywgbWFzdGVyVmFsdWVzOiBtYXN0ZXIudmFsdWVzLCBtYXN0ZXJGYWlsZWRWYWx1ZXM6IG1hc3Rlci5mYWlsZWRWYWx1ZXMgfTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLCBhbmQgdGhlIGN1cnJlbmN5IGl0IHNheXNcbiAgLy8gdGhlIHJlcG9ydCdzIG1vbmV5IGlzIGluIChhIGxhYmVsOiBub3RoaW5nIGlzIGNvbnZlcnRlZCkuIE9ubHkgdGhlXG4gIC8vIHNlcnZlcidzIHZhbHVlcyBhcmUgcHJpbnRlZDogdGhlIGJyb3dzZXIncyB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUnc1xuICAvLyBmYWxsYmFjayBmb3IgYW4gb2xkZXIgc2VydmVyKSBpcyBub3Qgd2hhdCB0aGUgbnVtYmVycyB3ZXJlIG1lYXN1cmVkIGluLFxuICAvLyBhbmQgYW4gb2xkZXIgc2VydmVyIG5hbWVzIG5vIGN1cnJlbmN5IGF0IGFsbC5cbiAgcHJpdmF0ZSBfY29udGV4dExpbmVzKHJlcG9ydDogUmVwb3J0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXSksXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5ID8gW2BDdXJyZW5jeTogJHtyZXBvcnQuZWZmZWN0aXZlQ3VycmVuY3l9YF0gOiBbXSksXG4gICAgXTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==