@firestitch/report 18.7.0 → 18.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
- package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
- package/app/reports/components/component-list/component-list.component.d.ts +7 -1
- package/app/reports/components/component-note/component-note.component.d.ts +12 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
- package/app/reports/components/report-component/report-component.component.d.ts +2 -11
- package/app/reports/data/report.data.d.ts +0 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
- package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
- package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +27 -1
- package/app/reports/export/report-pdf.service.d.ts +5 -0
- package/app/reports/export/report-pptx.service.d.ts +7 -0
- package/app/reports/format.d.ts +27 -1
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +124 -4
- package/app/reports/kpi-card.d.ts +48 -0
- package/app/reports/layout.d.ts +0 -9
- package/app/reports/list-config.d.ts +8 -1
- package/app/reports/option-builder.d.ts +7 -0
- package/app/reports/output-notes.d.ts +14 -0
- package/app/reports/pipes/report-output.pipe.d.ts +10 -0
- package/app/reports/services/report-filter-state.service.d.ts +1 -0
- package/app/reports/theme/palette.d.ts +3 -0
- package/app/reports/theme/typography.d.ts +1 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
- package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
- package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
- package/esm2022/app/reports/data/report.data.mjs +5 -5
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
- package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
- package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +101 -10
- package/esm2022/app/reports/export/report-pdf.service.mjs +249 -40
- package/esm2022/app/reports/export/report-pptx.service.mjs +312 -49
- package/esm2022/app/reports/format.mjs +423 -2
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/kpi-card.mjs +174 -0
- package/esm2022/app/reports/layout.mjs +1 -46
- package/esm2022/app/reports/list-config.mjs +33 -1
- package/esm2022/app/reports/option-builder.mjs +624 -54
- package/esm2022/app/reports/output-notes.mjs +158 -0
- package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
- package/esm2022/app/reports/theme/palette.mjs +17 -1
- package/esm2022/app/reports/theme/typography.mjs +5 -1
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +3 -4
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-qCBE3LqM.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +2574 -487
- package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
|
@@ -1,14 +1,51 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { ReportKpiTrend } from '../enums/report-kpi-trend.enum';
|
|
3
|
+
import { resolveReportTimezone } from '../format';
|
|
4
|
+
import { kpiCardView, kpiSparklineGeometry, } from '../kpi-card';
|
|
5
|
+
import { DEFAULT_COMPONENT_PADDING } from '../layout';
|
|
4
6
|
import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, textParagraphs, } from '../text';
|
|
7
|
+
import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR } from '../theme/palette';
|
|
5
8
|
import { renderChartImage } from './offscreen-chart';
|
|
6
|
-
import { coverLines, emptyLabel, exportCell, exportTitle, listColumns, listHeadings, listTotalsRow, moreRowsNotice, } from './report-export-collector.service';
|
|
9
|
+
import { coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, } from './report-export-collector.service';
|
|
7
10
|
import * as i0 from "@angular/core";
|
|
8
11
|
// Inches → points (the PDF unit).
|
|
9
12
|
const PT = 72;
|
|
10
13
|
// Component title strip height, points.
|
|
11
14
|
const TITLE_H = 18;
|
|
15
|
+
// The small print a component may carry, points: the days it reads under its
|
|
16
|
+
// title (a subtitle line), its notes at the foot of its box (a line each), and
|
|
17
|
+
// the lines of a KPI card under its value. A chart's or a list's notes give
|
|
18
|
+
// way before its body would shrink under MIN_BODY_H.
|
|
19
|
+
const SMALL_SIZE = 7.5;
|
|
20
|
+
const SUBTITLE_H = 11;
|
|
21
|
+
const NOTE_LINE_H = 10;
|
|
22
|
+
const MIN_BODY_H = 40;
|
|
23
|
+
const MUTED_COLOR = '#7b8794';
|
|
24
|
+
// A KPI card's parts, top to bottom, points (kpiExportParts sheds the
|
|
25
|
+
// sparkline, then the target, then the notes on a short tile). The value's
|
|
26
|
+
// baseline sits KPI_VALUE_BASELINE under its top.
|
|
27
|
+
const KPI_HEIGHTS = {
|
|
28
|
+
value: 30,
|
|
29
|
+
label: 13,
|
|
30
|
+
delta: 13,
|
|
31
|
+
window: NOTE_LINE_H,
|
|
32
|
+
target: NOTE_LINE_H + 6,
|
|
33
|
+
sparkline: 28,
|
|
34
|
+
note: NOTE_LINE_H,
|
|
35
|
+
};
|
|
36
|
+
const KPI_VALUE_BASELINE = 23;
|
|
37
|
+
const KPI_DELTA_SIZE = 9;
|
|
38
|
+
// The delta's triangle: its side, and the gap before the change.
|
|
39
|
+
const KPI_ARROW = 6;
|
|
40
|
+
const KPI_ARROW_GAP = 3;
|
|
41
|
+
// The target's progress bar, and the track it fills.
|
|
42
|
+
const KPI_BAR_W = 120;
|
|
43
|
+
const KPI_BAR_H = 3;
|
|
44
|
+
const KPI_TRACK_COLOR = '#e4e7eb';
|
|
45
|
+
// The sparkline's widest box, its top and bottom inset, and its dots' radius.
|
|
46
|
+
const KPI_SPARKLINE_W = 140;
|
|
47
|
+
const KPI_SPARKLINE_INSET = 3;
|
|
48
|
+
const KPI_DOT_R = 1.5;
|
|
12
49
|
// Rows fetched for a list's PDF table. A table that outgrows its box
|
|
13
50
|
// continues onto pages of its own, so this is how far it may run: about 12-15
|
|
14
51
|
// continuation pages on a letter page, and a tenth of the server's 5000-row
|
|
@@ -83,17 +120,15 @@ export class ReportPdfService {
|
|
|
83
120
|
// overflows.
|
|
84
121
|
async _renderPage(context, collectedPage, index, pageNumber, overflows) {
|
|
85
122
|
const { doc, report } = context;
|
|
86
|
-
const geometry = pageGeometry(report, collectedPage.page);
|
|
87
123
|
const tokens = this._tokens(report, collectedPage.page, index, pageNumber);
|
|
88
124
|
doc.addPage([context.pageW, context.pageH], context.orientation);
|
|
89
125
|
this._renderMaster(context, collectedPage.page, tokens);
|
|
90
126
|
for (const item of collectedPage.components) {
|
|
91
|
-
const box = geometry.get(item.component.id);
|
|
92
127
|
if (item.component.type === 'text') {
|
|
93
|
-
this._renderText(doc, item.component,
|
|
128
|
+
this._renderText(doc, item.component, tokens);
|
|
94
129
|
}
|
|
95
130
|
else {
|
|
96
|
-
await this._renderComponent(context, item, overflows
|
|
131
|
+
await this._renderComponent(context, item, overflows);
|
|
97
132
|
}
|
|
98
133
|
}
|
|
99
134
|
}
|
|
@@ -102,7 +137,7 @@ export class ReportPdfService {
|
|
|
102
137
|
return;
|
|
103
138
|
}
|
|
104
139
|
for (const component of context.report.master?.components ?? []) {
|
|
105
|
-
this._renderText(context.doc, component,
|
|
140
|
+
this._renderText(context.doc, component, tokens);
|
|
106
141
|
}
|
|
107
142
|
}
|
|
108
143
|
_titlePage(doc, collected, pageW, pageH) {
|
|
@@ -119,13 +154,13 @@ export class ReportPdfService {
|
|
|
119
154
|
// paragraph's runs are broken into words, wrapped to the block's width and
|
|
120
155
|
// drawn word by word in their own font, size and color. Lines past the
|
|
121
156
|
// block's height are dropped — the canvas clips the block there too.
|
|
122
|
-
_renderText(doc, component,
|
|
157
|
+
_renderText(doc, component, tokens) {
|
|
123
158
|
const padding = component.config?.padding;
|
|
124
159
|
const inset = (value) => (value ?? DEFAULT_COMPONENT_PADDING) * PT;
|
|
125
|
-
const left =
|
|
126
|
-
const top =
|
|
127
|
-
const width =
|
|
128
|
-
const bottom = (
|
|
160
|
+
const left = component.x * PT + inset(padding?.left);
|
|
161
|
+
const top = component.y * PT + inset(padding?.top);
|
|
162
|
+
const width = component.w * PT - inset(padding?.left) - inset(padding?.right);
|
|
163
|
+
const bottom = (component.y + component.h) * PT - inset(padding?.bottom);
|
|
129
164
|
let cursorY = top;
|
|
130
165
|
let listNumber = 0;
|
|
131
166
|
for (const paragraph of textParagraphs(component.config?.html ?? '', tokens)) {
|
|
@@ -249,22 +284,35 @@ export class ReportPdfService {
|
|
|
249
284
|
reportName: report.name,
|
|
250
285
|
};
|
|
251
286
|
}
|
|
252
|
-
async _renderComponent(context, item, overflows
|
|
287
|
+
async _renderComponent(context, item, overflows) {
|
|
253
288
|
const { doc } = context;
|
|
254
289
|
const component = item.component;
|
|
255
|
-
// Geometry
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
const
|
|
259
|
-
const
|
|
260
|
-
const w = inches.w * PT;
|
|
261
|
-
const h = inches.h * PT;
|
|
290
|
+
// Geometry is stored in inches; the PDF draws in points.
|
|
291
|
+
const x = component.x * PT;
|
|
292
|
+
const y = component.y * PT;
|
|
293
|
+
const w = component.w * PT;
|
|
294
|
+
const h = component.h * PT;
|
|
262
295
|
const title = exportTitle(component, item.search);
|
|
263
296
|
if (title) {
|
|
264
297
|
this._componentTitle(doc, title, x, y, w);
|
|
265
298
|
}
|
|
266
|
-
|
|
267
|
-
|
|
299
|
+
// A chart or list that compares or has a timeframe names its days under
|
|
300
|
+
// the title, and its notes sit at the foot of its box; a KPI card draws
|
|
301
|
+
// both itself. Neither takes room from a component without those keys.
|
|
302
|
+
const locale = context.formatContext.locale;
|
|
303
|
+
const subtitle = this._pdfText(exportWindowsLine(item, context.timezone, locale));
|
|
304
|
+
const notes = component.type === 'kpi' ? [] : exportNoteLines(item, context.timezone, locale);
|
|
305
|
+
const top = y + TITLE_H + (subtitle ? SUBTITLE_H : 0);
|
|
306
|
+
const room = Math.max(20, y + h - top);
|
|
307
|
+
const kept = notes.slice(0, Math.max(0, Math.floor((room - MIN_BODY_H) / NOTE_LINE_H)));
|
|
308
|
+
if (subtitle) {
|
|
309
|
+
this._smallLine(doc, subtitle, x, y + TITLE_H, w, 'left', 'normal');
|
|
310
|
+
}
|
|
311
|
+
const bodyY = top;
|
|
312
|
+
const bodyH = Math.max(20, room - kept.length * NOTE_LINE_H);
|
|
313
|
+
kept.forEach((line, index) => {
|
|
314
|
+
this._smallLine(doc, this._pdfText(line), x, bodyY + bodyH + index * NOTE_LINE_H, w, 'left', 'italic');
|
|
315
|
+
});
|
|
268
316
|
if (!item.data || !item.data.rows?.length) {
|
|
269
317
|
this._boxNote(doc, emptyLabel(item), x, bodyY, w, bodyH);
|
|
270
318
|
return;
|
|
@@ -279,10 +327,30 @@ export class ReportPdfService {
|
|
|
279
327
|
this._renderTable(context, item, x, bodyY, w, bodyH, overflows);
|
|
280
328
|
break;
|
|
281
329
|
case 'kpi':
|
|
282
|
-
this._renderKpi(context,
|
|
330
|
+
this._renderKpi(context, item, x, bodyY, w, bodyH);
|
|
283
331
|
break;
|
|
284
332
|
}
|
|
285
333
|
}
|
|
334
|
+
// One line of small grey print, cut to the width with an ellipsis: a
|
|
335
|
+
// subtitle, a note or a line of a KPI card. y is the line's top; the line is
|
|
336
|
+
// NOTE_LINE_H tall.
|
|
337
|
+
_smallLine(doc, text, x, y, w, align, style) {
|
|
338
|
+
doc.setFont('helvetica', style);
|
|
339
|
+
doc.setFontSize(SMALL_SIZE);
|
|
340
|
+
doc.setTextColor(MUTED_COLOR);
|
|
341
|
+
doc.text(this._fit(doc, text, w), align === 'center' ? x + w / 2 : x, y + SMALL_SIZE, { align });
|
|
342
|
+
}
|
|
343
|
+
// The text, ellipsized to the width in the doc's current font.
|
|
344
|
+
_fit(doc, text, width) {
|
|
345
|
+
if (doc.getTextWidth(text) <= width) {
|
|
346
|
+
return text;
|
|
347
|
+
}
|
|
348
|
+
let cut = text;
|
|
349
|
+
while (cut.length > 1 && doc.getTextWidth(`${cut}…`) > width) {
|
|
350
|
+
cut = cut.slice(0, -1);
|
|
351
|
+
}
|
|
352
|
+
return `${cut.trimEnd()}…`;
|
|
353
|
+
}
|
|
286
354
|
// The bold strip over a component, and over each of its continuation pages.
|
|
287
355
|
_componentTitle(doc, title, x, y, w) {
|
|
288
356
|
doc.setFont('helvetica', 'bold');
|
|
@@ -336,7 +404,7 @@ export class ReportPdfService {
|
|
|
336
404
|
// totals row (null without one). The columns the viewer hid are left out.
|
|
337
405
|
_tableCells(context, component, data, hiddenColumns) {
|
|
338
406
|
const columns = listColumns(component, data, context.formatContext.locale, hiddenColumns);
|
|
339
|
-
const cells = data.rows.map((row) => columns.map((column) => this._pdfText(exportCell(row[column.column], column, context.timezone, context.formatContext))));
|
|
407
|
+
const cells = data.rows.map((row) => columns.map((column) => this._pdfText(exportCell(row[column.column], column, context.timezone, context.formatContext, row))));
|
|
340
408
|
const foot = listTotalsRow(data, columns, context.timezone, context.formatContext);
|
|
341
409
|
return {
|
|
342
410
|
cells,
|
|
@@ -488,31 +556,172 @@ export class ReportPdfService {
|
|
|
488
556
|
const title = exportTitle(component, search);
|
|
489
557
|
return title ? `${title} (continued)` : 'Continued';
|
|
490
558
|
}
|
|
491
|
-
|
|
559
|
+
// A KPI tile: the card the screen draws (kpi-card.ts decides every line),
|
|
560
|
+
// stacked and centered in the body. A card with only its value and label
|
|
561
|
+
// keeps the tile's long-standing layout.
|
|
562
|
+
_renderKpi(context, item, x, y, w, h) {
|
|
492
563
|
const { doc } = context;
|
|
493
|
-
const config = component.config;
|
|
494
|
-
const
|
|
495
|
-
const
|
|
496
|
-
const
|
|
564
|
+
const config = item.component.config;
|
|
565
|
+
const view = kpiCardView(config, item.data, { format: context.formatContext, timezone: context.timezone });
|
|
566
|
+
const value = this._pdfText(view.value);
|
|
567
|
+
const notes = exportNoteLines(item, context.timezone, context.formatContext.locale);
|
|
568
|
+
if (!kpiCardHasExtras(view, notes)) {
|
|
569
|
+
doc.setFont('helvetica', 'bold');
|
|
570
|
+
doc.setFontSize(26);
|
|
571
|
+
doc.setTextColor('#1f2933');
|
|
572
|
+
doc.text(value, x + w / 2, y + h / 2, { align: 'center' });
|
|
573
|
+
if (view.label) {
|
|
574
|
+
doc.setFont('helvetica', 'normal');
|
|
575
|
+
doc.setFontSize(9);
|
|
576
|
+
doc.setTextColor('#7b8794');
|
|
577
|
+
doc.text(view.label, x + w / 2, y + h / 2 + 16, { align: 'center' });
|
|
578
|
+
}
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
const parts = kpiExportParts(view, notes, h, KPI_HEIGHTS);
|
|
582
|
+
let top = y + Math.max(0, (h - kpiExportHeight(view, parts, KPI_HEIGHTS)) / 2);
|
|
497
583
|
doc.setFont('helvetica', 'bold');
|
|
498
584
|
doc.setFontSize(26);
|
|
499
585
|
doc.setTextColor('#1f2933');
|
|
500
|
-
doc.text(value, x + w / 2,
|
|
501
|
-
|
|
586
|
+
doc.text(value, x + w / 2, top + KPI_VALUE_BASELINE, { align: 'center' });
|
|
587
|
+
top += KPI_HEIGHTS.value;
|
|
588
|
+
if (view.label) {
|
|
502
589
|
doc.setFont('helvetica', 'normal');
|
|
503
590
|
doc.setFontSize(9);
|
|
504
|
-
doc.setTextColor(
|
|
505
|
-
doc.text(
|
|
591
|
+
doc.setTextColor(MUTED_COLOR);
|
|
592
|
+
doc.text(this._fit(doc, this._pdfText(view.label), w), x + w / 2, top + 9, { align: 'center' });
|
|
593
|
+
top += KPI_HEIGHTS.label;
|
|
594
|
+
}
|
|
595
|
+
if (parts.delta && view.delta) {
|
|
596
|
+
this._kpiDelta(doc, view.delta, x, top, w);
|
|
597
|
+
top += KPI_HEIGHTS.delta;
|
|
598
|
+
}
|
|
599
|
+
if (parts.window) {
|
|
600
|
+
this._smallLine(doc, this._pdfText(view.window), x, top, w, 'center', 'normal');
|
|
601
|
+
top += KPI_HEIGHTS.window;
|
|
602
|
+
}
|
|
603
|
+
if (parts.target && view.target) {
|
|
604
|
+
this._kpiTarget(doc, view.target, x, top, w);
|
|
605
|
+
top += KPI_HEIGHTS.target;
|
|
606
|
+
}
|
|
607
|
+
if (parts.sparkline && view.sparkline) {
|
|
608
|
+
this._kpiSparkline(doc, view.sparkline.values, view.sparkline.partial, x, top, w);
|
|
609
|
+
top += KPI_HEIGHTS.sparkline;
|
|
610
|
+
}
|
|
611
|
+
for (const line of parts.notes) {
|
|
612
|
+
this._smallLine(doc, this._pdfText(line), x, top, w, 'center', 'italic');
|
|
613
|
+
top += KPI_HEIGHTS.note;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
// The delta row, centered as one group: a triangle pointing the way the
|
|
617
|
+
// value moved (none when the shown change rounds to zero) and the change in
|
|
618
|
+
// the color of what it means, then what it is compared with in grey.
|
|
619
|
+
_kpiDelta(doc, delta, x, top, w) {
|
|
620
|
+
const color = `#${REPORT_KPI_CHANGE_COLORS[delta.tone]}`;
|
|
621
|
+
const change = this._pdfText(delta.text);
|
|
622
|
+
const arrow = delta.trend === ReportKpiTrend.Flat ? 0 : KPI_ARROW + KPI_ARROW_GAP;
|
|
623
|
+
doc.setFont('helvetica', 'bold');
|
|
624
|
+
doc.setFontSize(KPI_DELTA_SIZE);
|
|
625
|
+
const changeWidth = doc.getTextWidth(change);
|
|
626
|
+
doc.setFont('helvetica', 'normal');
|
|
627
|
+
const compared = delta.compared
|
|
628
|
+
? this._fit(doc, ` ${this._pdfText(delta.compared)}`, Math.max(0, w - arrow - changeWidth))
|
|
629
|
+
: '';
|
|
630
|
+
const width = arrow + changeWidth + (compared ? doc.getTextWidth(compared) : 0);
|
|
631
|
+
const baseline = top + KPI_DELTA_SIZE;
|
|
632
|
+
let left = x + Math.max(0, (w - width) / 2);
|
|
633
|
+
if (arrow) {
|
|
634
|
+
const up = delta.trend === ReportKpiTrend.Up;
|
|
635
|
+
const tip = up ? baseline - KPI_ARROW : baseline;
|
|
636
|
+
const base = up ? baseline : baseline - KPI_ARROW;
|
|
637
|
+
doc.setFillColor(color);
|
|
638
|
+
doc.triangle(left, base, left + KPI_ARROW, base, left + KPI_ARROW / 2, tip, 'F');
|
|
639
|
+
left += arrow;
|
|
640
|
+
}
|
|
641
|
+
doc.setFont('helvetica', 'bold');
|
|
642
|
+
doc.setTextColor(color);
|
|
643
|
+
doc.text(change, left, baseline);
|
|
644
|
+
if (compared) {
|
|
645
|
+
doc.setFont('helvetica', 'normal');
|
|
646
|
+
doc.setTextColor(MUTED_COLOR);
|
|
647
|
+
doc.text(compared, left + changeWidth, baseline);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
// The target line ('Goal: $1,000 · 56% of target') and, when the server sent
|
|
651
|
+
// the progress, a bar filled that far: green once the target is met.
|
|
652
|
+
_kpiTarget(doc, target, x, top, w) {
|
|
653
|
+
const text = target.progress ? `${target.text} · ${target.progress}` : target.text;
|
|
654
|
+
this._smallLine(doc, this._pdfText(text), x, top, w, 'center', 'normal');
|
|
655
|
+
if (target.fill === null) {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const barW = Math.min(w * 0.6, KPI_BAR_W);
|
|
659
|
+
const barX = x + (w - barW) / 2;
|
|
660
|
+
const barY = top + NOTE_LINE_H + 1;
|
|
661
|
+
doc.setFillColor(KPI_TRACK_COLOR);
|
|
662
|
+
doc.rect(barX, barY, barW, KPI_BAR_H, 'F');
|
|
663
|
+
if (target.fill > 0) {
|
|
664
|
+
doc.setFillColor(`#${REPORT_KPI_CHANGE_COLORS[target.tone]}`);
|
|
665
|
+
doc.rect(barX, barY, barW * target.fill, KPI_BAR_H, 'F');
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
// The sparkline in a box under the card's lines, as the screen draws it
|
|
669
|
+
// (kpiSparklineGeometry, a 0-100 box): a vector line per run of values, a
|
|
670
|
+
// dot for a lone value, and the last point's marker, hollow while its period
|
|
671
|
+
// is partial.
|
|
672
|
+
_kpiSparkline(doc, values, partial, x, top, w) {
|
|
673
|
+
const geometry = kpiSparklineGeometry(values, partial);
|
|
674
|
+
const boxW = Math.min(w * 0.7, KPI_SPARKLINE_W);
|
|
675
|
+
const boxH = KPI_HEIGHTS.sparkline - 2 * KPI_SPARKLINE_INSET;
|
|
676
|
+
const left = x + (w - boxW) / 2;
|
|
677
|
+
const at = (point) => ({
|
|
678
|
+
x: left + point.x * boxW / 100,
|
|
679
|
+
y: top + KPI_SPARKLINE_INSET + point.y * boxH / 100,
|
|
680
|
+
});
|
|
681
|
+
const color = `#${REPORT_KPI_SPARKLINE_COLOR}`;
|
|
682
|
+
doc.setDrawColor(color);
|
|
683
|
+
doc.setFillColor(color);
|
|
684
|
+
doc.setLineWidth(1);
|
|
685
|
+
for (const line of geometry.lines) {
|
|
686
|
+
const points = line.split(' ').map((pair) => {
|
|
687
|
+
const [px, py] = pair.split(',').map(Number);
|
|
688
|
+
return at({ x: px, y: py });
|
|
689
|
+
});
|
|
690
|
+
const steps = points.slice(1).map((point, index) => [point.x - points[index].x, point.y - points[index].y]);
|
|
691
|
+
doc.lines(steps, points[0].x, points[0].y, [1, 1], 'S', false);
|
|
692
|
+
}
|
|
693
|
+
for (const dot of geometry.dots) {
|
|
694
|
+
const point = at(dot);
|
|
695
|
+
doc.circle(point.x, point.y, KPI_DOT_R, 'F');
|
|
696
|
+
}
|
|
697
|
+
if (geometry.last) {
|
|
698
|
+
const point = at(geometry.last);
|
|
699
|
+
if (geometry.last.hollow) {
|
|
700
|
+
doc.setFillColor('#ffffff');
|
|
701
|
+
doc.circle(point.x, point.y, KPI_DOT_R, 'FD');
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
doc.circle(point.x, point.y, KPI_DOT_R, 'F');
|
|
705
|
+
}
|
|
506
706
|
}
|
|
507
707
|
}
|
|
508
708
|
// A formatted value as jsPDF can draw it. Its standard fonts write text in
|
|
509
709
|
// WinAnsi, which has the no-break space (U+00A0, fr-CA's digit grouping) but
|
|
510
|
-
// not the narrow one (U+202F, which other locales group and space with)
|
|
511
|
-
//
|
|
512
|
-
//
|
|
513
|
-
//
|
|
710
|
+
// not the narrow one (U+202F, which other locales group and space with), the
|
|
711
|
+
// thin and hair spaces (U+2009, U+200A, which Intl puts around a date
|
|
712
|
+
// range's dash: 'Sep 1 – 30, 2026'), the minus sign (U+2212, some locales'
|
|
713
|
+
// negative sign) or a rank change's triangles: each would print as stray
|
|
714
|
+
// glyphs. The narrow space becomes a no-break space, so a number still never
|
|
715
|
+
// wraps across a line; the thin and hair spaces a plain space; the minus
|
|
716
|
+
// sign a hyphen; and a rank's rise a plus sign and its fall a hyphen
|
|
717
|
+
// ('▲ 2' reads '+2').
|
|
514
718
|
_pdfText(text) {
|
|
515
|
-
return text
|
|
719
|
+
return text
|
|
720
|
+
.replace(/\u202F/g, '\u00A0')
|
|
721
|
+
.replace(/[\u2009\u200A]/g, ' ')
|
|
722
|
+
.replace(/\u2212/g, '-')
|
|
723
|
+
.replace(/\u25B2\s?/g, '+')
|
|
724
|
+
.replace(/\u25BC\s?/g, '-');
|
|
516
725
|
}
|
|
517
726
|
_slug(name) {
|
|
518
727
|
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';
|
|
@@ -523,4 +732,4 @@ export class ReportPdfService {
|
|
|
523
732
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
|
|
524
733
|
type: Injectable
|
|
525
734
|
}] });
|
|
526
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWhFLE9BQU8sRUFBcUIseUJBQXlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZGLE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBNEMsY0FBYyxHQUNoRyxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQytDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQ2hILFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxHQUM1QyxNQUFNLG1DQUFtQyxDQUFDOztBQUczQyxrQ0FBa0M7QUFDbEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRWQsd0NBQXdDO0FBQ3hDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUVuQixxRUFBcUU7QUFDckUsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUVqQyx3RUFBd0U7QUFDeEUsZ0VBQWdFO0FBQ2hFLHlDQUF5QztBQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbkMsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxNQUFNLFFBQVEsR0FBdUIsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVB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RSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQXZtQlUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcm1hdE51bWJlciwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIEtwaUNvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydEhlYWRlckZvb3RlcixcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbXBvbmVudEdlb21ldHJ5LCBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HLCBwYWdlR2VvbWV0cnkgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVGV4dFBhcmFncmFwaCwgVGV4dFJ1biwgVGV4dFRva2VuQ29udGV4dCwgdGV4dFBhcmFncmFwaHMsXG59IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIENvbGxlY3RlZENvbXBvbmVudCwgQ29sbGVjdGVkUGFnZSwgQ29sbGVjdGVkUmVwb3J0LCBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLCBleHBvcnRUaXRsZSwgbGlzdENvbHVtbnMsXG4gIGxpc3RIZWFkaW5ncywgbGlzdFRvdGFsc1JvdywgbW9yZVJvd3NOb3RpY2UsXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0J3MgUERGIHRhYmxlLiBBIHRhYmxlIHRoYXQgb3V0Z3Jvd3MgaXRzIGJveFxuLy8gY29udGludWVzIG9udG8gcGFnZXMgb2YgaXRzIG93biwgc28gdGhpcyBpcyBob3cgZmFyIGl0IG1heSBydW46IGFib3V0IDEyLTE1XG4vLyBjb250aW51YXRpb24gcGFnZXMgb24gYSBsZXR0ZXIgcGFnZSwgYW5kIGEgdGVudGggb2YgdGhlIHNlcnZlcidzIDUwMDAtcm93XG4vLyBjZWlsaW5nLiBBIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIG1vcmVSb3dzTm90aWNlKCkgcm93LlxuZXhwb3J0IGNvbnN0IFBERl9MSVNUX1JPV1MgPSA1MDA7XG5cbi8vIEhvdyBmYXIgYSBjb250aW51YXRpb24gdGFibGUgc2l0cyBpbnNpZGUgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGJhbmRzLFxuLy8gcG9pbnRzLiBBIHBhZ2Ugd2l0aCBubyBiYW5kIChvciB3aXRoIHRoZSBtYXN0ZXIgaGlkZGVuKSBrZWVwc1xuLy8gTk9fQkFORF9NQVJHSU4gZnJvbSB0aGF0IGVkZ2UgaW5zdGVhZC5cbmNvbnN0IENPTlRJTlVBVElPTl9HQVAgPSAwLjI1ICogUFQ7XG5jb25zdCBOT19CQU5EX01BUkdJTiA9IDAuNSAqIFBUO1xuY29uc3QgTk9fQkFORFM6IFJlcG9ydEhlYWRlckZvb3RlciA9IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcblxuLy8gVGhlIGxhc3Qgcm93IG9mIGEgbGlzdCBib3ggd2hvc2Ugcm93cyBjYXJyeSBvbiBwYXN0IGl0LlxuY29uc3QgQ09OVElOVUVEX05PVElDRSA9ICdDb250aW51ZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlcyc7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgZXZlcnkgZHJhd2luZyBzdGVwIG9mIG9uZSBleHBvcnQgc2hhcmVzLCBidWlsdCBvbmNlIGluIGV4cG9ydCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICBqc1BERjogYW55O1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbiAgcGFnZVc6IG51bWJlcjtcbiAgcGFnZUg6IG51bWJlcjtcbiAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnIHwgJ3BvcnRyYWl0Jztcbn1cblxuLy8gRml4ZWQgY29sdW1uIHdpZHRocywgYnkgY29sdW1uIGluZGV4LCBpbiBwb2ludHMsIGFuZCB0aGUgcmlnaHQgYWxpZ25tZW50IG9mXG4vLyBhIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycy5cbnR5cGUgUGRmQ29sdW1uU3R5bGVzID0gUmVjb3JkPG51bWJlciwgeyBjZWxsV2lkdGg6IG51bWJlcjsgaGFsaWduPzogJ3JpZ2h0JyB9PjtcblxuLy8gQSB0YWJsZSBib2R5IGNlbGw6IHBsYWluIHRleHQsIG9yIGEgbm90aWNlIHJvdydzIG9uZSBjZWxsIHNwYW5uaW5nIGV2ZXJ5XG4vLyBjb2x1bW4uXG50eXBlIFBkZlRhYmxlQ2VsbCA9IHN0cmluZyB8IHsgY29udGVudDogc3RyaW5nOyBjb2xTcGFuOiBudW1iZXI7IHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuLy8gVGhlIHJvd3Mgb2YgYSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgY2FycmllZCBvbnRvIGNvbnRpbnVhdGlvblxuLy8gcGFnZXMgYWZ0ZXIgaXRzIHJlcG9ydCBwYWdlLiB4IGFuZCB3IGFyZSB0aGUgYm94J3MsIGluIHBvaW50cywgYW5kIHRoZVxuLy8gY29sdW1uIHdpZHRocyBhbmQgYWxpZ25tZW50cyBhcmUgdGhlIG9uZXMgdGhlIG9uLXBhZ2UgdGFibGUgd2FzIGRyYXduIHdpdGgsXG4vLyBzbyB0aGUgdGFibGUgcmVhZHMgYXMgb25lIGFjcm9zcyBwYWdlcy5cbmludGVyZmFjZSBQZGZUYWJsZU92ZXJmbG93IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIFRoZSB0ZXh0IHRoZSBsaXN0IHdhcyBzZWFyY2hlZCBieSwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgaGVhZDogc3RyaW5nW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgcm93czogc3RyaW5nW11bXTtcbiAgb21pdHRlZDogbnVtYmVyO1xuICAvLyBUaGUgbGlzdCdzIHRvdGFscyByb3csIHdoaWNoIGNsb3NlcyB0aGUgbGFzdCBjb250aW51YXRpb24gcGFnZS5cbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICB4OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG59XG5cbi8vIEJ1aWxkcyB0aGUgUERGIGNsaWVudC1zaWRlIHdpdGgganNwZGYuIFRoZSByZXBvcnQncyB1bml0IGlzIGluY2hlcyBhbmQgUERGc1xuLy8gYXJlIHBvaW50cyBhdCBleGFjdGx5IDcyL2luY2gsIHNvIGVhY2ggcmVwb3J0IHBhZ2UgYmVjb21lcyBvbmUgUERGIHBhZ2Ugb2Zcbi8vIHRoZSBleGFjdCBwaHlzaWNhbCBzaXplIGFuZCBjb21wb25lbnRzIGxhbmQgYXQgdGhlaXIgcHJlY2lzZSBwb3NpdGlvbnMuXG4vLyBDaGFydHMgYXJlIHJlbmRlcmVkIHRocm91Z2ggYW4gb2Zmc2NyZWVuIEVDaGFydHMgaW5zdGFuY2UgYXQgM8OXIHBpeGVsXG4vLyByYXRpbyDigJQgcGl4ZWwtaWRlbnRpY2FsIHRvIHRoZSBzY3JlZW4sIGNyaXNwIGF0IHByaW50IHNpemUg4oCUIGFuZCB0YWJsZXMgYXJlXG4vLyBkcmF3biB3aXRoIGpzcGRmLWF1dG90YWJsZS4gQm90aCBsaWJyYXJpZXMgbG9hZCBsYXppbHkgaW50byB0aGVpciBvd24gY2h1bmtzLlxuLy9cbi8vIEEgbGlzdCB0YWJsZSBpcyBmaXR0ZWQgdG8gaXRzIGJveCBieSBsYXlpbmcgaXQgb3V0IGZpcnN0LCBuZXZlciBieSBhXG4vLyByb3ctaGVpZ2h0IGVzdGltYXRlLCBzbyBpdCBjYW5ub3Qgc3BpbGwgcGFzdCB0aGUgYm94LiBUaGUgcm93cyB0aGF0IGRvIG5vdFxuLy8gZml0IGNvbnRpbnVlIG9uIHBhZ2VzIG9mIHRoZWlyIG93biBhZnRlciB0aGUgcmVwb3J0IHBhZ2UsIHVuZGVyIHRoZSBzYW1lXG4vLyBoZWFkZXIvZm9vdGVyIGFuZCB3aXRoIHRoZSBzYW1lIGNvbHVtbiB3aWR0aHMsIHVwIHRvIFBERl9MSVNUX1JPV1M7IGFcbi8vIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIHJvdyBwb2ludGluZyB0byB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgYXV0b1RhYmxlID0gKGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJykpLmRlZmF1bHQ7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBmb3JtYXRDb250ZXh0OiBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dCxcbiAgICAgIHBhZ2VXLFxuICAgICAgcGFnZUgsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLy8gT25lIHJlcG9ydCBwYWdlOiB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZmlyc3QsIHVuZGVyIHRoZSBwYWdlJ3Mgb3duXG4gIC8vIGNvbXBvbmVudHMuIEEgbGlzdCB0aGF0IG91dGdyb3dzIGl0cyBib3ggbGVhdmVzIGl0cyByZW1haW5pbmcgcm93cyBpblxuICAvLyBvdmVyZmxvd3MuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlclBhZ2UoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb2xsZWN0ZWRQYWdlOiBDb2xsZWN0ZWRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gcGFnZUdlb21ldHJ5KHJlcG9ydCwgY29sbGVjdGVkUGFnZS5wYWdlKTtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgdG9rZW5zKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0ZWRQYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgIGNvbnN0IGJveCA9IGdlb21ldHJ5LmdldChpdGVtLmNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChpdGVtLmNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGV4dChkb2MsIGl0ZW0uY29tcG9uZW50LCBib3ggPz8gaXRlbS5jb21wb25lbnQsIHRva2Vucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgb3ZlcmZsb3dzLCBib3gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck1hc3Rlcihjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlLCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAocGFnZS5tYXN0ZXJIaWRkZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb250ZXh0LnJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX3JlbmRlclRleHQoY29udGV4dC5kb2MsIGNvbXBvbmVudCwgY29tcG9uZW50LCB0b2tlbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGRvYy50ZXh0KGNvdmVyTGluZXMoY29sbGVjdGVkKS5tYXAoKGxpbmUpID0+IHRoaXMuX3BkZlRleHQobGluZSkpLCA0MCwgcGFnZUggKiAwLjM1ICsgMjYpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrLCBsYWlkIG91dCBieSBoYW5kOiBqc1BERiBkcmF3cyBzdHJpbmdzLCBub3QgcmljaCB0ZXh0LCBzbyBlYWNoXG4gIC8vIHBhcmFncmFwaCdzIHJ1bnMgYXJlIGJyb2tlbiBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBibG9jaydzIHdpZHRoIGFuZFxuICAvLyBkcmF3biB3b3JkIGJ5IHdvcmQgaW4gdGhlaXIgb3duIGZvbnQsIHNpemUgYW5kIGNvbG9yLiBMaW5lcyBwYXN0IHRoZVxuICAvLyBibG9jaydzIGhlaWdodCBhcmUgZHJvcHBlZCDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICBwcml2YXRlIF9yZW5kZXJUZXh0KGRvYzogYW55LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgYm94OiBDb21wb25lbnRHZW9tZXRyeSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgaW5zZXQgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gKHZhbHVlID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcpICogUFQ7XG5cbiAgICBjb25zdCBsZWZ0ID0gYm94LnggKiBQVCArIGluc2V0KHBhZGRpbmc/LmxlZnQpO1xuICAgIGNvbnN0IHRvcCA9IGJveC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApO1xuICAgIGNvbnN0IHdpZHRoID0gYm94LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IChib3gueSArIGJveC5oKSAqIFBUIC0gaW5zZXQocGFkZGluZz8uYm90dG9tKTtcblxuICAgIGxldCBjdXJzb3JZID0gdG9wO1xuICAgIGxldCBsaXN0TnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIHRleHRQYXJhZ3JhcGhzKGNvbXBvbmVudC5jb25maWc/Lmh0bWwgPz8gJycsIHRva2VucykpIHtcbiAgICAgIGxpc3ROdW1iZXIgPSBwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGxpc3ROdW1iZXIgKyAxIDogMDtcbiAgICAgIGNvbnN0IGluZGVudCA9IHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDA7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gaW5kZW50KTtcblxuICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgbGluZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBNYXRoLm1heCguLi5saW5lLm1hcCgod29yZCkgPT4gd29yZC5zaXplKSwgcGFyYWdyYXBoLnJ1bnNbMF0/LmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgICBpZiAoY3Vyc29yWSArIGxpbmVIZWlnaHQgPiBib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICBjdXJzb3JZID0gSW5maW5pdHk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZSA9IGN1cnNvclkgKyBzaXplO1xuICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBsaW5lLnJlZHVjZSgoc3VtLCB3b3JkKSA9PiBzdW0gKyB3b3JkLndpZHRoLCAwKTtcbiAgICAgICAgbGV0IHggPSBsZWZ0ICsgaW5kZW50ICsgdGhpcy5fYWxpZ25PZmZzZXQocGFyYWdyYXBoLmFsaWduLCB3aWR0aCAtIGluZGVudCwgbGluZVdpZHRoKTtcblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGxlZnQsIGJhc2VsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICAgICAgdGhpcy5fZHJhd1dvcmQoZG9jLCB3b3JkLCB4LCBiYXNlbGluZSk7XG4gICAgICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY3Vyc29yWSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJzb3JZID09PSBJbmZpbml0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQW4gZW1wdHkgcGFyYWdyYXBoIGlzIHN0aWxsIGEgbGluZS5cbiAgICAgIGlmICghbGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnNvclkgKz0gREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICBsZXQgbGluZTogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9LCB4OiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSB3b3JkLnJ1bjtcblxuICAgIGlmIChydW4uaGlnaGxpZ2h0KSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKHJ1bi5oaWdobGlnaHQpO1xuICAgICAgZG9jLnJlY3QoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjksIHdvcmQud2lkdGgsIHdvcmQuc2l6ZSAqIDEuMTUsICdGJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udChkb2MsIHJ1biwgd29yZC5zaXplKTtcbiAgICBkb2MudGV4dCh3b3JkLnRleHQsIHgsIGJhc2VsaW5lKTtcblxuICAgIGNvbnN0IGNvbG9yID0gcnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUjtcbiAgICBjb25zdCBpbmtXaWR0aCA9IHdvcmQud2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgd29yZC50ZXh0KTtcbiAgICBpZiAocnVuLnVuZGVybGluZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMiwgeCArIGlua1dpZHRoLCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIpO1xuICAgIH1cbiAgICBpZiAocnVuLnN0cmlrZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLmxpbmspIHtcbiAgICAgIGRvYy5saW5rKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplLCBpbmtXaWR0aCwgd29yZC5zaXplICogMS4yLCB7IHVybDogcnVuLmxpbmsgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8ganNQREYncyBzdGFuZGFyZCBmb250cyBhcmUgSGVsdmV0aWNhLCBUaW1lcyBhbmQgQ291cmllcjsgYSBibG9jaydzIGZhY2UgaXNcbiAgLy8gbWFwcGVkIG9udG8gd2hpY2hldmVyIG9mIHRoZSB0aHJlZSBpdCByZXNlbWJsZXMuXG4gIHByaXZhdGUgX2ZvbnQoZG9jOiBhbnksIHJ1bjogVGV4dFJ1biwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmFjZSA9IChydW4uZm9udEZhY2UgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmFtaWx5ID0gL2NvdXJpZXJ8bW9uby8udGVzdChmYWNlKVxuICAgICAgPyAnY291cmllcidcbiAgICAgIDogKC90aW1lc3xnZW9yZ2lhfHNlcmlmLy50ZXN0KGZhY2UpICYmICFmYWNlLmluY2x1ZGVzKCdzYW5zJykgPyAndGltZXMnIDogJ2hlbHZldGljYScpO1xuICAgIGNvbnN0IHN0eWxlID0gcnVuLmJvbGQgJiYgcnVuLml0YWxpY1xuICAgICAgPyAnYm9sZGl0YWxpYydcbiAgICAgIDogKHJ1bi5ib2xkID8gJ2JvbGQnIDogKHJ1bi5pdGFsaWMgPyAnaXRhbGljJyA6ICdub3JtYWwnKSk7XG5cbiAgICBkb2Muc2V0Rm9udChmYW1pbHksIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYWlsaW5nU3BhY2UoZG9jOiBhbnksIHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhaWxpbmcgPSB0ZXh0Lmxlbmd0aCAtIHRleHQudHJpbUVuZCgpLmxlbmd0aDtcblxuICAgIHJldHVybiB0cmFpbGluZyA/IGRvYy5nZXRUZXh0V2lkdGgoJyAnKSAqIHRyYWlsaW5nIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduT2Zmc2V0KGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLCB3aWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh3aWR0aCAtIGxpbmVXaWR0aCkgLyAyKTtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHdpZHRoIC0gbGluZVdpZHRoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGlzIHBhZ2UuIFRoZSBudW1iZXIgaXMgdGhlXG4gIC8vIHBoeXNpY2FsIHBhZ2UgYW1vbmcgdGhlIHJlcG9ydCdzIHBhZ2VzLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQg4oCUIHRoZVxuICAvLyB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLiBUaGUgbmFtZSBzdGF5cyB0aGUgcmVwb3J0IHBhZ2Uncywgc28gYVxuICAvLyBjb250aW51YXRpb24gcGFnZSBpcyBuYW1lZCBmb3IgdGhlIHBhZ2UgaXRzIHRhYmxlIHN0YXJ0ZWQgb24uXG4gIHByaXZhdGUgX3Rva2VucyhyZXBvcnQ6IFJlcG9ydCwgcGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogVGV4dFRva2VuQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBwYWdlTmFtZTogcGFnZS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWAsXG4gICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29tcG9uZW50KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICAgIGdlb21ldHJ5PzogQ29tcG9uZW50R2VvbWV0cnksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGFycml2ZXMgaW4gaW5jaGVzIChmbG93IGxheW91dCBwcmUtcmVzb2x2ZWQpOyB0aGUgUERGIGRyYXdzIGluXG4gICAgLy8gcG9pbnRzLlxuICAgIGNvbnN0IGluY2hlcyA9IGdlb21ldHJ5ID8/IGNvbXBvbmVudDtcbiAgICBjb25zdCB4ID0gaW5jaGVzLnggKiBQVDtcbiAgICBjb25zdCB5ID0gaW5jaGVzLnkgKiBQVDtcbiAgICBjb25zdCB3ID0gaW5jaGVzLncgKiBQVDtcbiAgICBjb25zdCBoID0gaW5jaGVzLmggKiBQVDtcblxuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCBpdGVtLnNlYXJjaCk7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShkb2MsIHRpdGxlLCB4LCB5LCB3KTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHkgKyBUSVRMRV9IO1xuICAgIGNvbnN0IGJvZHlIID0gTWF0aC5tYXgoMjAsIGggLSBUSVRMRV9IKTtcblxuICAgIGlmICghaXRlbS5kYXRhIHx8ICFpdGVtLmRhdGEucm93cz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGRvYywgZW1wdHlMYWJlbChpdGVtKSwgeCwgYm9keVksIHcsIGJvZHlIKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NoYXJ0Jzoge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHJlbmRlckNoYXJ0SW1hZ2UoY29tcG9uZW50LCBpdGVtLmRhdGEsIHcsIGJvZHlILCBjb250ZXh0LmZvcm1hdENvbnRleHQpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgsIG92ZXJmbG93cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGNvbnRleHQsIGNvbXBvbmVudCwgaXRlbS5kYXRhLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYm9sZCBzdHJpcCBvdmVyIGEgY29tcG9uZW50LCBhbmQgb3ZlciBlYWNoIG9mIGl0cyBjb250aW51YXRpb24gcGFnZXMuXG4gIHByaXZhdGUgX2NvbXBvbmVudFRpdGxlKGRvYzogYW55LCB0aXRsZTogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICB9XG5cbiAgLy8gQW4gaXRhbGljIGdyZXkgbGluZSBjZW50ZXJlZCBpbiBhIGNvbXBvbmVudCdzIGJvZHksIGZvciBhIGJvZHkgdGhhdCBob2xkc1xuICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHMgY29udGVudC5cbiAgcHJpdmF0ZSBfYm94Tm90ZShkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2l0YWxpYycpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICB9XG5cbiAgLy8gQSBsaXN0J3Mgb24tcGFnZSB0YWJsZS4gQWxsIG9mIGl0cyBmZXRjaGVkIHJvd3MgYXJlIGxhaWQgb3V0IG9uY2UgdG8gbGVhcm5cbiAgLy8gaG93IG1hbnkgdGhlIGJveCBob2xkczsgd2hlbiB0aGV5IGRvIG5vdCBhbGwgZml0LCB0aGUgYm94J3MgbGFzdCByb3cgc2F5c1xuICAvLyB0aGUgdGFibGUgY29udGludWVzIGFuZCB0aGUgcmVzdCBnbyB0byBvdmVyZmxvd3MgZm9yIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBib3ggdG9vIHNob3J0IGZvciBldmVuIHRoZSBoZWFkIGNhcnJpZXMgdGhlIG5vdGljZSBhcyBhIGxpbmUgaW5zdGVhZC5cbiAgLy8gQSB0b3RhbHMgcm93IGNsb3NlcyB0aGUgdGFibGUgb25jZTogaW4gdGhlIGJveCB3aGVuIGV2ZXJ5IHJvdyBmaXRzIGl0LFxuICAvLyBlbHNlIGFmdGVyIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiByb3cuIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfSA9IGl0ZW07XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZGF0YSBhcyBDb21wb25lbnREYXRhO1xuICAgIGNvbnN0IGhlYWQgPSBsaXN0SGVhZGluZ3MoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKVxuICAgICAgLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSk7XG4gICAgY29uc3QgeyBjZWxscywgbnVtZXJpYywgZm9vdCB9ID0gdGhpcy5fdGFibGVDZWxscyhjb250ZXh0LCBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IG9taXR0ZWQgPSBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMgfSA9IHRoaXMuX21lYXN1cmUoY29udGV4dCwgaGVhZCwgY2VsbHMsIG51bWVyaWMsIGZvb3QsIHgsIHksIHcsIGJvdHRvbSk7XG5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgb21pdHRlZCA9PT0gMCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzLCBmb290KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgbm90aWNlIHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbGFzdCByb3cgdGhhdCBmaXQsIHNvIHRoYXQgcm93IG1vdmVzXG4gICAgLy8gdG8gdGhlIGNvbnRpbnVhdGlvbi4gb21pdHRlZCA+IDAgbWVhbnMgYSBmdWxsIFBERl9MSVNUX1JPV1MgZmV0Y2gsIHdoaWNoXG4gICAgLy8gbmV2ZXIgZml0cyBvbmUgYm94LCBzbyB0aGUgQ1NWIG5vdGljZSBhbHdheXMgbGFuZHMgb24gYSBjb250aW51YXRpb25cbiAgICAvLyBwYWdlLlxuICAgIGNvbnN0IGtlcHQgPSBNYXRoLm1heCgwLCBmaXQgLSAxKTtcbiAgICBvdmVyZmxvd3MucHVzaCh7IGNvbXBvbmVudCwgc2VhcmNoLCBoZWFkLCBudW1lcmljLCByb3dzOiBjZWxscy5zbGljZShrZXB0KSwgb21pdHRlZCwgZm9vdCwgeCwgdywgY29sdW1uU3R5bGVzIH0pO1xuXG4gICAgaWYgKGZpdCA+PSAxKSB7XG4gICAgICBjb25zdCBib2R5ID0gWy4uLmNlbGxzLnNsaWNlKDAsIGtlcHQpLCB0aGlzLl9ub3RpY2VSb3coQ09OVElOVUVEX05PVElDRSwgaGVhZC5sZW5ndGgsIHRydWUpXTtcbiAgICAgIHRoaXMuX2RyYXdUYWJsZShjb250ZXh0LCB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgYm9keSwgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm94Tm90ZShjb250ZXh0LmRvYywgQ09OVElOVUVEX05PVElDRSwgeCwgeSwgdywgaCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRWFjaCBmZXRjaGVkIHJvdyBhcyB0aGUgc3RyaW5ncyBpdHMgdGFibGUgY2VsbHMgcHJpbnQsIGluIHRoZSByZXBvcnQnc1xuICAvLyB6b25lLCBsb2NhbGUgYW5kIGN1cnJlbmN5LCB3aGljaCBjb2x1bW5zIGhvbGQgZm9ybWF0dGVkIG51bWJlcnMsIGFuZCB0aGVcbiAgLy8gdG90YWxzIHJvdyAobnVsbCB3aXRob3V0IG9uZSkuIFRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIGFyZSBsZWZ0IG91dC5cbiAgcHJpdmF0ZSBfdGFibGVDZWxscyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgaGlkZGVuQ29sdW1uczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IHsgY2VsbHM6IHN0cmluZ1tdW107IG51bWVyaWM6IGJvb2xlYW5bXTsgZm9vdDogc3RyaW5nW10gfCBudWxsIH0ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IGNlbGxzID0gZGF0YS5yb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9wZGZUZXh0KFxuICAgICAgZXhwb3J0Q2VsbChyb3dbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0KSxcbiAgICApKSk7XG4gICAgY29uc3QgZm9vdCA9IGxpc3RUb3RhbHNSb3coZGF0YSwgY29sdW1ucywgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjZWxscyxcbiAgICAgIG51bWVyaWM6IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5udW1lcmljKSxcbiAgICAgIGZvb3Q6IGZvb3QgPyBmb290Lm1hcCgoY2VsbCkgPT4gdGhpcy5fcGRmVGV4dChjZWxsKSkgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgZXZlcnkgbGlzdCB0YWJsZSBzaGFyZXM6IHRoZSBkcnkgcnVuLCB0aGUgb24tcGFnZVxuICAvLyBkcmF3IGFuZCB0aGUgY29udGludWF0aW9uIHBhZ2VzLCBzbyB0aGUgdGhyZWUgbGF5IGEgdGFibGUgb3V0IGFsaWtlLiBUaGVcbiAgLy8gZm9udCBpcyBuYW1lZCByYXRoZXIgdGhhbiBpbmhlcml0ZWQsIHNpbmNlIHRoZSBkb2MgY2FycmllcyB3aGF0ZXZlciB0aGVcbiAgLy8gbGFzdCB0ZXh0IGRyYXduIGxlZnQgc2V0LiBib3R0b20gaXMgdGhlIG1hcmdpbiB1bmRlciB0aGUgdGFibGUsIHBvaW50cy5cbiAgLy9cbiAgLy8gQSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMgaXMgcmlnaHQtYWxpZ25lZCwgaXRzIGhlYWRpbmcgYW5kIHRvdGFsXG4gIC8vIHRvbzogdGhlIGJvZHkgdGhyb3VnaCBjb2x1bW5TdHlsZXMsIHdoaWNoIGF1dG9UYWJsZSBhcHBsaWVzIHRvIGJvZHkgY2VsbHNcbiAgLy8gb25seSwgYW5kIHRoZSBoZWFkaW5nIGFuZCB0b3RhbCB0aHJvdWdoIHRoZSBkaWRQYXJzZUNlbGwgaG9vaywgb24gZXZlcnlcbiAgLy8gcGFnZSB0aGUgaGVhZGluZyByZXBlYXRzLiBBIHRvdGFscyByb3cgKGZvb3QpIHByaW50cyBvbmNlLCB1bmRlciB0aGVcbiAgLy8gdGFibGUncyBsYXN0IHJvdywgYm9sZCBvbiB0aGUgYm9yZGVyIGdyYXkuXG4gIHByaXZhdGUgX3RhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBib2R5OiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIHg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICAgY29sdW1uU3R5bGVzPzogUGRmQ29sdW1uU3R5bGVzLFxuICAgIGZvb3Q/OiBzdHJpbmdbXSB8IG51bGwsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQ6IFtoZWFkXSxcbiAgICAgIGJvZHksXG4gICAgICBzdGFydFksXG4gICAgICBtYXJnaW46IHsgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdywgYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3LFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7IGZvbnQ6ICdoZWx2ZXRpY2EnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250U2l6ZTogOCwgY2VsbFBhZGRpbmc6IDMsIHRleHRDb2xvcjogJyMxZjI5MzMnIH0sXG4gICAgICBoZWFkU3R5bGVzOiB7IGZpbGxDb2xvcjogJyM0ZTc5YTcnLCB0ZXh0Q29sb3I6ICcjZmZmZmZmJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgIGFsdGVybmF0ZVJvd1N0eWxlczogeyBmaWxsQ29sb3I6ICcjZjVmN2ZhJyB9LFxuICAgICAgLi4uKGNvbHVtblN0eWxlcyA/IHsgY29sdW1uU3R5bGVzIH0gOiB7fSksXG4gICAgICAuLi4oZm9vdFxuICAgICAgICA/IHtcbiAgICAgICAgICBmb290OiBbZm9vdF0sXG4gICAgICAgICAgc2hvd0Zvb3Q6ICdsYXN0UGFnZScsXG4gICAgICAgICAgZm9vdFN0eWxlczogeyBmaWxsQ29sb3I6ICcjZTRlN2ViJywgdGV4dENvbG9yOiAnIzFmMjkzMycsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBkaWRQYXJzZUNlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChob29rLnNlY3Rpb24gPT09ICdoZWFkJyB8fCBob29rLnNlY3Rpb24gPT09ICdmb290JykgJiYgbnVtZXJpY1tob29rLmNvbHVtbi5pbmRleF0pIHtcbiAgICAgICAgICBob29rLmNlbGwuc3R5bGVzLmhhbGlnbiA9ICdyaWdodCc7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgbm90aWNlIGFzIGEgdGFibGUgcm93OiBvbmUgaXRhbGljIGdyZXkgY2VsbCBzcGFubmluZyBldmVyeSBjb2x1bW4uIEFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGlzIGVsbGlwc2l6ZWQgYXQgdGhlIGJveCdzIHdpZHRoIGFuZCBrZWVwcyB0aGUgZGF0YVxuICAvLyBjZWxscycgZm9udCBzaXplIGFuZCBwYWRkaW5nLCBzbyBpdCBpcyBuZXZlciB0YWxsZXIgdGhhbiB0aGUgZGF0YSByb3dcbiAgLy8gd2hvc2UgcGxhY2UgaXQgdGFrZXMuXG4gIHByaXZhdGUgX25vdGljZVJvdyh0ZXh0OiBzdHJpbmcsIHNwYW46IG51bWJlciwgc2luZ2xlTGluZTogYm9vbGVhbik6IFBkZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICBjb2xTcGFuOiBzcGFuLFxuICAgICAgLy8gTGVmdC1hbGlnbmVkIHdoYXRldmVyIHRoZSBmaXJzdCBjb2x1bW4gaXM6IGEgc3Bhbm5lZCBjZWxsIG90aGVyd2lzZVxuICAgICAgLy8gdGFrZXMgY29sdW1uU3R5bGVzWzBdLCByaWdodC1hbGlnbmVkIHdoZW4gdGhhdCBjb2x1bW4gaXMgbnVtZXJpYy5cbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250U3R5bGU6ICdpdGFsaWMnLFxuICAgICAgICB0ZXh0Q29sb3I6ICcjN2I4Nzk0JyxcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsXG4gICAgICAgIC4uLihzaW5nbGVMaW5lID8geyBvdmVyZmxvdzogJ2VsbGlwc2l6ZScgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfV07XG4gIH1cblxuICAvLyBMYXlzIGV2ZXJ5IGZldGNoZWQgcm93IG91dCBvbmNlIG9uIGEgc2NyYXRjaCBkb2N1bWVudCBvZiB0aGUgc2FtZSBwYWdlXG4gIC8vIHNpemUsIHdpdGggdGhlIG9wdGlvbnMgdGhlIHJlYWwgZHJhdyB1c2VzLCBhbmQgcmVhZHMgYmFjayBob3cgbWFueSBib2R5XG4gIC8vIHJvd3MgdGhlIGJveCdzIHBhZ2UgaG9sZHMgKGZpdCkgYW5kIHRoZSBjb2x1bW4gd2lkdGhzIGF1dG9UYWJsZSBjaG9zZSxcbiAgLy8gd2l0aCBlYWNoIG51bWVyaWMgY29sdW1uJ3MgcmlnaHQgYWxpZ25tZW50IG1lcmdlZCBpbiwgc28gdGhlIG9uLXBhZ2VcbiAgLy8gdGFibGUgYW5kIGl0cyBjb250aW51YXRpb24gcGFnZXMgY2FycnkgYm90aC4gVGhlIHRvdGFscyByb3cgaXMgbGFpZCBvdXRcbiAgLy8gdG9vLCBzbyB0aGUgd2lkdGhzIGhvbGQgaXQsIGFuZCBhIHRhYmxlIHdob3NlIHJvd3MgZml0IHRoZSBib3ggYnV0IHdob3NlXG4gIC8vIHRvdGFscyByb3cgZG9lcyBub3QgbW92ZXMgaXRzIGxhc3Qgcm93IG9uLiBmaXQgMCBtZWFucyBub3QgZXZlbiBvbmVcbiAgLy8gYm9keSByb3cgZml0cyB1bmRlciB0aGUgaGVhZCAob3IgdGhlIGhlYWQgaXRzZWxmIGRpZCBub3QgZml0KTogYXV0b1RhYmxlXG4gIC8vIG1vdmVkIHRvIGEgbmV3IHBhZ2UgYmVmb3JlIGRyYXdpbmcuIFRoZSByZWFsIGRvY3VtZW50IGlzIHVudG91Y2hlZC5cbiAgcHJpdmF0ZSBfbWVhc3VyZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGNlbGxzOiBzdHJpbmdbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBmb290OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IHsgZml0OiBudW1iZXI7IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzIH0ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhvb2suc2VjdGlvbiA9PT0gJ2JvZHknICYmIHNjcmF0Y2guZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlciA9PT0gMSkge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IHsgd2lkdGg6IG51bWJlciB9W10gPSBzY3JhdGNoLmxhc3RBdXRvVGFibGUuY29sdW1ucztcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgY29sdW1uU3R5bGVzW2luZGV4XSA9IG51bWVyaWNbaW5kZXhdXG4gICAgICAgID8geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCwgaGFsaWduOiAncmlnaHQnIH1cbiAgICAgICAgOiB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUsIHRoZW4gcmVtb3ZlcyBhbnkgcGFnZSB0aGUgZHJhdyBhZGRlZC4gVGhhdCBzaG91bGRcbiAgLy8gbmV2ZXIgaGFwcGVuOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHMgYW5kIGFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBUaGUgY2hlY2sgZXhpc3RzIHNvIGFcbiAgLy8gc3RyYXkgcGFnZSBjYW4gbmV2ZXIgY2F0Y2ggdGhlIHJlcG9ydCBwYWdlJ3MgcmVtYWluaW5nIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgX2RyYXdUYWJsZShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHBhZ2UgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIG9wdGlvbnMpO1xuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2Fpbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlXG4gIC8vIGJhbmRzLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCBiYW5kcyA9IHBhZ2UubWFzdGVySGlkZGVuID8gTk9fQkFORFMgOiByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICBsZXQgY291bnRlciA9IHBhZ2VOdW1iZXI7XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGNvbnRleHQuYXV0b1RhYmxlKGRvYywge1xuICAgICAgLi4udGhpcy5fdGFibGVPcHRpb25zKFxuICAgICAgICBjb250ZXh0LCBvdmVyZmxvdy5oZWFkLCBvdmVyZmxvdy5udW1lcmljLCBib2R5LCB4LCB0b3AgKyBUSVRMRV9ILCB3LCBib3R0b20sIG92ZXJmbG93LmNvbHVtblN0eWxlcyxcbiAgICAgICAgb3ZlcmZsb3cuZm9vdCxcbiAgICAgICksXG4gICAgICBtYXJnaW46IHsgdG9wOiB0b3AgKyBUSVRMRV9ILCBib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcgfSxcbiAgICAgIHNob3dIZWFkOiAnZXZlcnlQYWdlJyxcbiAgICAgIC8vIEZpcmVzIG9uIGV2ZXJ5IHBhZ2UgdGhlIHRhYmxlIGRyYXdzIG9uLCB0aGUgZmlyc3QgaW5jbHVkZWQuXG4gICAgICB3aWxsRHJhd1BhZ2U6ICgpID0+IHtcbiAgICAgICAgY291bnRlciArPSAxO1xuICAgICAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgcGFnZSwgdGhpcy5fdG9rZW5zKHJlcG9ydCwgcGFnZSwgaW5kZXgsIGNvdW50ZXIpKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aGlzLl9jb250aW51ZWRUaXRsZShvdmVyZmxvdy5jb21wb25lbnQsIG92ZXJmbG93LnNlYXJjaCksIHgsIHRvcCwgdyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICAvLyBUaGUgbWFyZ2luIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gb25lIGVkZ2U6IGluc2lkZSB0aGUgYmFuZCB3aGVuXG4gIC8vIHRoZSBwYWdlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBiYW5kID8gYmFuZCAqIFBUICsgQ09OVElOVUFUSU9OX0dBUCA6IE5PX0JBTkRfTUFSR0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGludWVkVGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHNlYXJjaCk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBkYXRhOiBDb21wb25lbnREYXRhLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3Qgcm93ID0gZGF0YS5yb3dzWzBdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbiA9IGNvbmZpZy5tZWFzdXJlPy5jb2x1bW4gPz8gT2JqZWN0LmtleXMocm93KVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQoZm9ybWF0TnVtYmVyKHJvd1tjb2x1bW5dLCBjb25maWcubWVhc3VyZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LCB7IGVtcHR5OiAn4oCUJyB9KSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjYpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5tZWFzdXJlPy5sYWJlbCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM3Yjg3OTQnKTtcbiAgICAgIGRvYy50ZXh0KGNvbmZpZy5tZWFzdXJlLmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGZvcm1hdHRlZCB2YWx1ZSBhcyBqc1BERiBjYW4gZHJhdyBpdC4gSXRzIHN0YW5kYXJkIGZvbnRzIHdyaXRlIHRleHQgaW5cbiAgLy8gV2luQW5zaSwgd2hpY2ggaGFzIHRoZSBuby1icmVhayBzcGFjZSAoVSswMEEwLCBmci1DQSdzIGRpZ2l0IGdyb3VwaW5nKSBidXRcbiAgLy8gbm90IHRoZSBuYXJyb3cgb25lIChVKzIwMkYsIHdoaWNoIG90aGVyIGxvY2FsZXMgZ3JvdXAgYW5kIHNwYWNlIHdpdGgpIG9yIHRoZVxuICAvLyBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcycgbmVnYXRpdmUgc2lnbik6IGVpdGhlciB3b3VsZCBwcmludCBhc1xuICAvLyBzdHJheSBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbFxuICAvLyBuZXZlciB3cmFwcyBhY3Jvc3MgYSBsaW5lLCBhbmQgdGhlIG1pbnVzIHNpZ24gYSBoeXBoZW4uXG4gIHByaXZhdGUgX3BkZlRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHUyMDJGL2csICdcXHUwMEEwJykucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpIHx8ICdyZXBvcnQnO1xuICB9XG59XG4iXX0=
|
|
735
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWxELE9BQU8sRUFDMkMsV0FBVyxFQUFFLG9CQUFvQixHQUNsRixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEQsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFDaUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQ3hHLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQy9HLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxHQUM1QyxNQUFNLG1DQUFtQyxDQUFDOztBQUczQyxrQ0FBa0M7QUFDbEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRWQsd0NBQXdDO0FBQ3hDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUVuQiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLE1B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S0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUU3QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHNFQUFzRTtJQUN0RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUscUVBQXFFO0lBQ3JFLHNCQUFzQjtJQUNkLFFBQVEsQ0FBQyxJQUFZO1FBQzNCLE9BQU8sSUFBSTthQUNSLE9BQU8sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO2FBQzVCLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUM7YUFDL0IsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7YUFDdkIsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUM7YUFDMUIsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQS96QlUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBLcGlDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRIZWFkZXJGb290ZXIsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBLcGlDYXJkRGVsdGEsIEtwaUNhcmRUYXJnZXQsIEtwaVNwYXJrbGluZVBvaW50LCBrcGlDYXJkVmlldywga3BpU3BhcmtsaW5lR2VvbWV0cnksXG59IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVGV4dFBhcmFncmFwaCwgVGV4dFJ1biwgVGV4dFRva2VuQ29udGV4dCwgdGV4dFBhcmFncmFwaHMsXG59IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTLCBSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUiB9IGZyb20gJy4uL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIENvbGxlY3RlZENvbXBvbmVudCwgQ29sbGVjdGVkUGFnZSwgQ29sbGVjdGVkUmVwb3J0LCBLcGlFeHBvcnRIZWlnaHRzLCBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLFxuICBleHBvcnROb3RlTGluZXMsIGV4cG9ydFRpdGxlLCBleHBvcnRXaW5kb3dzTGluZSwga3BpQ2FyZEhhc0V4dHJhcywga3BpRXhwb3J0SGVpZ2h0LCBrcGlFeHBvcnRQYXJ0cywgbGlzdENvbHVtbnMsXG4gIGxpc3RIZWFkaW5ncywgbGlzdFRvdGFsc1JvdywgbW9yZVJvd3NOb3RpY2UsXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG5cbi8vIFRoZSBzbWFsbCBwcmludCBhIGNvbXBvbmVudCBtYXkgY2FycnksIHBvaW50czogdGhlIGRheXMgaXQgcmVhZHMgdW5kZXIgaXRzXG4vLyB0aXRsZSAoYSBzdWJ0aXRsZSBsaW5lKSwgaXRzIG5vdGVzIGF0IHRoZSBmb290IG9mIGl0cyBib3ggKGEgbGluZSBlYWNoKSwgYW5kXG4vLyB0aGUgbGluZXMgb2YgYSBLUEkgY2FyZCB1bmRlciBpdHMgdmFsdWUuIEEgY2hhcnQncyBvciBhIGxpc3QncyBub3RlcyBnaXZlXG4vLyB3YXkgYmVmb3JlIGl0cyBib2R5IHdvdWxkIHNocmluayB1bmRlciBNSU5fQk9EWV9ILlxuY29uc3QgU01BTExfU0laRSA9IDcuNTtcbmNvbnN0IFNVQlRJVExFX0ggPSAxMTtcbmNvbnN0IE5PVEVfTElORV9IID0gMTA7XG5jb25zdCBNSU5fQk9EWV9IID0gNDA7XG5jb25zdCBNVVRFRF9DT0xPUiA9ICcjN2I4Nzk0JztcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9ICcjZTRlN2ViJztcbi8vIFRoZSBzcGFya2xpbmUncyB3aWRlc3QgYm94LCBpdHMgdG9wIGFuZCBib3R0b20gaW5zZXQsIGFuZCBpdHMgZG90cycgcmFkaXVzLlxuY29uc3QgS1BJX1NQQVJLTElORV9XID0gMTQwO1xuY29uc3QgS1BJX1NQQVJLTElORV9JTlNFVCA9IDM7XG5jb25zdCBLUElfRE9UX1IgPSAxLjU7XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0J3MgUERGIHRhYmxlLiBBIHRhYmxlIHRoYXQgb3V0Z3Jvd3MgaXRzIGJveFxuLy8gY29udGludWVzIG9udG8gcGFnZXMgb2YgaXRzIG93biwgc28gdGhpcyBpcyBob3cgZmFyIGl0IG1heSBydW46IGFib3V0IDEyLTE1XG4vLyBjb250aW51YXRpb24gcGFnZXMgb24gYSBsZXR0ZXIgcGFnZSwgYW5kIGEgdGVudGggb2YgdGhlIHNlcnZlcidzIDUwMDAtcm93XG4vLyBjZWlsaW5nLiBBIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIG1vcmVSb3dzTm90aWNlKCkgcm93LlxuZXhwb3J0IGNvbnN0IFBERl9MSVNUX1JPV1MgPSA1MDA7XG5cbi8vIEhvdyBmYXIgYSBjb250aW51YXRpb24gdGFibGUgc2l0cyBpbnNpZGUgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGJhbmRzLFxuLy8gcG9pbnRzLiBBIHBhZ2Ugd2l0aCBubyBiYW5kIChvciB3aXRoIHRoZSBtYXN0ZXIgaGlkZGVuKSBrZWVwc1xuLy8gTk9fQkFORF9NQVJHSU4gZnJvbSB0aGF0IGVkZ2UgaW5zdGVhZC5cbmNvbnN0IENPTlRJTlVBVElPTl9HQVAgPSAwLjI1ICogUFQ7XG5jb25zdCBOT19CQU5EX01BUkdJTiA9IDAuNSAqIFBUO1xuY29uc3QgTk9fQkFORFM6IFJlcG9ydEhlYWRlckZvb3RlciA9IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcblxuLy8gVGhlIGxhc3Qgcm93IG9mIGEgbGlzdCBib3ggd2hvc2Ugcm93cyBjYXJyeSBvbiBwYXN0IGl0LlxuY29uc3QgQ09OVElOVUVEX05PVElDRSA9ICdDb250aW51ZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlcyc7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgZXZlcnkgZHJhd2luZyBzdGVwIG9mIG9uZSBleHBvcnQgc2hhcmVzLCBidWlsdCBvbmNlIGluIGV4cG9ydCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICBqc1BERjogYW55O1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbiAgcGFnZVc6IG51bWJlcjtcbiAgcGFnZUg6IG51bWJlcjtcbiAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnIHwgJ3BvcnRyYWl0Jztcbn1cblxuLy8gRml4ZWQgY29sdW1uIHdpZHRocywgYnkgY29sdW1uIGluZGV4LCBpbiBwb2ludHMsIGFuZCB0aGUgcmlnaHQgYWxpZ25tZW50IG9mXG4vLyBhIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycy5cbnR5cGUgUGRmQ29sdW1uU3R5bGVzID0gUmVjb3JkPG51bWJlciwgeyBjZWxsV2lkdGg6IG51bWJlcjsgaGFsaWduPzogJ3JpZ2h0JyB9PjtcblxuLy8gQSB0YWJsZSBib2R5IGNlbGw6IHBsYWluIHRleHQsIG9yIGEgbm90aWNlIHJvdydzIG9uZSBjZWxsIHNwYW5uaW5nIGV2ZXJ5XG4vLyBjb2x1bW4uXG50eXBlIFBkZlRhYmxlQ2VsbCA9IHN0cmluZyB8IHsgY29udGVudDogc3RyaW5nOyBjb2xTcGFuOiBudW1iZXI7IHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuLy8gVGhlIHJvd3Mgb2YgYSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgY2FycmllZCBvbnRvIGNvbnRpbnVhdGlvblxuLy8gcGFnZXMgYWZ0ZXIgaXRzIHJlcG9ydCBwYWdlLiB4IGFuZCB3IGFyZSB0aGUgYm94J3MsIGluIHBvaW50cywgYW5kIHRoZVxuLy8gY29sdW1uIHdpZHRocyBhbmQgYWxpZ25tZW50cyBhcmUgdGhlIG9uZXMgdGhlIG9uLXBhZ2UgdGFibGUgd2FzIGRyYXduIHdpdGgsXG4vLyBzbyB0aGUgdGFibGUgcmVhZHMgYXMgb25lIGFjcm9zcyBwYWdlcy5cbmludGVyZmFjZSBQZGZUYWJsZU92ZXJmbG93IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIFRoZSB0ZXh0IHRoZSBsaXN0IHdhcyBzZWFyY2hlZCBieSwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgaGVhZDogc3RyaW5nW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgcm93czogc3RyaW5nW11bXTtcbiAgb21pdHRlZDogbnVtYmVyO1xuICAvLyBUaGUgbGlzdCdzIHRvdGFscyByb3csIHdoaWNoIGNsb3NlcyB0aGUgbGFzdCBjb250aW51YXRpb24gcGFnZS5cbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICB4OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG59XG5cbi8vIEJ1aWxkcyB0aGUgUERGIGNsaWVudC1zaWRlIHdpdGgganNwZGYuIFRoZSByZXBvcnQncyB1bml0IGlzIGluY2hlcyBhbmQgUERGc1xuLy8gYXJlIHBvaW50cyBhdCBleGFjdGx5IDcyL2luY2gsIHNvIGVhY2ggcmVwb3J0IHBhZ2UgYmVjb21lcyBvbmUgUERGIHBhZ2Ugb2Zcbi8vIHRoZSBleGFjdCBwaHlzaWNhbCBzaXplIGFuZCBjb21wb25lbnRzIGxhbmQgYXQgdGhlaXIgcHJlY2lzZSBwb3NpdGlvbnMuXG4vLyBDaGFydHMgYXJlIHJlbmRlcmVkIHRocm91Z2ggYW4gb2Zmc2NyZWVuIEVDaGFydHMgaW5zdGFuY2UgYXQgM8OXIHBpeGVsXG4vLyByYXRpbyDigJQgcGl4ZWwtaWRlbnRpY2FsIHRvIHRoZSBzY3JlZW4sIGNyaXNwIGF0IHByaW50IHNpemUg4oCUIGFuZCB0YWJsZXMgYXJlXG4vLyBkcmF3biB3aXRoIGpzcGRmLWF1dG90YWJsZS4gQm90aCBsaWJyYXJpZXMgbG9hZCBsYXppbHkgaW50byB0aGVpciBvd24gY2h1bmtzLlxuLy9cbi8vIEEgbGlzdCB0YWJsZSBpcyBmaXR0ZWQgdG8gaXRzIGJveCBieSBsYXlpbmcgaXQgb3V0IGZpcnN0LCBuZXZlciBieSBhXG4vLyByb3ctaGVpZ2h0IGVzdGltYXRlLCBzbyBpdCBjYW5ub3Qgc3BpbGwgcGFzdCB0aGUgYm94LiBUaGUgcm93cyB0aGF0IGRvIG5vdFxuLy8gZml0IGNvbnRpbnVlIG9uIHBhZ2VzIG9mIHRoZWlyIG93biBhZnRlciB0aGUgcmVwb3J0IHBhZ2UsIHVuZGVyIHRoZSBzYW1lXG4vLyBoZWFkZXIvZm9vdGVyIGFuZCB3aXRoIHRoZSBzYW1lIGNvbHVtbiB3aWR0aHMsIHVwIHRvIFBERl9MSVNUX1JPV1M7IGFcbi8vIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIHJvdyBwb2ludGluZyB0byB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgYXV0b1RhYmxlID0gKGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJykpLmRlZmF1bHQ7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBmb3JtYXRDb250ZXh0OiBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dCxcbiAgICAgIHBhZ2VXLFxuICAgICAgcGFnZUgsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLy8gT25lIHJlcG9ydCBwYWdlOiB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZmlyc3QsIHVuZGVyIHRoZSBwYWdlJ3Mgb3duXG4gIC8vIGNvbXBvbmVudHMuIEEgbGlzdCB0aGF0IG91dGdyb3dzIGl0cyBib3ggbGVhdmVzIGl0cyByZW1haW5pbmcgcm93cyBpblxuICAvLyBvdmVyZmxvd3MuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlclBhZ2UoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb2xsZWN0ZWRQYWdlOiBDb2xsZWN0ZWRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX3Rva2VucyhyZXBvcnQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIpO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLl9yZW5kZXJUZXh0KGRvYywgaXRlbS5jb21wb25lbnQsIHRva2Vucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgb3ZlcmZsb3dzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29udGV4dC5yZXBvcnQubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgICB0aGlzLl9yZW5kZXJUZXh0KGNvbnRleHQuZG9jLCBjb21wb25lbnQsIHRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIGVhY2hcbiAgLy8gcGFyYWdyYXBoJ3MgcnVucyBhcmUgYnJva2VuIGludG8gd29yZHMsIHdyYXBwZWQgdG8gdGhlIGJsb2NrJ3Mgd2lkdGggYW5kXG4gIC8vIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd24gZm9udCwgc2l6ZSBhbmQgY29sb3IuIExpbmVzIHBhc3QgdGhlXG4gIC8vIGJsb2NrJ3MgaGVpZ2h0IGFyZSBkcm9wcGVkIOKAlCB0aGUgY2FudmFzIGNsaXBzIHRoZSBibG9jayB0aGVyZSB0b28uXG4gIHByaXZhdGUgX3JlbmRlclRleHQoZG9jOiBhbnksIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIGNvbnN0IGxlZnQgPSBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCk7XG4gICAgY29uc3QgdG9wID0gY29tcG9uZW50LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCk7XG4gICAgY29uc3Qgd2lkdGggPSBjb21wb25lbnQudyAqIFBUIC0gaW5zZXQocGFkZGluZz8ubGVmdCkgLSBpbnNldChwYWRkaW5nPy5yaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gKGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pO1xuXG4gICAgbGV0IGN1cnNvclkgPSB0b3A7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgdGV4dFBhcmFncmFwaHMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKSkge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBsaW5lSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICAgIGlmIChjdXJzb3JZICsgbGluZUhlaWdodCA+IGJvdHRvbSArIDAuNSkge1xuICAgICAgICAgIGN1cnNvclkgPSBJbmZpbml0eTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gY3Vyc29yWSArIHNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgICAgICBsZXQgeCA9IGxlZnQgKyBpbmRlbnQgKyB0aGlzLl9hbGlnbk9mZnNldChwYXJhZ3JhcGguYWxpZ24sIHdpZHRoIC0gaW5kZW50LCBsaW5lV2lkdGgpO1xuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgbGVmdCwgYmFzZWxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgICAgICB4ICs9IHdvcmQud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3JZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnNvclkgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yWSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQnJlYWsgYSBwYXJhZ3JhcGgncyBydW5zIGludG8gbGluZXMgb2YgbWVhc3VyZWQgd29yZHMgdGhhdCBmaXQgdGhlIHdpZHRoLlxuICAvLyBBIHdvcmQga2VlcHMgaXRzIHRyYWlsaW5nIHNwYWNlIHNvIHNwYWNpbmcgc3Vydml2ZXMgcnVuIGJvdW5kYXJpZXMuXG4gIHByaXZhdGUgX3dyYXAoZG9jOiBhbnksIHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgd2lkdGg6IG51bWJlcik6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSB7XG4gICAgY29uc3QgbGluZXM6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IGxpbmVXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHJ1biBvZiBwYXJhZ3JhcGgucnVucykge1xuICAgICAgY29uc3Qgc2l6ZSA9IHJ1bi5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRTtcbiAgICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHNpemUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHQgb2YgcnVuLnRleHQubWF0Y2goL1xcUytcXHMqfFxccysvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0sIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCBhIHRleHQgYmxvY2sncyB0b2tlbnMgZmlsbCB3aXRoIG9uIHRoaXMgcGFnZS4gVGhlIG51bWJlciBpcyB0aGVcbiAgLy8gcGh5c2ljYWwgcGFnZSBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMsIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCDigJQgdGhlXG4gIC8vIHRpdGxlIHBhZ2UgaXMgbm90IGEgcmVwb3J0IHBhZ2UuIFRoZSBuYW1lIHN0YXlzIHRoZSByZXBvcnQgcGFnZSdzLCBzbyBhXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlIGlzIG5hbWVkIGZvciB0aGUgcGFnZSBpdHMgdGFibGUgc3RhcnRlZCBvbi5cbiAgcHJpdmF0ZSBfdG9rZW5zKHJlcG9ydDogUmVwb3J0LCBwYWdlOiBSZXBvcnRQYWdlLCBpbmRleDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcixcbiAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHJlcG9ydE5hbWU6IHJlcG9ydC5uYW1lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGlzIHN0b3JlZCBpbiBpbmNoZXM7IHRoZSBQREYgZHJhd3MgaW4gcG9pbnRzLlxuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIGl0ZW0uc2VhcmNoKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCAhaXRlbS5kYXRhLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFibGUoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlILCBvdmVyZmxvd3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2twaSc6XG4gICAgICAgIHRoaXMuX3JlbmRlcktwaShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgbGluZSBvZiBzbWFsbCBncmV5IHByaW50LCBjdXQgdG8gdGhlIHdpZHRoIHdpdGggYW4gZWxsaXBzaXM6IGFcbiAgLy8gc3VidGl0bGUsIGEgbm90ZSBvciBhIGxpbmUgb2YgYSBLUEkgY2FyZC4geSBpcyB0aGUgbGluZSdzIHRvcDsgdGhlIGxpbmUgaXNcbiAgLy8gTk9URV9MSU5FX0ggdGFsbC5cbiAgcHJpdmF0ZSBfc21hbGxMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLFxuICAgIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyxcbiAgICBzdHlsZTogJ25vcm1hbCcgfCAnaXRhbGljJyxcbiAgKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoU01BTExfU0laRSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGV4dCwgdyksIGFsaWduID09PSAnY2VudGVyJyA/IHggKyB3IC8gMiA6IHgsIHkgKyBTTUFMTF9TSVpFLCB7IGFsaWduIH0pO1xuICB9XG5cbiAgLy8gVGhlIHRleHQsIGVsbGlwc2l6ZWQgdG8gdGhlIHdpZHRoIGluIHRoZSBkb2MncyBjdXJyZW50IGZvbnQuXG4gIHByaXZhdGUgX2ZpdChkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jLmdldFRleHRXaWR0aCh0ZXh0KSA8PSB3aWR0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGN1dCA9IHRleHQ7XG4gICAgd2hpbGUgKGN1dC5sZW5ndGggPiAxICYmIGRvYy5nZXRUZXh0V2lkdGgoYCR7Y3V0feKApmApID4gd2lkdGgpIHtcbiAgICAgIGN1dCA9IGN1dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2N1dC50cmltRW5kKCl94oCmYDtcbiAgfVxuXG4gIC8vIFRoZSBib2xkIHN0cmlwIG92ZXIgYSBjb21wb25lbnQsIGFuZCBvdmVyIGVhY2ggb2YgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgcHJpdmF0ZSBfY29tcG9uZW50VGl0bGUoZG9jOiBhbnksIHRpdGxlOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHRpdGxlLCB4LCB5ICsgMTAsIHsgbWF4V2lkdGg6IHcgfSk7XG4gIH1cblxuICAvLyBBbiBpdGFsaWMgZ3JleSBsaW5lIGNlbnRlcmVkIGluIGEgY29tcG9uZW50J3MgYm9keSwgZm9yIGEgYm9keSB0aGF0IGhvbGRzXG4gIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuIGl0cyBjb250ZW50LlxuICBwcml2YXRlIF9ib3hOb3RlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnaXRhbGljJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM3Yjg3OTQnKTtcbiAgICBkb2MudGV4dCh0ZXh0LCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gIH1cblxuICAvLyBBIGxpc3QncyBvbi1wYWdlIHRhYmxlLiBBbGwgb2YgaXRzIGZldGNoZWQgcm93cyBhcmUgbGFpZCBvdXQgb25jZSB0byBsZWFyblxuICAvLyBob3cgbWFueSB0aGUgYm94IGhvbGRzOyB3aGVuIHRoZXkgZG8gbm90IGFsbCBmaXQsIHRoZSBib3gncyBsYXN0IHJvdyBzYXlzXG4gIC8vIHRoZSB0YWJsZSBjb250aW51ZXMgYW5kIHRoZSByZXN0IGdvIHRvIG92ZXJmbG93cyBmb3IgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGJveCB0b28gc2hvcnQgZm9yIGV2ZW4gdGhlIGhlYWQgY2FycmllcyB0aGUgbm90aWNlIGFzIGEgbGluZSBpbnN0ZWFkLlxuICAvLyBBIHRvdGFscyByb3cgY2xvc2VzIHRoZSB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsXG4gIC8vIGVsc2UgYWZ0ZXIgdGhlIGxhc3QgY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9ID0gaXRlbTtcbiAgICBjb25zdCBkYXRhID0gaXRlbS5kYXRhIGFzIENvbXBvbmVudERhdGE7XG4gICAgY29uc3QgaGVhZCA9IGxpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpXG4gICAgICAubWFwKChoZWFkaW5nKSA9PiB0aGlzLl9wZGZUZXh0KGhlYWRpbmcpKTtcbiAgICBjb25zdCB7IGNlbGxzLCBudW1lcmljLCBmb290IH0gPSB0aGlzLl90YWJsZUNlbGxzKGNvbnRleHQsIGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBub3RpY2UgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBsYXN0IHJvdyB0aGF0IGZpdCwgc28gdGhhdCByb3cgbW92ZXNcbiAgICAvLyB0byB0aGUgY29udGludWF0aW9uLiBvbWl0dGVkID4gMCBtZWFucyBhIGZ1bGwgUERGX0xJU1RfUk9XUyBmZXRjaCwgd2hpY2hcbiAgICAvLyBuZXZlciBmaXRzIG9uZSBib3gsIHNvIHRoZSBDU1Ygbm90aWNlIGFsd2F5cyBsYW5kcyBvbiBhIGNvbnRpbnVhdGlvblxuICAgIC8vIHBhZ2UuXG4gICAgY29uc3Qga2VwdCA9IE1hdGgubWF4KDAsIGZpdCAtIDEpO1xuICAgIG92ZXJmbG93cy5wdXNoKHsgY29tcG9uZW50LCBzZWFyY2gsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgYm9keTogUGRmVGFibGVDZWxsW11bXSxcbiAgICB4OiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICAgIGNvbHVtblN0eWxlcz86IFBkZkNvbHVtblN0eWxlcyxcbiAgICBmb290Pzogc3RyaW5nW10gfCBudWxsLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkOiBbaGVhZF0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczogeyBmb250OiAnaGVsdmV0aWNhJywgZm9udFN0eWxlOiAnbm9ybWFsJywgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiAnIzdiODc5NCcsXG4gICAgICAgIGhhbGlnbjogJ2xlZnQnLFxuICAgICAgICAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSksXG4gICAgICB9LFxuICAgIH1dO1xuICB9XG5cbiAgLy8gTGF5cyBldmVyeSBmZXRjaGVkIHJvdyBvdXQgb25jZSBvbiBhIHNjcmF0Y2ggZG9jdW1lbnQgb2YgdGhlIHNhbWUgcGFnZVxuICAvLyBzaXplLCB3aXRoIHRoZSBvcHRpb25zIHRoZSByZWFsIGRyYXcgdXNlcywgYW5kIHJlYWRzIGJhY2sgaG93IG1hbnkgYm9keVxuICAvLyByb3dzIHRoZSBib3gncyBwYWdlIGhvbGRzIChmaXQpIGFuZCB0aGUgY29sdW1uIHdpZHRocyBhdXRvVGFibGUgY2hvc2UsXG4gIC8vIHdpdGggZWFjaCBudW1lcmljIGNvbHVtbidzIHJpZ2h0IGFsaWdubWVudCBtZXJnZWQgaW4sIHNvIHRoZSBvbi1wYWdlXG4gIC8vIHRhYmxlIGFuZCBpdHMgY29udGludWF0aW9uIHBhZ2VzIGNhcnJ5IGJvdGguIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0XG4gIC8vIHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LCBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZVxuICAvLyB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lXG4gIC8vIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQgKG9yIHRoZSBoZWFkIGl0c2VsZiBkaWQgbm90IGZpdCk6IGF1dG9UYWJsZVxuICAvLyBtb3ZlZCB0byBhIG5ldyBwYWdlIGJlZm9yZSBkcmF3aW5nLiBUaGUgcmVhbCBkb2N1bWVudCBpcyB1bnRvdWNoZWQuXG4gIHByaXZhdGUgX21lYXN1cmUoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBjZWxsczogc3RyaW5nW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgZm9vdDogc3RyaW5nW10gfCBudWxsLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiB7IGZpdDogbnVtYmVyOyBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyB9IHtcbiAgICBjb25zdCBzY3JhdGNoID0gbmV3IGNvbnRleHQuanNQREYoe1xuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLFxuICAgICAgb3JpZW50YXRpb246IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgfSk7XG4gICAgbGV0IGZpdCA9IDA7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShzY3JhdGNoLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgdW5kZWZpbmVkLCBmb290KSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmIChob29rLnNlY3Rpb24gPT09ICdib2R5JyAmJiBzY3JhdGNoLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgPT09IDEpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IHdpZHRoOiBudW1iZXIgfVtdID0gc2NyYXRjaC5sYXN0QXV0b1RhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSBudW1lcmljW2luZGV4XVxuICAgICAgICA/IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGgsIGhhbGlnbjogJ3JpZ2h0JyB9XG4gICAgICAgIDogeyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQSByb3cgdGFsbGVyIHRoYW4gYSB3aG9sZSBwYWdlIGlzIHNwbGl0IHJhdGhlciB0aGFuIG1vdmVkLCBzbyBhIGxhc3RcbiAgICAvLyByb3cgdGhhdCBzdGFydGVkIG9uIHRoZSBmaXJzdCBwYWdlIGNhbiBzdGlsbCBoYXZlIHJ1biBwYXN0IGl0LlxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBzY3JhdGNoLmdldE51bWJlck9mUGFnZXMoKSA+IDEpIHtcbiAgICAgIGZpdCAtPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB7IGZpdCwgY29sdW1uU3R5bGVzIH07XG4gIH1cblxuICAvLyBEcmF3cyBhbiBvbi1wYWdlIHRhYmxlLCB0aGVuIHJlbW92ZXMgYW55IHBhZ2UgdGhlIGRyYXcgYWRkZWQuIFRoYXQgc2hvdWxkXG4gIC8vIG5ldmVyIGhhcHBlbjogdGhlIG1lYXN1cmVkIGZpdCwgdGhlIGlkZW50aWNhbCBjb2x1bW4gd2lkdGhzIGFuZCBhXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBrZWVwIHRoZSB0YWJsZSBpbnNpZGUgaXRzIGJveC4gVGhlIGNoZWNrIGV4aXN0cyBzbyBhXG4gIC8vIHN0cmF5IHBhZ2UgY2FuIG5ldmVyIGNhdGNoIHRoZSByZXBvcnQgcGFnZSdzIHJlbWFpbmluZyBjb21wb25lbnRzLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCBvcHRpb25zKTtcblxuICAgIHdoaWxlIChkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpID4gcGFnZXMpIHtcbiAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGRvYy5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb2Ygb25lIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBvbiBwYWdlcyBhcHBlbmRlZCBhZnRlclxuICAvLyB0aGUgcmVwb3J0IHBhZ2UsIGVhY2ggd2l0aCB0aGUgcGFnZSdzIGhlYWRlciBhbmQgZm9vdGVyLCB0aGUgdGFibGUnc1xuICAvLyB0aXRsZSBhbmQgaXRzIGhlYWQgYWdhaW4uIFRoZSB0YWJsZSBzaXRzIENPTlRJTlVBVElPTl9HQVAgaW5zaWRlIHRoZVxuICAvLyBiYW5kcy4gUmV0dXJucyB0aGUgcGh5c2ljYWwgcGFnZSBjb3VudGVyIGFmdGVyIHRoZXNlIHBhZ2VzLlxuICBwcml2YXRlIF9yZW5kZXJDb250aW51YXRpb24oXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93OiBQZGZUYWJsZU92ZXJmbG93LFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHsgZG9jLCByZXBvcnQgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IE5PX0JBTkRTO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5oZWFkZXJIZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5mb290ZXJIZWlnaHQpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93LmhlYWQubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgbGV0IGNvdW50ZXIgPSBwYWdlTnVtYmVyO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhcbiAgICAgICAgY29udGV4dCwgb3ZlcmZsb3cuaGVhZCwgb3ZlcmZsb3cubnVtZXJpYywgYm9keSwgeCwgdG9wICsgVElUTEVfSCwgdywgYm90dG9tLCBvdmVyZmxvdy5jb2x1bW5TdHlsZXMsXG4gICAgICAgIG92ZXJmbG93LmZvb3QsXG4gICAgICApLFxuICAgICAgbWFyZ2luOiB7IHRvcDogdG9wICsgVElUTEVfSCwgYm90dG9tLCBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3IH0sXG4gICAgICBzaG93SGVhZDogJ2V2ZXJ5UGFnZScsXG4gICAgICAvLyBGaXJlcyBvbiBldmVyeSBwYWdlIHRoZSB0YWJsZSBkcmF3cyBvbiwgdGhlIGZpcnN0IGluY2x1ZGVkLlxuICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgIGNvdW50ZXIgKz0gMTtcbiAgICAgICAgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIHBhZ2UsIHRoaXMuX3Rva2VucyhyZXBvcnQsIHBhZ2UsIGluZGV4LCBjb3VudGVyKSk7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGhpcy5fY29udGludWVkVGl0bGUob3ZlcmZsb3cuY29tcG9uZW50LCBvdmVyZmxvdy5zZWFyY2gpLCB4LCB0b3AsIHcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG5cbiAgLy8gVGhlIG1hcmdpbiBhIGNvbnRpbnVhdGlvbiB0YWJsZSBrZWVwcyBmcm9tIG9uZSBlZGdlOiBpbnNpZGUgdGhlIGJhbmQgd2hlblxuICAvLyB0aGUgcGFnZSBoYXMgb25lLlxuICBwcml2YXRlIF9jb250aW51YXRpb25NYXJnaW4oYmFuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYmFuZCA/IGJhbmQgKiBQVCArIENPTlRJTlVBVElPTl9HQVAgOiBOT19CQU5EX01BUkdJTjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRpbnVlZFRpdGxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzZWFyY2g/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCBzZWFyY2gpO1xuXG4gICAgcmV0dXJuIHRpdGxlID8gYCR7dGl0bGV9IChjb250aW51ZWQpYCA6ICdDb250aW51ZWQnO1xuICB9XG5cbiAgLy8gQSBLUEkgdGlsZTogdGhlIGNhcmQgdGhlIHNjcmVlbiBkcmF3cyAoa3BpLWNhcmQudHMgZGVjaWRlcyBldmVyeSBsaW5lKSxcbiAgLy8gc3RhY2tlZCBhbmQgY2VudGVyZWQgaW4gdGhlIGJvZHkuIEEgY2FyZCB3aXRoIG9ubHkgaXRzIHZhbHVlIGFuZCBsYWJlbFxuICAvLyBrZWVwcyB0aGUgdGlsZSdzIGxvbmctc3RhbmRpbmcgbGF5b3V0LlxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjb25maWcgPSBpdGVtLmNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHZpZXcgPSBrcGlDYXJkVmlldyhjb25maWcsIGl0ZW0uZGF0YSwgeyBmb3JtYXQ6IGNvbnRleHQuZm9ybWF0Q29udGV4dCwgdGltZXpvbmU6IGNvbnRleHQudGltZXpvbmUgfSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZGZUZXh0KHZpZXcudmFsdWUpO1xuICAgIGNvbnN0IG5vdGVzID0gZXhwb3J0Tm90ZUxpbmVzKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUpO1xuXG4gICAgaWYgKCFrcGlDYXJkSGFzRXh0cmFzKHZpZXcsIG5vdGVzKSkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoMjYpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICAgIGRvYy50ZXh0KHZpZXcubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBrcGlFeHBvcnRQYXJ0cyh2aWV3LCBub3RlcywgaCwgS1BJX0hFSUdIVFMpO1xuICAgIGxldCB0b3AgPSB5ICsgTWF0aC5tYXgoMCwgKGggLSBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIEtQSV9IRUlHSFRTKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHRvcCArIEtQSV9WQUxVRV9CQVNFTElORSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgdG9wICs9IEtQSV9IRUlHSFRTLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgIGRvYy50ZXh0KHRoaXMuX2ZpdChkb2MsIHRoaXMuX3BkZlRleHQodmlldy5sYWJlbCksIHcpLCB4ICsgdyAvIDIsIHRvcCArIDksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgdG9wICs9IEtQSV9IRUlHSFRTLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnKTtcbiAgICAgIHRvcCArPSBLUElfSEVJR0hUUy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5zcGFya2xpbmUgJiYgdmlldy5zcGFya2xpbmUpIHtcbiAgICAgIHRoaXMuX2twaVNwYXJrbGluZShkb2MsIHZpZXcuc3BhcmtsaW5lLnZhbHVlcywgdmlldy5zcGFya2xpbmUucGFydGlhbCwgeCwgdG9wLCB3KTtcbiAgICAgIHRvcCArPSBLUElfSEVJR0hUUy5zcGFya2xpbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHBhcnRzLm5vdGVzKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnaXRhbGljJyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1tkZWx0YS50b25lXX1gO1xuICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuX3BkZlRleHQoZGVsdGEudGV4dCk7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBLUElfQVJST1cgKyBLUElfQVJST1dfR0FQO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKEtQSV9ERUxUQV9TSVpFKTtcbiAgICBjb25zdCBjaGFuZ2VXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoY2hhbmdlKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgY29uc3QgY29tcGFyZWQgPSBkZWx0YS5jb21wYXJlZFxuICAgICAgPyB0aGlzLl9maXQoZG9jLCBgICR7dGhpcy5fcGRmVGV4dChkZWx0YS5jb21wYXJlZCl9YCwgTWF0aC5tYXgoMCwgdyAtIGFycm93IC0gY2hhbmdlV2lkdGgpKVxuICAgICAgOiAnJztcbiAgICBjb25zdCB3aWR0aCA9IGFycm93ICsgY2hhbmdlV2lkdGggKyAoY29tcGFyZWQgPyBkb2MuZ2V0VGV4dFdpZHRoKGNvbXBhcmVkKSA6IDApO1xuICAgIGNvbnN0IGJhc2VsaW5lID0gdG9wICsgS1BJX0RFTFRBX1NJWkU7XG4gICAgbGV0IGxlZnQgPSB4ICsgTWF0aC5tYXgoMCwgKHcgLSB3aWR0aCkgLyAyKTtcblxuICAgIGlmIChhcnJvdykge1xuICAgICAgY29uc3QgdXAgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuVXA7XG4gICAgICBjb25zdCB0aXAgPSB1cCA/IGJhc2VsaW5lIC0gS1BJX0FSUk9XIDogYmFzZWxpbmU7XG4gICAgICBjb25zdCBiYXNlID0gdXAgPyBiYXNlbGluZSA6IGJhc2VsaW5lIC0gS1BJX0FSUk9XO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgS1BJX0FSUk9XLCBiYXNlLCBsZWZ0ICsgS1BJX0FSUk9XIC8gMiwgdGlwLCAnRicpO1xuICAgICAgbGVmdCArPSBhcnJvdztcbiAgICB9XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yKTtcbiAgICBkb2MudGV4dChjaGFuZ2UsIGxlZnQsIGJhc2VsaW5lKTtcblxuICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQoY29tcGFyZWQsIGxlZnQgKyBjaGFuZ2VXaWR0aCwgYmFzZWxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgbGluZSAoJ0dvYWw6ICQxLDAwMCDCtyA1NiUgb2YgdGFyZ2V0JykgYW5kLCB3aGVuIHRoZSBzZXJ2ZXIgc2VudFxuICAvLyB0aGUgcHJvZ3Jlc3MsIGEgYmFyIGZpbGxlZCB0aGF0IGZhcjogZ3JlZW4gb25jZSB0aGUgdGFyZ2V0IGlzIG1ldC5cbiAgcHJpdmF0ZSBfa3BpVGFyZ2V0KGRvYzogYW55LCB0YXJnZXQ6IEtwaUNhcmRUYXJnZXQsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSB0YXJnZXQucHJvZ3Jlc3MgPyBgJHt0YXJnZXQudGV4dH0gwrcgJHt0YXJnZXQucHJvZ3Jlc3N9YCA6IHRhcmdldC50ZXh0O1xuXG4gICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh0ZXh0KSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ25vcm1hbCcpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVyA9IE1hdGgubWluKHcgKiAwLjYsIEtQSV9CQVJfVyk7XG4gICAgY29uc3QgYmFyWCA9IHggKyAodyAtIGJhclcpIC8gMjtcbiAgICBjb25zdCBiYXJZID0gdG9wICsgTk9URV9MSU5FX0ggKyAxO1xuXG4gICAgZG9jLnNldEZpbGxDb2xvcihLUElfVFJBQ0tfQ09MT1IpO1xuICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcsIEtQSV9CQVJfSCwgJ0YnKTtcblxuICAgIGlmICh0YXJnZXQuZmlsbCA+IDApIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1t0YXJnZXQudG9uZV19YCk7XG4gICAgICBkb2MucmVjdChiYXJYLCBiYXJZLCBiYXJXICogdGFyZ2V0LmZpbGwsIEtQSV9CQVJfSCwgJ0YnKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgc3BhcmtsaW5lIGluIGEgYm94IHVuZGVyIHRoZSBjYXJkJ3MgbGluZXMsIGFzIHRoZSBzY3JlZW4gZHJhd3MgaXRcbiAgLy8gKGtwaVNwYXJrbGluZUdlb21ldHJ5LCBhIDAtMTAwIGJveCk6IGEgdmVjdG9yIGxpbmUgcGVyIHJ1biBvZiB2YWx1ZXMsIGFcbiAgLy8gZG90IGZvciBhIGxvbmUgdmFsdWUsIGFuZCB0aGUgbGFzdCBwb2ludCdzIG1hcmtlciwgaG9sbG93IHdoaWxlIGl0cyBwZXJpb2RcbiAgLy8gaXMgcGFydGlhbC5cbiAgcHJpdmF0ZSBfa3BpU3BhcmtsaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHZhbHVlczogKG51bWJlciB8IG51bGwpW10sXG4gICAgcGFydGlhbDogYm9vbGVhbixcbiAgICB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0ga3BpU3BhcmtsaW5lR2VvbWV0cnkodmFsdWVzLCBwYXJ0aWFsKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5taW4odyAqIDAuNywgS1BJX1NQQVJLTElORV9XKTtcbiAgICBjb25zdCBib3hIID0gS1BJX0hFSUdIVFMuc3BhcmtsaW5lIC0gMiAqIEtQSV9TUEFSS0xJTkVfSU5TRVQ7XG4gICAgY29uc3QgbGVmdCA9IHggKyAodyAtIGJveFcpIC8gMjtcbiAgICBjb25zdCBhdCA9IChwb2ludDogS3BpU3BhcmtsaW5lUG9pbnQpID0+ICh7XG4gICAgICB4OiBsZWZ0ICsgcG9pbnQueCAqIGJveFcgLyAxMDAsXG4gICAgICB5OiB0b3AgKyBLUElfU1BBUktMSU5FX0lOU0VUICsgcG9pbnQueSAqIGJveEggLyAxMDAsXG4gICAgfSk7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1J9YDtcblxuICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRMaW5lV2lkdGgoMSk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2VvbWV0cnkubGluZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGxpbmUuc3BsaXQoJyAnKS5tYXAoKHBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgW3B4LCBweV0gPSBwYWlyLnNwbGl0KCcsJykubWFwKE51bWJlcik7XG5cbiAgICAgICAgcmV0dXJuIGF0KHsgeDogcHgsIHk6IHB5IH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGVwcyA9IHBvaW50cy5zbGljZSgxKS5tYXAoKHBvaW50LCBpbmRleCkgPT4gW3BvaW50LnggLSBwb2ludHNbaW5kZXhdLngsIHBvaW50LnkgLSBwb2ludHNbaW5kZXhdLnldKTtcblxuICAgICAgZG9jLmxpbmVzKHN0ZXBzLCBwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnksIFsxLCAxXSwgJ1MnLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkb3Qgb2YgZ2VvbWV0cnkuZG90cykge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChkb3QpO1xuICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5Lmxhc3QpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gYXQoZ2VvbWV0cnkubGFzdCk7XG5cbiAgICAgIGlmIChnZW9tZXRyeS5sYXN0LmhvbGxvdykge1xuICAgICAgICBkb2Muc2V0RmlsbENvbG9yKCcjZmZmZmZmJyk7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRkQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgZm9ybWF0dGVkIHZhbHVlIGFzIGpzUERGIGNhbiBkcmF3IGl0LiBJdHMgc3RhbmRhcmQgZm9udHMgd3JpdGUgdGV4dCBpblxuICAvLyBXaW5BbnNpLCB3aGljaCBoYXMgdGhlIG5vLWJyZWFrIHNwYWNlIChVKzAwQTAsIGZyLUNBJ3MgZGlnaXQgZ3JvdXBpbmcpIGJ1dFxuICAvLyBub3QgdGhlIG5hcnJvdyBvbmUgKFUrMjAyRiwgd2hpY2ggb3RoZXIgbG9jYWxlcyBncm91cCBhbmQgc3BhY2Ugd2l0aCksIHRoZVxuICAvLyB0aGluIGFuZCBoYWlyIHNwYWNlcyAoVSsyMDA5LCBVKzIwMEEsIHdoaWNoIEludGwgcHV0cyBhcm91bmQgYSBkYXRlXG4gIC8vIHJhbmdlJ3MgZGFzaDogJ1NlcCAxIOKAkyAzMCwgMjAyNicpLCB0aGUgbWludXMgc2lnbiAoVSsyMjEyLCBzb21lIGxvY2FsZXMnXG4gIC8vIG5lZ2F0aXZlIHNpZ24pIG9yIGEgcmFuayBjaGFuZ2UncyB0cmlhbmdsZXM6IGVhY2ggd291bGQgcHJpbnQgYXMgc3RyYXlcbiAgLy8gZ2x5cGhzLiBUaGUgbmFycm93IHNwYWNlIGJlY29tZXMgYSBuby1icmVhayBzcGFjZSwgc28gYSBudW1iZXIgc3RpbGwgbmV2ZXJcbiAgLy8gd3JhcHMgYWNyb3NzIGEgbGluZTsgdGhlIHRoaW4gYW5kIGhhaXIgc3BhY2VzIGEgcGxhaW4gc3BhY2U7IHRoZSBtaW51c1xuICAvLyBzaWduIGEgaHlwaGVuOyBhbmQgYSByYW5rJ3MgcmlzZSBhIHBsdXMgc2lnbiBhbmQgaXRzIGZhbGwgYSBoeXBoZW5cbiAgLy8gKCfilrIgMicgcmVhZHMgJysyJykuXG4gIHByaXZhdGUgX3BkZlRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcdTIwMkYvZywgJ1xcdTAwQTAnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUyMDA5XFx1MjAwQV0vZywgJyAnKVxuICAgICAgLnJlcGxhY2UoL1xcdTIyMTIvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QjJcXHM/L2csICcrJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyNUJDXFxzPy9nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpIHx8ICdyZXBvcnQnO1xuICB9XG59XG4iXX0=
|