@firestitch/report 18.8.1 → 18.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-text/component-text.component.d.ts +47 -2
- package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +34 -9
- package/app/reports/components/report-component/report-component.component.d.ts +10 -1
- package/app/reports/data/report.data.d.ts +2 -1
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +8 -0
- package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
- package/app/reports/export/report-export-collector.service.d.ts +22 -0
- package/app/reports/export/report-export.service.d.ts +3 -1
- package/app/reports/export/report-pdf.service.d.ts +18 -2
- package/app/reports/export/report-pptx.service.d.ts +15 -2
- package/app/reports/export/report-text-layout.service.d.ts +35 -0
- package/app/reports/format.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +21 -2
- package/app/reports/layout.d.ts +2 -0
- package/app/reports/services/report-filter-state.service.d.ts +1 -1
- package/app/reports/text.d.ts +50 -0
- package/app/reports/values.d.ts +17 -0
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +260 -34
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +65 -19
- package/esm2022/app/reports/data/report.data.mjs +19 -1
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +134 -23
- package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +147 -43
- package/esm2022/app/reports/export/report-export.service.mjs +57 -19
- package/esm2022/app/reports/export/report-pdf.service.mjs +304 -65
- package/esm2022/app/reports/export/report-pptx.service.mjs +276 -58
- package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
- package/esm2022/app/reports/format.mjs +12 -9
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/layout.mjs +11 -1
- package/esm2022/app/reports/services/report-filter-state.service.mjs +19 -10
- package/esm2022/app/reports/text.mjs +293 -85
- package/esm2022/app/reports/values.mjs +183 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +4 -1
- package/esm2022/app/reports/views/report/report.component.mjs +4 -1
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-DBMOHmBF.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-DBMOHmBF.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-CqbXT1gh.mjs} +3270 -947
- package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.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-CSylkyko.mjs.map +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ReportValueFormula } from './enums/report-value-formula.enum';
|
|
2
|
+
import { formatOutputValue } from './format';
|
|
3
|
+
import { VALUE_EMPTY_TEXT, VALUE_TOKEN_PATTERN } from './text';
|
|
4
|
+
// Live values inside text blocks: which values a page's text shows, and what
|
|
5
|
+
// each token reads as. A value belongs to a page (the master for a header or
|
|
6
|
+
// footer) and is listed in its `values`, never in its components. Pure, so the
|
|
7
|
+
// canvas and both exports fill a block's tokens the same way.
|
|
8
|
+
// No value keys: what a text block is told other blocks show when nothing
|
|
9
|
+
// says otherwise. Shared, and typed read-only so no caller fills it.
|
|
10
|
+
export const NO_VALUE_KEYS = Object.freeze(new Set());
|
|
11
|
+
// The keys an html's {{value.<key>}} tokens name: lowercased, each once, in
|
|
12
|
+
// the order they first appear.
|
|
13
|
+
export function valueKeys(html) {
|
|
14
|
+
const keys = Array.from((html ?? '').matchAll(VALUE_TOKEN_PATTERN), (match) => match[1].toLowerCase());
|
|
15
|
+
return [...new Set(keys)];
|
|
16
|
+
}
|
|
17
|
+
// The key a value's tokens name, as they are compared: lowercase.
|
|
18
|
+
export function valueKey(component) {
|
|
19
|
+
return String(component.config?.key ?? '').toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
// The keys a formula value reads (config.formula.of), as they are compared:
|
|
22
|
+
// lowercase. None for a query value.
|
|
23
|
+
export function operandKeys(value) {
|
|
24
|
+
const of = value.config?.formula?.of;
|
|
25
|
+
return Array.isArray(of) ? of.map((key) => String(key).toLowerCase()) : [];
|
|
26
|
+
}
|
|
27
|
+
// The values some text shows, in id order: what the server reads for the
|
|
28
|
+
// page. A key held by two values (a race between two writes) is the newest
|
|
29
|
+
// one's, as server-side.
|
|
30
|
+
export function shownValues(values, texts) {
|
|
31
|
+
const shown = new Set(texts.flatMap((text) => valueKeys(text.config?.html)));
|
|
32
|
+
const ordered = byId(values);
|
|
33
|
+
const newest = new Map(ordered.map((value) => [valueKey(value), value]));
|
|
34
|
+
return ordered.filter((value) => shown.has(valueKey(value)) && newest.get(valueKey(value)) === value);
|
|
35
|
+
}
|
|
36
|
+
// The keys a layer reads when its text shows `shown`: those keys, and the
|
|
37
|
+
// operands of each shown formula, one level deep. It mirrors the server's
|
|
38
|
+
// ReportTextValues::getReadKeys, and is used only for the editor's notice: the
|
|
39
|
+
// server's own read set decides which numbers come back.
|
|
40
|
+
export function readKeys(shown, values) {
|
|
41
|
+
const keys = new Set(shown);
|
|
42
|
+
// Over a copy of the shown keys, so an operand added here is not expanded.
|
|
43
|
+
[...keys].forEach((key) => {
|
|
44
|
+
(values[key]?.reads ?? []).forEach((read) => keys.add(read));
|
|
45
|
+
});
|
|
46
|
+
return keys;
|
|
47
|
+
}
|
|
48
|
+
// What each of a layer's values reads as, by key, for its text's tokens and
|
|
49
|
+
// chips. Every value is listed, shown or not, so a pasted chip keeps its name.
|
|
50
|
+
// A value reads as loading until the layer's numbers have arrived (`results`
|
|
51
|
+
// is null until then) and while a request still on its way asks for it
|
|
52
|
+
// (`loading`, by id): a number on screen is always the current request's. A
|
|
53
|
+
// value with no row, or whose row failed, has no text (the em dash).
|
|
54
|
+
export function textValues(values, results, format, loading = new Set()) {
|
|
55
|
+
const filled = {};
|
|
56
|
+
byId(values).forEach((value) => {
|
|
57
|
+
const key = valueKey(value);
|
|
58
|
+
const name = value.title || key;
|
|
59
|
+
const row = results?.rows.get(value.id);
|
|
60
|
+
const reads = formulaReads(value);
|
|
61
|
+
if (!results || loading.has(value.id)) {
|
|
62
|
+
filled[key] = { name, loading: true, ...reads };
|
|
63
|
+
}
|
|
64
|
+
else if (row && !row.error) {
|
|
65
|
+
filled[key] = { name, text: formatValueText(value, row, values, format), ...reads };
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
filled[key] = { name, ...reads };
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return filled;
|
|
72
|
+
}
|
|
73
|
+
// A value's number as its token reads it, on the canvas and in both exports,
|
|
74
|
+
// through the formatOutputValue KPI cards and list cells use. A query value
|
|
75
|
+
// that shows a comparison output, and a formula, are written by their role: a
|
|
76
|
+
// change or a percent change is signed (unless the formula's `signed` says
|
|
77
|
+
// otherwise), and a change in points carries no ' pp', as the words around
|
|
78
|
+
// the token carry the unit. A change or a sum with no format of its own takes
|
|
79
|
+
// its first operand's, and a ratio reads a percent format as a 0-1 fraction.
|
|
80
|
+
// A row with an error reads as the em dash.
|
|
81
|
+
export function formatValueText(value, row, layerValues, ctx) {
|
|
82
|
+
if (row.error) {
|
|
83
|
+
return VALUE_EMPTY_TEXT;
|
|
84
|
+
}
|
|
85
|
+
const formula = value.config?.formula ?? null;
|
|
86
|
+
const output = row.role || formula
|
|
87
|
+
? {
|
|
88
|
+
measure: valueKey(value),
|
|
89
|
+
kind: 'value',
|
|
90
|
+
role: row.role ?? null,
|
|
91
|
+
offset: null,
|
|
92
|
+
window: false,
|
|
93
|
+
rank: null,
|
|
94
|
+
share: null,
|
|
95
|
+
}
|
|
96
|
+
: null;
|
|
97
|
+
const context = formula?.op === ReportValueFormula.Ratio ? { ...ctx, ratioPercent: true } : ctx;
|
|
98
|
+
return formatOutputValue(row.value, output, value.config?.measure, context, {
|
|
99
|
+
empty: VALUE_EMPTY_TEXT,
|
|
100
|
+
measureSpec: operandSpec(formula, layerValues),
|
|
101
|
+
signed: formula?.signed ?? undefined,
|
|
102
|
+
pointsUnit: false,
|
|
103
|
+
}).text;
|
|
104
|
+
}
|
|
105
|
+
// The keys of the values that came back without a number to show: no row for
|
|
106
|
+
// them, or a row with an error. What an export's gate names as failed.
|
|
107
|
+
export function failedValueKeys(values, rows) {
|
|
108
|
+
const failed = values
|
|
109
|
+
.filter((value) => {
|
|
110
|
+
const row = rows.get(value.id);
|
|
111
|
+
return !row || !!row.error;
|
|
112
|
+
})
|
|
113
|
+
.map(valueKey);
|
|
114
|
+
return [...new Set(failed)];
|
|
115
|
+
}
|
|
116
|
+
// Whether two token value sets read the same, so a recomputed set that changed
|
|
117
|
+
// nothing a token shows does not repaint every block.
|
|
118
|
+
export function sameTextValues(a, b) {
|
|
119
|
+
if (a === b) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (!a || !b) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const keys = Object.keys(a);
|
|
126
|
+
return keys.length === Object.keys(b).length
|
|
127
|
+
&& keys.every((key) => {
|
|
128
|
+
const other = b[key];
|
|
129
|
+
return !!other
|
|
130
|
+
&& a[key].name === other.name
|
|
131
|
+
&& a[key].text === other.text
|
|
132
|
+
&& !!a[key].loading === !!other.loading
|
|
133
|
+
&& (a[key].reads ?? []).join(',') === (other.reads ?? []).join(',');
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Every component of the report, values included: what owns a filter. A value
|
|
137
|
+
// is never drawn, but its filters are the report's like any other.
|
|
138
|
+
export function reportComponents(report) {
|
|
139
|
+
if (!report) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
return [
|
|
143
|
+
...(report.pages ?? []).flatMap((page) => [...(page.components ?? []), ...(page.values ?? [])]),
|
|
144
|
+
...(report.master?.components ?? []),
|
|
145
|
+
...(report.master?.values ?? []),
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
// The value keys each layer holds, by page id and master id. A key that leaves
|
|
149
|
+
// its layer between two loads of the report is a value that was deleted.
|
|
150
|
+
export function layerValueKeys(report) {
|
|
151
|
+
const layers = new Map();
|
|
152
|
+
(report?.pages ?? []).forEach((page) => {
|
|
153
|
+
layers.set(page.id, new Set((page.values ?? []).map(valueKey)));
|
|
154
|
+
});
|
|
155
|
+
if (report?.master) {
|
|
156
|
+
layers.set(report.master.id, new Set((report.master.values ?? []).map(valueKey)));
|
|
157
|
+
}
|
|
158
|
+
return layers;
|
|
159
|
+
}
|
|
160
|
+
// Whether a component is drawn on the canvas. A value only ever reads inside
|
|
161
|
+
// text, so one that leaks into a layer's components is still never drawn.
|
|
162
|
+
export function isDrawn(component) {
|
|
163
|
+
return component.type !== 'value';
|
|
164
|
+
}
|
|
165
|
+
function byId(values) {
|
|
166
|
+
return [...values].sort((a, b) => a.id - b.id);
|
|
167
|
+
}
|
|
168
|
+
// A formula value's operand keys, lowercase, as its TextValue carries them.
|
|
169
|
+
// Nothing for a query value.
|
|
170
|
+
function formulaReads(value) {
|
|
171
|
+
return Array.isArray(value.config?.formula?.of) ? { reads: operandKeys(value) } : {};
|
|
172
|
+
}
|
|
173
|
+
// The format a change or a sum is written in when it names none of its own:
|
|
174
|
+
// its first operand's measure, from the newest value on the layer holding that
|
|
175
|
+
// key. Nothing for any other value, whose own format is all it reads.
|
|
176
|
+
function operandSpec(formula, layerValues) {
|
|
177
|
+
if (formula?.op !== ReportValueFormula.Change && formula?.op !== ReportValueFormula.Sum) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
const first = String(formula.of?.[0] ?? '').toLowerCase();
|
|
181
|
+
return byId(layerValues).filter((value) => valueKey(value) === first).pop()?.config?.measure;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3ZhbHVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFVN0MsT0FBTyxFQUFhLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRzFFLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDhEQUE4RDtBQUU5RCwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBd0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUM7QUFFbkYsNEVBQTRFO0FBQzVFLCtCQUErQjtBQUMvQixNQUFNLFVBQVUsU0FBUyxDQUFDLElBQStCO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRXZHLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsUUFBUSxDQUFDLFNBQTBCO0lBQ2pELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzNELENBQUM7QUFFRCw0RUFBNEU7QUFDNUUscUNBQXFDO0FBQ3JDLE1BQU0sVUFBVSxXQUFXLENBQUMs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QUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydFZhbHVlRm9ybXVsYSB9IGZyb20gJy4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm11bGEuZW51bSc7XG5pbXBvcnQgeyBmb3JtYXRPdXRwdXRWYWx1ZSB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIE51bWJlckZvcm1hdFNwZWMsXG4gIE91dHB1dE1ldGEsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRQYWdlVmFsdWUsXG4gIFZhbHVlRm9ybXVsYUNvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGV4dFZhbHVlLCBWQUxVRV9FTVBUWV9URVhULCBWQUxVRV9UT0tFTl9QQVRURVJOIH0gZnJvbSAnLi90ZXh0JztcblxuXG4vLyBMaXZlIHZhbHVlcyBpbnNpZGUgdGV4dCBibG9ja3M6IHdoaWNoIHZhbHVlcyBhIHBhZ2UncyB0ZXh0IHNob3dzLCBhbmQgd2hhdFxuLy8gZWFjaCB0b2tlbiByZWFkcyBhcy4gQSB2YWx1ZSBiZWxvbmdzIHRvIGEgcGFnZSAodGhlIG1hc3RlciBmb3IgYSBoZWFkZXIgb3Jcbi8vIGZvb3RlcikgYW5kIGlzIGxpc3RlZCBpbiBpdHMgYHZhbHVlc2AsIG5ldmVyIGluIGl0cyBjb21wb25lbnRzLiBQdXJlLCBzbyB0aGVcbi8vIGNhbnZhcyBhbmQgYm90aCBleHBvcnRzIGZpbGwgYSBibG9jaydzIHRva2VucyB0aGUgc2FtZSB3YXkuXG5cbi8vIE5vIHZhbHVlIGtleXM6IHdoYXQgYSB0ZXh0IGJsb2NrIGlzIHRvbGQgb3RoZXIgYmxvY2tzIHNob3cgd2hlbiBub3RoaW5nXG4vLyBzYXlzIG90aGVyd2lzZS4gU2hhcmVkLCBhbmQgdHlwZWQgcmVhZC1vbmx5IHNvIG5vIGNhbGxlciBmaWxscyBpdC5cbmV4cG9ydCBjb25zdCBOT19WQUxVRV9LRVlTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gT2JqZWN0LmZyZWV6ZShuZXcgU2V0PHN0cmluZz4oKSk7XG5cbi8vIFRoZSBrZXlzIGFuIGh0bWwncyB7e3ZhbHVlLjxrZXk+fX0gdG9rZW5zIG5hbWU6IGxvd2VyY2FzZWQsIGVhY2ggb25jZSwgaW5cbi8vIHRoZSBvcmRlciB0aGV5IGZpcnN0IGFwcGVhci5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUtleXMoaHRtbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oKGh0bWwgPz8gJycpLm1hdGNoQWxsKFZBTFVFX1RPS0VOX1BBVFRFUk4pLCAobWF0Y2gpID0+IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkpO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChrZXlzKV07XG59XG5cbi8vIFRoZSBrZXkgYSB2YWx1ZSdzIHRva2VucyBuYW1lLCBhcyB0aGV5IGFyZSBjb21wYXJlZDogbG93ZXJjYXNlLlxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlS2V5KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyhjb21wb25lbnQuY29uZmlnPy5rZXkgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8vIFRoZSBrZXlzIGEgZm9ybXVsYSB2YWx1ZSByZWFkcyAoY29uZmlnLmZvcm11bGEub2YpLCBhcyB0aGV5IGFyZSBjb21wYXJlZDpcbi8vIGxvd2VyY2FzZS4gTm9uZSBmb3IgYSBxdWVyeSB2YWx1ZS5cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYW5kS2V5cyh2YWx1ZTogUmVwb3J0Q29tcG9uZW50KTogc3RyaW5nW10ge1xuICBjb25zdCBvZiA9IHZhbHVlLmNvbmZpZz8uZm9ybXVsYT8ub2Y7XG5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2YpID8gb2YubWFwKChrZXkpID0+IFN0cmluZyhrZXkpLnRvTG93ZXJDYXNlKCkpIDogW107XG59XG5cbi8vIFRoZSB2YWx1ZXMgc29tZSB0ZXh0IHNob3dzLCBpbiBpZCBvcmRlcjogd2hhdCB0aGUgc2VydmVyIHJlYWRzIGZvciB0aGVcbi8vIHBhZ2UuIEEga2V5IGhlbGQgYnkgdHdvIHZhbHVlcyAoYSByYWNlIGJldHdlZW4gdHdvIHdyaXRlcykgaXMgdGhlIG5ld2VzdFxuLy8gb25lJ3MsIGFzIHNlcnZlci1zaWRlLlxuZXhwb3J0IGZ1bmN0aW9uIHNob3duVmFsdWVzKHZhbHVlczogUmVwb3J0Q29tcG9uZW50W10sIHRleHRzOiBSZXBvcnRDb21wb25lbnRbXSk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgY29uc3Qgc2hvd24gPSBuZXcgU2V0KHRleHRzLmZsYXRNYXAoKHRleHQpID0+IHZhbHVlS2V5cyh0ZXh0LmNvbmZpZz8uaHRtbCkpKTtcbiAgY29uc3Qgb3JkZXJlZCA9IGJ5SWQodmFsdWVzKTtcbiAgY29uc3QgbmV3ZXN0ID0gbmV3IE1hcChvcmRlcmVkLm1hcCgodmFsdWUpID0+IFt2YWx1ZUtleSh2YWx1ZSksIHZhbHVlXSkpO1xuXG4gIHJldHVybiBvcmRlcmVkLmZpbHRlcigodmFsdWUpID0+IHNob3duLmhhcyh2YWx1ZUtleSh2YWx1ZSkpICYmIG5ld2VzdC5nZXQodmFsdWVLZXkodmFsdWUpKSA9PT0gdmFsdWUpO1xufVxuXG4vLyBUaGUga2V5cyBhIGxheWVyIHJlYWRzIHdoZW4gaXRzIHRleHQgc2hvd3MgYHNob3duYDogdGhvc2Uga2V5cywgYW5kIHRoZVxuLy8gb3BlcmFuZHMgb2YgZWFjaCBzaG93biBmb3JtdWxhLCBvbmUgbGV2ZWwgZGVlcC4gSXQgbWlycm9ycyB0aGUgc2VydmVyJ3Ncbi8vIFJlcG9ydFRleHRWYWx1ZXM6OmdldFJlYWRLZXlzLCBhbmQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZWRpdG9yJ3Mgbm90aWNlOiB0aGVcbi8vIHNlcnZlcidzIG93biByZWFkIHNldCBkZWNpZGVzIHdoaWNoIG51bWJlcnMgY29tZSBiYWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLZXlzKHNob3duOiBJdGVyYWJsZTxzdHJpbmc+LCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KHNob3duKTtcblxuICAvLyBPdmVyIGEgY29weSBvZiB0aGUgc2hvd24ga2V5cywgc28gYW4gb3BlcmFuZCBhZGRlZCBoZXJlIGlzIG5vdCBleHBhbmRlZC5cbiAgWy4uLmtleXNdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICh2YWx1ZXNba2V5XT8ucmVhZHMgPz8gW10pLmZvckVhY2goKHJlYWQpID0+IGtleXMuYWRkKHJlYWQpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbi8vIFdoYXQgZWFjaCBvZiBhIGxheWVyJ3MgdmFsdWVzIHJlYWRzIGFzLCBieSBrZXksIGZvciBpdHMgdGV4dCdzIHRva2VucyBhbmRcbi8vIGNoaXBzLiBFdmVyeSB2YWx1ZSBpcyBsaXN0ZWQsIHNob3duIG9yIG5vdCwgc28gYSBwYXN0ZWQgY2hpcCBrZWVwcyBpdHMgbmFtZS5cbi8vIEEgdmFsdWUgcmVhZHMgYXMgbG9hZGluZyB1bnRpbCB0aGUgbGF5ZXIncyBudW1iZXJzIGhhdmUgYXJyaXZlZCAoYHJlc3VsdHNgXG4vLyBpcyBudWxsIHVudGlsIHRoZW4pIGFuZCB3aGlsZSBhIHJlcXVlc3Qgc3RpbGwgb24gaXRzIHdheSBhc2tzIGZvciBpdFxuLy8gKGBsb2FkaW5nYCwgYnkgaWQpOiBhIG51bWJlciBvbiBzY3JlZW4gaXMgYWx3YXlzIHRoZSBjdXJyZW50IHJlcXVlc3Qncy4gQVxuLy8gdmFsdWUgd2l0aCBubyByb3csIG9yIHdob3NlIHJvdyBmYWlsZWQsIGhhcyBubyB0ZXh0ICh0aGUgZW0gZGFzaCkuXG5leHBvcnQgZnVuY3Rpb24gdGV4dFZhbHVlcyhcbiAgdmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXSxcbiAgcmVzdWx0czogeyByb3dzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFBhZ2VWYWx1ZT4gfSB8IG51bGwsXG4gIGZvcm1hdDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgbG9hZGluZzogUmVhZG9ubHlTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKSxcbik6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4ge1xuICBjb25zdCBmaWxsZWQ6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4gPSB7fTtcblxuICBieUlkKHZhbHVlcykuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICBjb25zdCBrZXkgPSB2YWx1ZUtleSh2YWx1ZSk7XG4gICAgY29uc3QgbmFtZSA9IHZhbHVlLnRpdGxlIHx8IGtleTtcbiAgICBjb25zdCByb3cgPSByZXN1bHRzPy5yb3dzLmdldCh2YWx1ZS5pZCk7XG4gICAgY29uc3QgcmVhZHMgPSBmb3JtdWxhUmVhZHModmFsdWUpO1xuXG4gICAgaWYgKCFyZXN1bHRzIHx8IGxvYWRpbmcuaGFzKHZhbHVlLmlkKSkge1xuICAgICAgZmlsbGVkW2tleV0gPSB7IG5hbWUsIGxvYWRpbmc6IHRydWUsIC4uLnJlYWRzIH07XG4gICAgfSBlbHNlIGlmIChyb3cgJiYgIXJvdy5lcnJvcikge1xuICAgICAgZmlsbGVkW2tleV0gPSB7IG5hbWUsIHRleHQ6IGZvcm1hdFZhbHVlVGV4dCh2YWx1ZSwgcm93LCB2YWx1ZXMsIGZvcm1hdCksIC4uLnJlYWRzIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbGxlZFtrZXldID0geyBuYW1lLCAuLi5yZWFkcyB9O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxuLy8gQSB2YWx1ZSdzIG51bWJlciBhcyBpdHMgdG9rZW4gcmVhZHMgaXQsIG9uIHRoZSBjYW52YXMgYW5kIGluIGJvdGggZXhwb3J0cyxcbi8vIHRocm91Z2ggdGhlIGZvcm1hdE91dHB1dFZhbHVlIEtQSSBjYXJkcyBhbmQgbGlzdCBjZWxscyB1c2UuIEEgcXVlcnkgdmFsdWVcbi8vIHRoYXQgc2hvd3MgYSBjb21wYXJpc29uIG91dHB1dCwgYW5kIGEgZm9ybXVsYSwgYXJlIHdyaXR0ZW4gYnkgdGhlaXIgcm9sZTogYVxuLy8gY2hhbmdlIG9yIGEgcGVyY2VudCBjaGFuZ2UgaXMgc2lnbmVkICh1bmxlc3MgdGhlIGZvcm11bGEncyBgc2lnbmVkYCBzYXlzXG4vLyBvdGhlcndpc2UpLCBhbmQgYSBjaGFuZ2UgaW4gcG9pbnRzIGNhcnJpZXMgbm8gJyBwcCcsIGFzIHRoZSB3b3JkcyBhcm91bmRcbi8vIHRoZSB0b2tlbiBjYXJyeSB0aGUgdW5pdC4gQSBjaGFuZ2Ugb3IgYSBzdW0gd2l0aCBubyBmb3JtYXQgb2YgaXRzIG93biB0YWtlc1xuLy8gaXRzIGZpcnN0IG9wZXJhbmQncywgYW5kIGEgcmF0aW8gcmVhZHMgYSBwZXJjZW50IGZvcm1hdCBhcyBhIDAtMSBmcmFjdGlvbi5cbi8vIEEgcm93IHdpdGggYW4gZXJyb3IgcmVhZHMgYXMgdGhlIGVtIGRhc2guXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VmFsdWVUZXh0KFxuICB2YWx1ZTogUmVwb3J0Q29tcG9uZW50LFxuICByb3c6IFJlcG9ydFBhZ2VWYWx1ZSxcbiAgbGF5ZXJWYWx1ZXM6IFJlcG9ydENvbXBvbmVudFtdLFxuICBjdHg6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmcge1xuICBpZiAocm93LmVycm9yKSB7XG4gICAgcmV0dXJuIFZBTFVFX0VNUFRZX1RFWFQ7XG4gIH1cblxuICBjb25zdCBmb3JtdWxhID0gdmFsdWUuY29uZmlnPy5mb3JtdWxhID8/IG51bGw7XG4gIGNvbnN0IG91dHB1dDogT3V0cHV0TWV0YSB8IG51bGwgPSByb3cucm9sZSB8fCBmb3JtdWxhXG4gICAgPyB7XG4gICAgICBtZWFzdXJlOiB2YWx1ZUtleSh2YWx1ZSksXG4gICAgICBraW5kOiAndmFsdWUnLFxuICAgICAgcm9sZTogcm93LnJvbGUgPz8gbnVsbCxcbiAgICAgIG9mZnNldDogbnVsbCxcbiAgICAgIHdpbmRvdzogZmFsc2UsXG4gICAgICByYW5rOiBudWxsLFxuICAgICAgc2hhcmU6IG51bGwsXG4gICAgfVxuICAgIDogbnVsbDtcbiAgY29uc3QgY29udGV4dCA9IGZvcm11bGE/Lm9wID09PSBSZXBvcnRWYWx1ZUZvcm11bGEuUmF0aW8gPyB7IC4uLmN0eCwgcmF0aW9QZXJjZW50OiB0cnVlIH0gOiBjdHg7XG5cbiAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHJvdy52YWx1ZSwgb3V0cHV0LCB2YWx1ZS5jb25maWc/Lm1lYXN1cmUsIGNvbnRleHQsIHtcbiAgICBlbXB0eTogVkFMVUVfRU1QVFlfVEVYVCxcbiAgICBtZWFzdXJlU3BlYzogb3BlcmFuZFNwZWMoZm9ybXVsYSwgbGF5ZXJWYWx1ZXMpLFxuICAgIHNpZ25lZDogZm9ybXVsYT8uc2lnbmVkID8/IHVuZGVmaW5lZCxcbiAgICBwb2ludHNVbml0OiBmYWxzZSxcbiAgfSkudGV4dDtcbn1cblxuLy8gVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IGNhbWUgYmFjayB3aXRob3V0IGEgbnVtYmVyIHRvIHNob3c6IG5vIHJvdyBmb3Jcbi8vIHRoZW0sIG9yIGEgcm93IHdpdGggYW4gZXJyb3IuIFdoYXQgYW4gZXhwb3J0J3MgZ2F0ZSBuYW1lcyBhcyBmYWlsZWQuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkVmFsdWVLZXlzKFxuICB2YWx1ZXM6IFJlcG9ydENvbXBvbmVudFtdLFxuICByb3dzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFBhZ2VWYWx1ZT4sXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZhaWxlZCA9IHZhbHVlc1xuICAgIC5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSByb3dzLmdldCh2YWx1ZS5pZCk7XG5cbiAgICAgIHJldHVybiAhcm93IHx8ICEhcm93LmVycm9yO1xuICAgIH0pXG4gICAgLm1hcCh2YWx1ZUtleSk7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZhaWxlZCldO1xufVxuXG4vLyBXaGV0aGVyIHR3byB0b2tlbiB2YWx1ZSBzZXRzIHJlYWQgdGhlIHNhbWUsIHNvIGEgcmVjb21wdXRlZCBzZXQgdGhhdCBjaGFuZ2VkXG4vLyBub3RoaW5nIGEgdG9rZW4gc2hvd3MgZG9lcyBub3QgcmVwYWludCBldmVyeSBibG9jay5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lVGV4dFZhbHVlcyhcbiAgYTogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPiB8IHVuZGVmaW5lZCxcbiAgYjogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuXG4gIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMoYikubGVuZ3RoXG4gICAgJiYga2V5cy5ldmVyeSgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IGJba2V5XTtcblxuICAgICAgcmV0dXJuICEhb3RoZXJcbiAgICAgICAgJiYgYVtrZXldLm5hbWUgPT09IG90aGVyLm5hbWVcbiAgICAgICAgJiYgYVtrZXldLnRleHQgPT09IG90aGVyLnRleHRcbiAgICAgICAgJiYgISFhW2tleV0ubG9hZGluZyA9PT0gISFvdGhlci5sb2FkaW5nXG4gICAgICAgICYmIChhW2tleV0ucmVhZHMgPz8gW10pLmpvaW4oJywnKSA9PT0gKG90aGVyLnJlYWRzID8/IFtdKS5qb2luKCcsJyk7XG4gICAgfSk7XG59XG5cbi8vIEV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgcmVwb3J0LCB2YWx1ZXMgaW5jbHVkZWQ6IHdoYXQgb3ducyBhIGZpbHRlci4gQSB2YWx1ZVxuLy8gaXMgbmV2ZXIgZHJhd24sIGJ1dCBpdHMgZmlsdGVycyBhcmUgdGhlIHJlcG9ydCdzIGxpa2UgYW55IG90aGVyLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydENvbXBvbmVudHMocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogUmVwb3J0Q29tcG9uZW50W10ge1xuICBpZiAoIXJlcG9ydCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgLi4uKHJlcG9ydC5wYWdlcyA/PyBbXSkuZmxhdE1hcCgocGFnZSkgPT4gWy4uLihwYWdlLmNvbXBvbmVudHMgPz8gW10pLCAuLi4ocGFnZS52YWx1ZXMgPz8gW10pXSksXG4gICAgLi4uKHJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIC4uLihyZXBvcnQubWFzdGVyPy52YWx1ZXMgPz8gW10pLFxuICBdO1xufVxuXG4vLyBUaGUgdmFsdWUga2V5cyBlYWNoIGxheWVyIGhvbGRzLCBieSBwYWdlIGlkIGFuZCBtYXN0ZXIgaWQuIEEga2V5IHRoYXQgbGVhdmVzXG4vLyBpdHMgbGF5ZXIgYmV0d2VlbiB0d28gbG9hZHMgb2YgdGhlIHJlcG9ydCBpcyBhIHZhbHVlIHRoYXQgd2FzIGRlbGV0ZWQuXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWYWx1ZUtleXMocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogTWFwPG51bWJlciwgU2V0PHN0cmluZz4+IHtcbiAgY29uc3QgbGF5ZXJzID0gbmV3IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PigpO1xuXG4gIChyZXBvcnQ/LnBhZ2VzID8/IFtdKS5mb3JFYWNoKChwYWdlKSA9PiB7XG4gICAgbGF5ZXJzLnNldChwYWdlLmlkLCBuZXcgU2V0KChwYWdlLnZhbHVlcyA/PyBbXSkubWFwKHZhbHVlS2V5KSkpO1xuICB9KTtcblxuICBpZiAocmVwb3J0Py5tYXN0ZXIpIHtcbiAgICBsYXllcnMuc2V0KHJlcG9ydC5tYXN0ZXIuaWQsIG5ldyBTZXQoKHJlcG9ydC5tYXN0ZXIudmFsdWVzID8/IFtdKS5tYXAodmFsdWVLZXkpKSk7XG4gIH1cblxuICByZXR1cm4gbGF5ZXJzO1xufVxuXG4vLyBXaGV0aGVyIGEgY29tcG9uZW50IGlzIGRyYXduIG9uIHRoZSBjYW52YXMuIEEgdmFsdWUgb25seSBldmVyIHJlYWRzIGluc2lkZVxuLy8gdGV4dCwgc28gb25lIHRoYXQgbGVha3MgaW50byBhIGxheWVyJ3MgY29tcG9uZW50cyBpcyBzdGlsbCBuZXZlciBkcmF3bi5cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYXduKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wb25lbnQudHlwZSAhPT0gJ3ZhbHVlJztcbn1cblxuZnVuY3Rpb24gYnlJZCh2YWx1ZXM6IFJlcG9ydENvbXBvbmVudFtdKTogUmVwb3J0Q29tcG9uZW50W10ge1xuICByZXR1cm4gWy4uLnZhbHVlc10uc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpO1xufVxuXG4vLyBBIGZvcm11bGEgdmFsdWUncyBvcGVyYW5kIGtleXMsIGxvd2VyY2FzZSwgYXMgaXRzIFRleHRWYWx1ZSBjYXJyaWVzIHRoZW0uXG4vLyBOb3RoaW5nIGZvciBhIHF1ZXJ5IHZhbHVlLlxuZnVuY3Rpb24gZm9ybXVsYVJlYWRzKHZhbHVlOiBSZXBvcnRDb21wb25lbnQpOiBQaWNrPFRleHRWYWx1ZSwgJ3JlYWRzJz4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZS5jb25maWc/LmZvcm11bGE/Lm9mKSA/IHsgcmVhZHM6IG9wZXJhbmRLZXlzKHZhbHVlKSB9IDoge307XG59XG5cbi8vIFRoZSBmb3JtYXQgYSBjaGFuZ2Ugb3IgYSBzdW0gaXMgd3JpdHRlbiBpbiB3aGVuIGl0IG5hbWVzIG5vbmUgb2YgaXRzIG93bjpcbi8vIGl0cyBmaXJzdCBvcGVyYW5kJ3MgbWVhc3VyZSwgZnJvbSB0aGUgbmV3ZXN0IHZhbHVlIG9uIHRoZSBsYXllciBob2xkaW5nIHRoYXRcbi8vIGtleS4gTm90aGluZyBmb3IgYW55IG90aGVyIHZhbHVlLCB3aG9zZSBvd24gZm9ybWF0IGlzIGFsbCBpdCByZWFkcy5cbmZ1bmN0aW9uIG9wZXJhbmRTcGVjKFxuICBmb3JtdWxhOiBWYWx1ZUZvcm11bGFDb25maWcgfCBudWxsLFxuICBsYXllclZhbHVlczogUmVwb3J0Q29tcG9uZW50W10sXG4pOiBOdW1iZXJGb3JtYXRTcGVjIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZvcm11bGE/Lm9wICE9PSBSZXBvcnRWYWx1ZUZvcm11bGEuQ2hhbmdlICYmIGZvcm11bGE/Lm9wICE9PSBSZXBvcnRWYWx1ZUZvcm11bGEuU3VtKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0ID0gU3RyaW5nKGZvcm11bGEub2Y/LlswXSA/PyAnJykudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gYnlJZChsYXllclZhbHVlcykuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWVLZXkodmFsdWUpID09PSBmaXJzdCkucG9wKCk/LmNvbmZpZz8ubWVhc3VyZTtcbn1cbiJdfQ==
|
|
@@ -21,6 +21,7 @@ import { ReportExportCollectorService } from '../../export/report-export-collect
|
|
|
21
21
|
import { ReportExportService } from '../../export/report-export.service';
|
|
22
22
|
import { ReportPdfService } from '../../export/report-pdf.service';
|
|
23
23
|
import { ReportPptxService } from '../../export/report-pptx.service';
|
|
24
|
+
import { ReportTextLayoutService } from '../../export/report-text-layout.service';
|
|
24
25
|
import { getTimezoneLabel } from '../../format';
|
|
25
26
|
import { GROUP_BY_ITEM, filterItemForGroup, groupByFilterItem, groupBySignature, groupValuesFromQuery, isGranularityOffered, } from '../../report-filter-items';
|
|
26
27
|
import { buildReportUrlParams, readReportUrlParams } from '../../report-url-state';
|
|
@@ -504,6 +505,7 @@ export class FsAiReportComponent {
|
|
|
504
505
|
ReportExportCollectorService,
|
|
505
506
|
ReportPptxService,
|
|
506
507
|
ReportPdfService,
|
|
508
|
+
ReportTextLayoutService,
|
|
507
509
|
ReportExportService,
|
|
508
510
|
// fs-ai-chat sits in this template, so it resolves its gateway here: the
|
|
509
511
|
// report one, which adds the viewer's state to each turn it sends.
|
|
@@ -522,6 +524,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
522
524
|
ReportExportCollectorService,
|
|
523
525
|
ReportPptxService,
|
|
524
526
|
ReportPdfService,
|
|
527
|
+
ReportTextLayoutService,
|
|
525
528
|
ReportExportService,
|
|
526
529
|
// fs-ai-chat sits in this template, so it resolves its gateway here: the
|
|
527
530
|
// report one, which adds the viewer's state to each turn it sends.
|
|
@@ -548,4 +551,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
548
551
|
type: ViewChild,
|
|
549
552
|
args: [ReportCanvasComponent]
|
|
550
553
|
}] } });
|
|
551
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFnQixjQUFjLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FB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RUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztxQkFDdEcsV0FDUTt3QkFDUCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixxQkFBcUI7cUJBQ3RCO3dEQTZHTyxNQUFNO3NCQURiLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJNUIsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBTWxELE9BQU87c0JBRGQsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSwgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xuXG5pbXBvcnQgeyBGc0FpQ2hhdENvbXBvbmVudCwgRnNBaUNoYXREYXRhLCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xuXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0QWlDaGF0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWFpLWNoYXQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VGltZXpvbmVMYWJlbCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyU3RhdGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LCBSZXBvcnRDaGF0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwQnlGaWx0ZXJJdGVtLCBncm91cEJ5U2lnbmF0dXJlLCBncm91cFZhbHVlc0Zyb21RdWVyeSxcbiAgaXNHcmFudWxhcml0eU9mZmVyZWQsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgYnVpbGRSZXBvcnRVcmxQYXJhbXMsIHJlYWRSZXBvcnRVcmxQYXJhbXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtdXJsLXN0YXRlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSwgZGVmYXVsdFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gQSBzaW5nbGUgcmVwb3J0OiB0aGUgQUkgY2hhdCBvbiB0aGUgbGVmdCwgdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0LFxuLy8gdW5kZXIgYW4gSDIgdGl0bGUgKyBzZXR0aW5ncyBnZWFyLiBUaGUgaG9zdCBzdXBwbGllcyBbcmVwb3J0SWRdIChmcm9tIGl0c1xuLy8gcm91dGUpIGFuZCBzd2l0Y2hlcyByZXBvcnRzIHRocm91Z2ggaXRzIG93biByb3V0ZXMg4oCUIHRoaXMgY29tcG9uZW50IG5ldmVyXG4vLyBwaWNrcyBvbmUuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG4gIHByb3ZpZGVyczogW1xuICAgIC8vIFNlc3Npb24gZmlsdGVyIHN0YXRlIGlzIHBlci1vcGVuLXJlcG9ydCwgbm90IGFwcC1nbG9iYWw7IHRoZSBleHBvcnRcbiAgICAvLyBzZXJ2aWNlcyByZXNvbHZlIGZpbHRlcnMgdGhyb3VnaCBpdCwgc28gdGhleSBsaXZlIGF0IHRoZSBzYW1lIGxldmVsLlxuICAgIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlLFxuICAgIFJlcG9ydFBwdHhTZXJ2aWNlLFxuICAgIFJlcG9ydFBkZlNlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0U2VydmljZSxcbiAgICAvLyBmcy1haS1jaGF0IHNpdHMgaW4gdGhpcyB0ZW1wbGF0ZSwgc28gaXQgcmVzb2x2ZXMgaXRzIGdhdGV3YXkgaGVyZTogdGhlXG4gICAgLy8gcmVwb3J0IG9uZSwgd2hpY2ggYWRkcyB0aGUgdmlld2VyJ3Mgc3RhdGUgdG8gZWFjaCB0dXJuIGl0IHNlbmRzLlxuICAgIFJlcG9ydEFpQ2hhdERhdGEsXG4gICAgeyBwcm92aWRlOiBGc0FpQ2hhdERhdGEsIHVzZUV4aXN0aW5nOiBSZXBvcnRBaUNoYXREYXRhIH0sXG4gICAgLy8gVHJlZS1zaGFrZW4gRUNoYXJ0cyBjb3JlICsgdGhlICdyZXBvcnQnIGhvdXNlIHRoZW1lLCBsb2FkZWQgbGF6aWx5LlxuICAgIHByb3ZpZGVFY2hhcnRzQ29yZSh7IGVjaGFydHM6ICgpID0+IGltcG9ydCgnLi4vLi4vdGhlbWUvZWNoYXJ0cycpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlLmRlZmF1bHQpIH0pLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNNZW51TW9kdWxlLFxuICAgIEZzQWlDaGF0Q29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgUmVwb3J0Q2FudmFzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0Q29tcG9uZW50IHtcblxuICAvLyBUaGUgcmVwb3J0IHRoaXMgdmlldyBpcyBmb2N1c2VkIG9uIOKAlCBzdXBwbGllZCBieSB0aGUgaG9zdCBmcm9tIHRoZSByb3V0ZS5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzICsgY2hhdCBlbmRwb2ludHM7IG92ZXJyaWRlIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIHJlYWRvbmx5IGJhc2VQYXRoID0gaW5wdXQ8c3RyaW5nPigncmVwb3J0cycpO1xuXG4gIC8vIFRoZSBxdWVyeSBwYXJhbSB0aGF0IGNhcnJpZXMgdGhlIG9wZW4gcGFnZSdzIGlkLiBEZWVwIGxpbmtpbmcgaXMgb24gYnlcbiAgLy8gZGVmYXVsdDsgYSBob3N0IHRoYXQgbW91bnRzIHNldmVyYWwgcmVwb3J0cyBvbiBvbmUgcm91dGUsIG9yIHdhbnRzIG5vIFVSTFxuICAvLyB3cml0ZXMgYXQgYWxsLCBzZXRzIHRoaXMgdG8gbnVsbCB0byB0dXJuIGl0IG9mZi5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcblxuICAvLyBXaGV0aGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBncm91cC1ieSBncmFpbiBhbmQgbGlzdCBzb3J0cyBsaXZlIGluIHRoZSBVUkxcbiAgLy8gKGc8Z3JvdXBJZD4sIGdyb3VwQnksIHM8Y29tcG9uZW50SWQ+OyBzZWUgcmVwb3J0LXVybC1zdGF0ZS50cyksIHNvIGFcbiAgLy8gcmVmcmVzaCBvciBhIHNoYXJlZCBsaW5rIG9wZW5zIHRoZSByZXBvcnQgYXMgaXQgd2FzIHNlZW4uIE9uIGJ5IGRlZmF1bHQ7IGFcbiAgLy8gaG9zdCB0aGF0IG1vdW50cyBzZXZlcmFsIHJlcG9ydHMgb24gb25lIHJvdXRlLCBvciB1c2VzIHF1ZXJ5IGtleXMgc2hhcGVkXG4gIC8vIGxpa2UgZzxuPiBvciBzPG4+IGl0c2VsZiwgdHVybnMgaXQgb2ZmLlxuICBwdWJsaWMgcmVhZG9ubHkgdXJsU3RhdGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyBkZWxldGVkIGZyb20gaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIGhvc3Qgcm91dGVzIGJhY2sgdG9cbiAgLy8gdGhlIGxpc3RpbmcuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVkID0gb3V0cHV0PFJlcG9ydD4oKTtcblxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gVGhpcyB2aWV3IHdyaXRlcyB0aGUgVVJMIGl0c2VsZiAocmlnaHRcbiAgLy8gYWZ0ZXIgdGhpcyBmaXJlcykg4oCUIHRoaXMgaXMgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3IgdGhlaXJcbiAgLy8gb3duIHJlYXNvbnMuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlQ2hhbmdlZCA9IG91dHB1dDxudW1iZXIgfCBudWxsPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvb2xiYXIncyB6b25lIGluZGljYXRvciAoJ05ldyBZb3JrIChFRFQpJyk6IHRoZSB6b25lIGV2ZXJ5IGRhdGUgaW5cbiAgLy8gdGhpcyByZXBvcnQgaXMgZmlsdGVyZWQgYW5kIGdyb3VwZWQgaW4uIEVtcHR5IHdoZW4gdGhlIHNlcnZlciBpcyB0b28gb2xkXG4gIC8vIHRvIHNlbmQgdGhlIGVmZmVjdGl2ZSB6b25lLCBhbmQgdGhlIGluZGljYXRvciBpcyBub3Qgc2hvd24uXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWV6b25lID0gdGhpcy5yZXBvcnQoKT8uZWZmZWN0aXZlVGltZXpvbmU7XG5cbiAgICByZXR1cm4gZWZmZWN0aXZlVGltZXpvbmUgPyBnZXRUaW1lem9uZUxhYmVsKGVmZmVjdGl2ZVRpbWV6b25lKSA6ICcnO1xuICB9KTtcblxuICAvLyBUaGUgcGFnZSB0aGUgY2FudmFzIHNob3VsZCBvcGVuIG9uLCByZWFkIGZyb20gdGhlIFVSTCBvbmNlIHBlciByZXBvcnQuXG4gIC8vIENsZWFyZWQgYXMgc29vbiBhcyB0aGUgY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYSBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2VcbiAgLy8gaXMgbmV2ZXIgZm91Z2h0IGJ5IGEgc3RhbGUgdmFsdWUuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cbiAgLy8gYmVsb25ncyB0byBleGFjdGx5IG9uZSBwYWdlLCBzbyB0aGlzIGJvdGggc2NvcGVzIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcbiAgLy8gW3JlcXVlc3REYXRhXSDigJQgY2hhbmdpbmcgaXQgaXMgd2hhdCByZWxvYWRzIHRoZSBwYW5lbCBvbnRvIHRoZSBuZXcgcGFnZSdzXG4gIC8vIGNvbnZlcnNhdGlvbnMuIE51bGwgdW50aWwgdGhlIGNhbnZhcyByZXBvcnRzIHdoaWNoIHBhZ2UgaXQgb3BlbmVkIG9uLCB3aGljaFxuICAvLyBrZWVwcyB0aGUgY2hhdCBmcm9tIGxpc3RpbmcgYWdhaW5zdCBhIHBhZ2UgZ3Vlc3MuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFdoYXQgdGhlIGNoYXQgc2VuZHMgd2l0aCBldmVyeSBjb252ZXJzYXRpb24gY2FsbDogdGhlIHJlcG9ydCwgYW5kIHRoZSBwYWdlXG4gIC8vIGl0IGlzIGJvdW5kIHRvLlxuICAvL1xuICAvLyByZXBvcnRQYWdlSWQgaXMgT01JVFRFRCwgbm90IHNlbnQgYXMgbnVsbCwgd2hpbGUgdGhlIG9wZW4gcGFnZSBpcyB1bmtub3duLlxuICAvLyBUaGUgYmFja2VuZCByZWFkcyBhIFBSRVNFTlQgcmVwb3J0UGFnZUlkIG9mIDAvbnVsbCBhcyBcInRoZSByZXBvcnQncyBlYXJsaWVyLFxuICAvLyBwYWdlLWxlc3MgY29udmVyc2F0aW9uc1wiLCBzbyBzZW5kaW5nIG51bGwgYmVmb3JlIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIGluXG4gIC8vIHdvdWxkIGFzayBmb3IgdGhlIHdyb25nIGxpc3Qg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGJpbmQgYSBjb252ZXJzYXRpb24gc3RhcnRlZFxuICAvLyBpbiB0aGF0IHdpbmRvdyB0byBubyBwYWdlIGF0IGFsbC5cbiAgLy9cbiAgLy8gVGhlIGNoYXQgaXMgYWxzbyBoZWxkIGNsb3NlZCAoW3JlYWR5XSBpbiB0aGUgdGVtcGxhdGUpIHVudGlsIHRoZSBwYWdlIGlzXG4gIC8vIGtub3duLCBzbyB0aGlzIHBhcnRpYWwgY29udGV4dCBpcyBuZXZlciBhY3R1YWxseSBzZW50OiBvbiBhIGZyZXNoIGxvYWQgdGhlXG4gIC8vIHJlcG9ydCBoYXMgdG8gYXJyaXZlIGFuZCB0aGUgY2FudmFzIGhhcyB0byByZW5kZXIgYmVmb3JlIGFueSBwYWdlIGV4aXN0cyxcbiAgLy8gYW5kIGEgbGlzdCBmZXRjaGVkIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIHRoZSB3aG9sZSByZXBvcnQncyBjb252ZXJzYXRpb25zXG4gIC8vIOKAlCB0aGUgdW5zY29wZWQgbGlzdCwgc2hvd24gYW5kIGF1dG8tc2VsZWN0ZWQgYmVmb3JlIHRoZSByZWFsIG9uZSBsYW5kcy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRSZXF1ZXN0RGF0YSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0UGFnZUlkID0gdGhpcy5jaGF0UGFnZUlkKCk7XG5cbiAgICByZXR1cm4gcmVwb3J0UGFnZUlkID09PSBudWxsXG4gICAgICA/IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSB9XG4gICAgICA6IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSwgcmVwb3J0UGFnZUlkIH07XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxuICAvLyByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpIGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJDb25maWcgPSBzaWduYWw8RmlsdGVyQ29uZmlnIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH0pO1xuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxuICAvLyByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRoZSBlZmZlY3RpdmUgem9uZSBpcyBwYXJ0IG9mIGl0IHRvbzogYSB6b25lIGNoYW5nZSByZS1yZXNvbHZlcyByZWxhdGl2ZVxuICAgICAgLy8gcHJlc2V0cywgYW5kIHRoZSBiYXIgbXVzdCBiZSByZWNyZWF0ZWQgdG8gc2hvdyB0aGUgbmV3IGRheXMuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XG4gICAgICAvLyBzZXR0aW5ncyByZWJ1aWxkcyB0aGUgY29uZmlnLCBidXQgd2l0aG91dCBhIGtleSBjaGFuZ2UgZnMtZmlsdGVyIGtlZXBzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQoKSksXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfSk7XG5cbiAgQFZpZXdDaGlsZCgnc3BsaXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF9zcGxpdCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXRQYW5lbCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgX2NoYXRQYW5lbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE9ubHkgdGhlIGNhbnZhcyBrbm93cyB3aGljaCBwYWdlIGlzIG9uIHNjcmVlbiwgYW5kIGEgcGFnZS1zY29wZWQgZXhwb3J0XG4gIC8vIGhhcyB0byBhc2sgaXQuXG4gIEBWaWV3Q2hpbGQoUmVwb3J0Q2FudmFzQ29tcG9uZW50KVxuICBwcml2YXRlIF9jYW52YXM/OiBSZXBvcnRDYW52YXNDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcmVwb3J0QWlDaGF0RGF0YSA9IGluamVjdChSZXBvcnRBaUNoYXREYXRhKTtcbiAgcHJpdmF0ZSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZXhwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wcm9jZXNzID0gaW5qZWN0KEZzUHJvY2Vzcyk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLy8gVGhlIHJlcG9ydCB3aG9zZSBVUkwgc3RhdGUgaGFzIGJlZW4gcmVhZC4gVGhlIFVSTCBpcyByZWFkIG9ubHkgb24gYVxuICAvLyByZXBvcnQncyBmaXJzdCBsb2FkOyBhIHJlbG9hZCBhZnRlciBhIGNoYXQgb3IgZGlhbG9nIGVkaXQga2VlcHMgdGhlIHN0YXRlXG4gIC8vIGluIG1lbW9yeSwgd2hpY2ggaXMgbmV3ZXIgdGhhbiBhbnl0aGluZyB0aGUgVVJMIGhvbGRzLlxuICBwcml2YXRlIF9yZXN0b3JlZFJlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIHRoZSBvcGVuIHBhZ2UgZm9yIHRoaXMgcmVwb3J0LiBVbnRpbCBpdFxuICAvLyBoYXMsIHRoZSBwYWdlIHBhcmFtIGluIHRoZSBVUkwgaXMgdGhlIGRlZXAgbGluayBzdGlsbCBiZWluZyBob25vcmVkLCBhbmRcbiAgLy8gdGhlIFVSTCB3cml0ZXIgbGVhdmVzIGl0IGFsb25lLlxuICBwcml2YXRlIF9wYWdlUmVwb3J0ZWQgPSBmYWxzZTtcblxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gTWVyZ2VkIGludG8gdGhlIHNpbmdsZSBVUkwgd3JpdGVyLlxuICBwcml2YXRlIF9wYWdlV3JpdGUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFYWNoIGNoYXQgdHVybiBjYXJyaWVzIHdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuLiBPbmx5IHRoZSBmdW5jdGlvblxuICAgIC8vIGlzIHNldCBoZXJlOyBpdCBpcyBjYWxsZWQgd2hlbiBhIHR1cm4gaXMgc2VudC5cbiAgICB0aGlzLl9yZXBvcnRBaUNoYXREYXRhLnR1cm5EYXRhID0gKCkgPT4gKHsgdmlld2VyU3RhdGU6IHRoaXMuX2NoYXRWaWV3ZXJTdGF0ZSgpIH0pO1xuXG4gICAgLy8gVGhlIE9ORSB3cml0ZXIgb2YgdGhpcyB2aWV3J3MgcXVlcnkgcGFyYW1zLiBQYWdlIG1vdmVzIGFuZCB2aWV3ZXItc3RhdGVcbiAgICAvLyBjaGFuZ2VzIGJvdGggZnVubmVsIGhlcmUsIGFuZCBhdWRpdFRpbWUoMCkgZm9sZHMgYSBidXJzdCAoYSBiYXIgcmUtc2V0c1xuICAgIC8vIGV2ZXJ5IGdyb3VwIGl0IHNob3dzKSBpbnRvIGEgc2luZ2xlIHdyaXRlLiBFdmVyeSB3cml0ZSBjYXJyaWVzIHRoZSB3aG9sZVxuICAgIC8vIHN0YXRlLCBzbyBhIHdyaXRlIHRoYXQgc3VwZXJzZWRlcyBhbm90aGVyIGxvc2VzIG5vdGhpbmcuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUudXJsQ2hhbmdlcygpLCB0aGlzLl9wYWdlV3JpdGUkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGF1ZGl0VGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3dyaXRlVXJsKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG5cbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcblxuICAgICAgLy8gU2VlZCB0aGUgb3BlbiBwYWdlIGZyb20gdGhlIFVSTCBmb3IgdGhpcyByZXBvcnQuIFJlYWQgcGVyIGxvYWQgcmF0aGVyXG4gICAgICAvLyB0aGFuIG9uY2UgYXQgY29uc3RydWN0aW9uOiB0aGUgaG9zdCBtYXkgc3dhcCByZXBvcnRzIG9uIHRoZSBzYW1lIHJvdXRlLFxuICAgICAgLy8gYW5kIGVhY2ggYXJyaXZhbCBjYXJyaWVzIGl0cyBvd24gP3BhZ2U9LlxuICAgICAgY29uc3QgcGFnZUlkID0gdGhpcy5fcGFnZUlkRnJvbVVybCgpO1xuXG4gICAgICAvLyBPbmx5IHRoZSByZXBvcnQgaWQgYW5kIHRoZSBwYWdlIHBhcmFtIHJlLXJ1biB0aGlzLiBUaGUgdmlldyBzdGF0ZSBiZWxvd1xuICAgICAgLy8gaXMgd3JpdHRlbiBoZXJlIGFuZCByZWFkIGJ5IHRoZSBjb25maWcgYnVpbGQsIHNvIGl0IHN0YXlzIHVudHJhY2tlZC5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdE1vZGUuc2V0KGZhbHNlKTtcblxuICAgICAgICAvLyBBIG5ldyByZXBvcnQncyBwYWdlcyBhcmUgbm90IHRoaXMgcmVwb3J0J3MgcGFnZXMg4oCUIGRyb3AgdGhlIGJpbmRpbmdcbiAgICAgICAgLy8gdW50aWwgaXRzIGNhbnZhcyBzYXlzIHdoaWNoIHBhZ2UgaXQgbGFuZGVkIG9uLlxuICAgICAgICB0aGlzLmNoYXRQYWdlSWQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAgICAgdGhpcy5fcGFnZVJlcG9ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJlcG9ydElkICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3JnZXQgdGhlIHJlc3RvcmVkIHJlcG9ydCwgc28gYSBob3N0IHRoYXQgY29tZXMgYmFjayB0byBpdCByZWFkc1xuICAgICAgICAgIC8vIHRoZSBVUkwgYWdhaW4uXG4gICAgICAgICAgdGhpcy5fcmVzdG9yZWRSZXBvcnRJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRNb2RlLnVwZGF0ZSgoZWRpdE1vZGUpID0+ICFlZGl0TW9kZSk7XG4gIH1cblxuICAvLyBUaGUgZWRpdCB0b29scyBsaXZlIGluIHRoaXMgdG9vbGJhciwgYnV0IHRoZSBjYW52YXMgb3ducyB3aGF0IHRoZXkgYWN0IG9uXG4gIC8vICh0aGUgYWN0aXZlIHBhZ2UsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRzLCB3aGljaCBsYXllciBpcyBsaXZlKS5cbiAgcHVibGljIGdldCBpc01hc3Rlck1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbnZhcz8ubWFzdGVyTW9kZSgpID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFkZFRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy5hZGRUZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWFzdGVyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXM/LnRvZ2dsZU1hc3Rlck1vZGUoKTtcbiAgfVxuXG4gIC8vIFJlcG9ydCBzZXR0aW5ncyDigJQgbmFtZSwgcGFnZSBzaXplLCBkZWxldGUuIFRoZVxuICAvLyBkaWFsb2cgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGY7IHdlIHJlYWN0IHRvIHdoYXQgaXQgcmVwb3J0cyBiYWNrLlxuICBwdWJsaWMgcmVwb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0LmlkO1xuXG4gICAgdGhpcy5fZGlhbG9nLm9wZW48UmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIFJlcG9ydFNldHRpbmdzUmVzdWx0PihSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyByZXBvcnQgfSxcbiAgICAgIHdpZHRoOiAnNDYwcHgnLFxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVkLmVtaXQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzIOKAlCB0aXRsZSwgZXhhY3QgZ2VvbWV0cnksIGFuZCB0aGUgZGlhZ25vc3RpYyB2aWV3c1xuICAvLyAoU1FMLCBjb25maWcsIGZpbHRlciB3aXJpbmcpLlxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnRNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdD4oXG4gICAgICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgZGF0YTogeyByZXBvcnQsIGNvbXBvbmVudCB9LFxuICAgICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhZGQvcmVtb3ZlL2xldmVsIGNoYW5nZXMgcGVyc2lzdCBpbW1lZGlhdGVseSBpbnNpZGUgdGhlIGRpYWxvZyAobm9cbiAgICAvLyBcInNhdmVcIikgYW5kIGNhbiBsZWF2ZSBpdCBieSBhbiBleGl0IHRoYXQgY2FycmllcyBubyByZXN1bHQsIHNvIHRoZXkgYXJlXG4gICAgLy8gYW5ub3VuY2VkIGFzIHRoZXkgbGFuZC4gVGhlIHJlbG9hZCB3YWl0cyBmb3IgdGhlIGNsb3NlIHNvIHRoZSBjYW52YXMgaXNuJ3RcbiAgICAvLyByZS1yZW5kZXJpbmcgdW5kZXJuZWF0aCBhbiBvcGVuIGRpYWxvZy5cbiAgICBsZXQgZmlsdGVyc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZmlsdGVyc0NoYW5nZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGZpbHRlcnNDaGFuZ2VkID0gdHJ1ZSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIFRoZSBkaWFsb2cgY29uZmlybXMgKyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZi4gVGhlIGNvbXBvbmVudCBpc1xuICAgICAgICAvLyBnb25lIGZyb20gdGhlIHJlcG9ydCwgc28gcmVsb2FkIHJhdGhlciB0aGFuIHBhdGNoaW5nIGl0IG91dCBsb2NhbGx5IOKAlFxuICAgICAgICAvLyBpdHMgZmlsdGVycyB3ZW50IHdpdGggaXQsIHdoaWNoIHRoZSByZXBvcnQgYmFyIGhhcyB0byBiZSByZWJ1aWx0IGZvci5cbiAgICAgICAgaWYgKHJlc3VsdD8uZGVsZXRlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcG9ydCdzIGZpbHRlciBncm91cHMgY2hhbmdlZCwgc28gdGhlIHJlcG9ydCBiYXIgYW5kIHRoZVxuICAgICAgICAvLyBvbi1jb21wb25lbnQgc3RyaXBzIGhhdmUgdG8gYmUgcmVidWlsdCBmcm9tIGEgZnJlc2ggcmVwb3J0LlxuICAgICAgICBpZiAoZmlsdGVyc0NoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgZWxzZSBpbiB0aGUgZGlhbG9nIHRvdWNoZXMgdGhlIHF1ZXJ5IOKAlCB0aXRsZSBhbmQgcGFkZGluZyBhcmVcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLiBSZXBhaW50IHRoZSBvbmUgY29tcG9uZW50IGl0IHdhcyBvcGVuZWQgZm9yIGFuZCBsZWF2ZVxuICAgICAgICAvLyBldmVyeSBvdGhlciBjb21wb25lbnQncyBkYXRhLCBhbmQgaXRzIHF1ZXJ5LCBhbG9uZS5cbiAgICAgICAgaWYgKHJlc3VsdD8uc2V0dGluZ3MpIHtcbiAgICAgICAgICB0aGlzLl9jYW52YXM/LmFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50LmlkLCByZXN1bHQuc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgbW92ZWQgdG8gYW5vdGhlciBwYWdlOiByZWZsZWN0IGl0IGluIHRoZSBVUkwgc28gYSByZWZyZXNoIG9yIGFcbiAgLy8gc2hhcmVkIGxpbmsgY29tZXMgYmFjayBoZXJlICh0aGUgd3JpdGUgaXRzZWxmIGlzIF93cml0ZVVybCdzKS5cbiAgcHVibGljIG9uQ2FudmFzUGFnZUNoYW5nZWQocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gVGhlIGRlZXAgbGluayBoYXMgYmVlbiBjb25zdW1lZDsgZnJvbSBoZXJlIHRoZSBjYW52YXMgb3ducyB0aGUgcGFnZS5cbiAgICB0aGlzLnBhZ2VJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGF0UGFnZUlkLnNldChwYWdlSWQpO1xuICAgIHRoaXMuX3BhZ2VSZXBvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2VJZCk7XG4gICAgdGhpcy5fcGFnZVdyaXRlJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSAoYWRkZWQgYSBwYWdlKSDigJQgcmUtZmV0Y2ggc28gdGhlXG4gIC8vIG5ldyBwYWdlIHJlbmRlcnM7IHRoZSBjYW52YXMgbGFuZHMgdGhlIHZpZXcgb24gaXQuXG4gIHB1YmxpYyBvbkNhbnZhc1JlcG9ydENoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG5hdGl2ZSBlZGl0YWJsZVxuICAvLyBjaGFydHM7IHBhZ2UgPSBzbGlkZSkuIFRoZSBkb2NrIHNob3dzIHByb2dyZXNzIHVudGlsIHRoZSBmaWxlIHNhdmVzLlxuICBwdWJsaWMgZXhwb3J0UG93ZXJwb2ludCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBvd2VyUG9pbnQnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0byBQREYsIGVudGlyZWx5IGNsaWVudC1zaWRlIChvZmZzY3JlZW4gRUNoYXJ0cyBhdCAzw5c7IHBhZ2UgPSBQREYgcGFnZSkuXG4gIHB1YmxpYyBleHBvcnRQZGYoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHdob2xlIHJlcG9ydCBhcyBmaWxlcyBpbiBvbmUgYWN0aW9uOiB0aGUgc2VydmVyIHdyaXRlcyBvbmUgQ1NWIHBlclxuICAvLyBjb21wb25lbnQsIGVhY2ggd2hhdCB0aGUgc2NyZWVuIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyBkcmF3biwgYXQgdGhlXG4gIC8vIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluOyBhIGxpc3QgaW4gZnVsbCksIGFuZCB6aXBzIHRoZW0gZm9sZGVyZWQgYnkgcGFnZVxuICAvLyB3aXRoIGFuIEV4cG9ydCBOb3Rlcy50eHQgdGhhdCByZWNvcmRzIHRoZSBmaWx0ZXJzIGFzIHRoZSBiYXIgcmVhZHMgdGhlbS5cbiAgLy8gTGlzdHMgdXNlIHRoZWlyIHNhdmVkIGRlZmF1bHQgc29ydDsgYSBoZWFkZXIgY2xpY2sgaXMgY2FycmllZCBvbmx5IGJ5IGFcbiAgLy8gY29tcG9uZW50J3Mgb3duIENTViBleHBvcnQuIGB0aGlzUGFnZWAgbmFycm93cyBpdCB0byB0aGUgcGFnZSB0aGUgY2FudmFzIGlzXG4gIC8vIHNob3dpbmcuIFVubGlrZSB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0aGUgZmlsZXMgYXJlIHdyaXR0ZW5cbiAgLy8gc2VydmVyLXNpZGUsIHNvIHRoZXkgYXJlIG5vdCBjYXBwZWQgYnkgd2hhdCBhIHNsaWRlIGNhbiBob2xkLlxuICBwdWJsaWMgZXhwb3J0RGF0YSh0aGlzUGFnZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXNQYWdlID8gdGhpcy5fY2FudmFzPy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvclJlcG9ydChyZXBvcnQsIHBhZ2VJZCk7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgJ0V4cG9ydGluZyBkYXRhJyxcbiAgICAgIHRoaXMuX2NvbGxlY3Rvci5nZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChsaW5lcykgPT4gdGhpcy5fcmVwb3J0RGF0YS5leHBvcnRSZXBvcnQoXG4gICAgICAgICAgICByZXBvcnQuaWQsXG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgKSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIGVhY2ggY2hhdCB0dXJuIChmcy1jaGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QgKyBwZXJzaXN0ZW5jZSk7IHdlXG4gIC8vIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVwb3J0IHNpZGUgZWZmZWN0cyB0aGlzIGNvbnRleHQncyBiYWNrZW5kIGZsYWdzLlxuICBwdWJsaWMgb25DaGF0UmVzcG9uc2UocmVzcG9uc2U6IEZzQWlDaGF0UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICBpZiAocmVwb3J0SWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydFJlc3BvbnNlID0gcmVzcG9uc2UgYXMgRnNBaUNoYXRSZXNwb25zZSAmIFJlcG9ydENoYXRSZXNwb25zZTtcblxuICAgIC8vIEEgc3RydWN0dXJhbCBjaGFuZ2Ugb3IgYSByZW5hbWUgYm90aCByZS1mZXRjaCB0aGUgcmVwb3J0IChzZXNzaW9uIGZpbHRlclxuICAgIC8vIHZhbHVlcyBzdXJ2aXZlKTsgYSByZW5hbWUgYWRkaXRpb25hbGx5IG5vdGlmaWVzIHRoZSBob3N0IHNvIGl0IGNhblxuICAgIC8vIHJlZnJlc2ggYSBicmVhZGNydW1iIC8gdGl0bGUuXG4gICAgaWYgKHJlcG9ydFJlc3BvbnNlLnJlcG9ydENoYW5nZWQgfHwgcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgISFyZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHRoZSBkaXZpZGVyIGJldHdlZW4gdGhlIGNoYXQgYW5kIGNhbnZhcyBwYW5lcyAocG9pbnRlci1jYXB0dXJlIGxvb3BcbiAgLy8gb3V0c2lkZSBBbmd1bGFyKS5cbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5fcmVzaXplVG8oZS5jbGllbnRYKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICAgICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuIGFzIGEgY2hhdCB0dXJuIHNlbmRzIGl0LiBUaGUgY2FudmFzXG4gIC8vIHNlbGVjdGlvbiBjb3VudHMgb25seSBpbiBlZGl0IG1vZGU6IGl0IGlzIGRyYXduIG9ubHkgdGhlbiwgYW5kIGl0IGlzIGtlcHRcbiAgLy8gKG5vdCBjbGVhcmVkKSB3aGVuIGVkaXQgbW9kZSBpcyBsZWZ0LlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnVsYXJpdHk6IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpLFxuICAgICAgc2VsZWN0ZWRDb21wb25lbnRJZDogdGhpcy5lZGl0TW9kZSgpID8gdGhpcy5fY2FudmFzPy5zZWxlY3RlZENvbXBvbmVudElkKCkgPz8gbnVsbCA6IG51bGwsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3ZXJGaWx0ZXJzKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgaWQgc2l0dGluZyBpbiB0aGUgVVJMIHJpZ2h0IG5vdywgb3IgbnVsbCB3aGVuIGRlZXAgbGlua2luZyBpcyBvZmZcbiAgLy8gb3IgdGhlIHZhbHVlIGlzIG5vdCBhIHVzYWJsZSBpZC5cbiAgcHJpdmF0ZSBfcGFnZUlkRnJvbVVybCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAoIXBhcmFtKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBOdW1iZXIodGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQocGFyYW0pKTtcblxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFnZUlkKSAmJiBwYWdlSWQgPiAwID8gcGFnZUlkIDogbnVsbDtcbiAgfVxuXG4gIC8vIFdyaXRlcyB0aGUgb3BlbiBwYWdlIGFuZCB0aGUgdmlld2VyIHN0YXRlIGludG8gdGhlIFVSTCBpbiBvbmUgZ28uIE9ubHlcbiAgLy8gdGhlIGtleXMgdGhpcyB2aWV3IG93bnMgYXJlIHRvdWNoZWQgKCdtZXJnZScpLCBhbmQgcmVwbGFjZVVybCBrZWVwcyB0aGVcbiAgLy8gd3JpdGVzIG91dCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5OiBCYWNrIGxlYXZlcyB0aGUgcmVwb3J0IHJhdGhlciB0aGFuXG4gIC8vIHdhbGtpbmcgZXZlcnkgcGFnZSBhbmQgZmlsdGVyIHZpc2l0ZWQuXG4gIHByaXZhdGUgX3dyaXRlVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICAvLyBBIHJlcG9ydCBzdGlsbCBvbiBzY3JlZW4gd2hpbGUgdGhlIGhvc3QncyBuZXh0IG9uZSBsb2FkcyBtdXN0IG5vdCB3cml0ZVxuICAgIC8vIGl0cyBzdGF0ZSBvdmVyIHRoZSBuZXcgcmVwb3J0J3MgVVJMLlxuICAgIGlmICghcmVwb3J0IHx8IHJlcG9ydC5pZCAhPT0gdGhpcy5yZXBvcnRJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHRoaXMudXJsU3RhdGUoKVxuICAgICAgPyBidWlsZFJlcG9ydFVybFBhcmFtcyh0aGlzLl9maWx0ZXJTdGF0ZS51cmxTbmFwc2hvdChyZXBvcnQpLCB0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwKVxuICAgICAgOiB7fTtcblxuICAgIGNvbnN0IHBhZ2VQYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAocGFnZVBhcmFtICYmIHRoaXMuX3BhZ2VSZXBvcnRlZCkge1xuICAgICAgcXVlcnlQYXJhbXNbcGFnZVBhcmFtXSA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUsXG4gICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xuICAgICAgICAvLyBUaGUgVVJMIGlzIHJlYWQgb25jZSBwZXIgcmVwb3J0LCBvbiBpdHMgZmlyc3QgbG9hZDsgZXZlcnkgbGF0ZXIgbG9hZFxuICAgICAgICAvLyBrZWVwcyB0aGUgc3RhdGUgaW4gbWVtb3J5LlxuICAgICAgICBjb25zdCByZXN0b3JlID0gdGhpcy51cmxTdGF0ZSgpICYmIHJlcG9ydElkICE9PSB0aGlzLl9yZXN0b3JlZFJlcG9ydElkXG4gICAgICAgICAgPyByZWFkUmVwb3J0VXJsUGFyYW1zKHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXApXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLl9yZXN0b3JlZFJlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0LCByZXN0b3JlKTtcbiAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcblxuICAgICAgICBpZiAoZW1pdFJlbmFtZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbmFtZWQuZW1pdChyZXBvcnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cykuXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMucmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3JlcG9ydCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJylcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIGNvbmZpZyDigJQgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaXRlbXMgYW5kXG4gIC8vIHRoZW4gdGhlIGdyb3VwLWJ5IGNvbnRyb2wuXG4gIHByaXZhdGUgX2J1aWxkUmVwb3J0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQ/LmlkID8/IG51bGw7XG5cbiAgICAvLyBEcm9wIGEgZ3JhaW4gdGhlIGNvbnRyb2wgbm8gbG9uZ2VyIG9mZmVycyDigJQgdGhlIGFnZW50IGNhbiBuYXJyb3cgdGhlIGxpc3RcbiAgICAvLyBtaWQtc2Vzc2lvbiwgYW5kIGFuIG92ZXJyaWRlIHRoZSB2aWV3ZXIgY2FuJ3Qgc2VlIGlzIHdvcnNlIHRoYW4gbm9uZS5cbiAgICBpZiAocmVwb3J0ICYmICFpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcbiAgICAgID8gdGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpKSlcbiAgICAgIDogW107XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgY29udHJvbCBsZWFkcyB0aGUgYmFyLCBhaGVhZCBvZiBldmVyeSBmaWx0ZXI6IGl0IHNldHMgdGhlXG4gICAgLy8gZ3JhaW4gdGhlIHdob2xlIHJlcG9ydCBpcyByZWFkIGF0LCBzbyBpdCBpcyB0aGUgZmlyc3QgdGhpbmcgYSB2aWV3ZXJcbiAgICAvLyBkZWNpZGVzLiBJdCBpcyBub3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIGl0IHJlLWJ1Y2tldHMgcm93cyByYXRoZXIgdGhhblxuICAgIC8vIG5hcnJvd2luZyB0aGVtIOKAlCBzbyBpdCBpcyBwbGFjZWQgaGVyZSByYXRoZXIgdGhhbiBvcmRlcmVkIGFtb25nIHRoZW0uXG4gICAgY29uc3QgZ3JvdXBCeUl0ZW0gPSB0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICAgIGlmIChncm91cEJ5SXRlbSkge1xuICAgICAgaXRlbXMudW5zaGlmdChncm91cEJ5SXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXBvcnRGaWx0ZXJDb25maWcuc2V0KHtcbiAgICAgIC8vIGZzLWZpbHRlciBuZXZlciB0b3VjaGVzIHRoZSBVUkwgb3IgcGVyc2lzdHMgZmlsdGVyIHN0YXRlOiBpdHMga2V5cyBhcmVcbiAgICAgIC8vIG5vdCBuYW1lc3BhY2VkLCBpdCB3cml0ZXMgb3V0c2lkZSB0aGUgcm91dGVyLCBhbmQgaXQgd291bGQgZnJlZXplIGFcbiAgICAgIC8vIHJvbGxpbmcgcmFuZ2UgYXMgdHdvIGRhdGVzLiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Ugb3ducyB0aGUgdmFsdWVzLFxuICAgICAgLy8gYW5kIF93cml0ZVVybCBpcyB0aGUgb25lIHdyaXRlciBvZiB0aGUgVVJMLlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIGl0ZW1zLFxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IGdyb3VwSWQsIHZhbHVlIH0gb2YgZ3JvdXBWYWx1ZXNGcm9tUXVlcnkocXVlcnkgPz8ge30sIHRoaXMuX3JlcG9ydEdyb3VwcygpKSkge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSBncmFpbiBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgcXVlcnkuXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnk/LltHUk9VUF9CWV9JVEVNXSBhcyBDaGFydEdyYW51bGFyaXR5KSB8fCBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBhcyBhbiBmcy1maWx0ZXIgaXRlbSwgb3IgbnVsbCB3aGVuIHRoZSByZXBvcnRcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUl0ZW0oKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbShyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0IGZzLWNvbHVtblwiPlxuXG4gIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2hlYWRlciBmcy1yb3cuYWxpZ24tY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aXRsZSBmcy1mbGV4XCI+e3sgcmVwb3J0KCk/Lm5hbWUgfX08L2gyPlxuXG4gICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgPCEtLSBSZXBvcnQtbGV2ZWwgZmlsdGVycywgaW5saW5lIHdpdGggdGhlIHRvb2xiYXIgYWN0aW9ucy4gZnMtZmlsdGVyXG4gICAgICAgICAgIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZSBibG9jayBpc1xuICAgICAgICAgICByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMoKSkge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleSgpXTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj5cbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdC5cbiAgICAgICAgICAgT25lIHN0eWxlIGZvciBhbGwgdGhyZWUg4oCUIG91dGxpbmVkLCBpY29uIGFuZCB0ZXh0LiBcIkhlYWRlciAmIGZvb3RlclwiXG4gICAgICAgICAgIGlzIGEgdG9nZ2xlOiBpdCBrZWVwcyBpdHMgbGFiZWwgYW5kIHR1cm5zIGdyYXkgd2hpbGUgaXQgaXMgb24uIC0tPlxuICAgICAgQGlmIChlZGl0TW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2VkaXQtdG9vbHMgZnMtcm93LmFsaWduLWNlbnRlci5nYXAteHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBhIGJsb2NrIG9mIHRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgQWRkIHRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX21hc3RlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNYXN0ZXJNb2RlID8gJ0JhY2sgdG8gZWRpdGluZyB0aGlzIHBhZ2UnIDogJ0VkaXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHNob3duIG9uIGV2ZXJ5IHBhZ2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICBIZWFkZXIgJiBmb290ZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gVGhlIHpvbmUgZXZlcnkgZGF0ZSBpbiB0aGlzIHJlcG9ydCBpcyBmaWx0ZXJlZCBhbmQgZ3JvdXBlZCBpbiwgdGhlXG4gICAgICAgICAgIHNhbWUgZm9yIGV2ZXJ5IHZpZXdlci4gU2hvd24gb25seSB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgaXQ7IGEgY2xpY2tcbiAgICAgICAgICAgb3BlbnMgUmVwb3J0IHNldHRpbmdzLCB3aGVyZSBpdCBpcyBjaGFuZ2VkLiAtLT5cbiAgICAgIEBpZiAocmVwb3J0KCk/LmVmZmVjdGl2ZVRpbWV6b25lOyBhcyBlZmZlY3RpdmVUaW1lem9uZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aW1lem9uZVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInRGF0ZXMgYXJlIGZpbHRlcmVkIGFuZCBncm91cGVkIGluICcgKyBlZmZlY3RpdmVUaW1lem9uZSArICcgZm9yIGV2ZXJ5b25lLiBDaGFuZ2UgaXQgaW4gUmVwb3J0IHNldHRpbmdzLidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+c2NoZWR1bGU8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHRpbWV6b25lTGFiZWwoKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBPbmUgaWNvbiBmb3IgYm90aCBzdGF0ZXM6IGl0IHJlYWRzIGFzIHByZXNzZWQgd2hpbGUgZWRpdGluZyByYXRoZXJcbiAgICAgICAgICAgdGhhbiBzd2FwcGluZyB0byBzb21ldGhpbmcgZWxzZS4gLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3RvZ2dsZVwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJlZGl0TW9kZSgpID8gJ0RvbmUgZWRpdGluZycgOiAnRWRpdCBsYXlvdXQnXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiPlxuICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkX2N1c3RvbWl6ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJFeHBvcnRcIlxuICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIj5cbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGZzLW1lbnUgI2V4cG9ydE1lbnU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UG93ZXJwb2ludCgpXCI+XG4gICAgICAgICAgRXhwb3J0IFBvd2VyUG9pbnRcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQZGYoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQREZcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKClcIj5cbiAgICAgICAgICBFeHBvcnQgUmF3IERhdGFcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgQGlmICgocmVwb3J0KCk/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSh0cnVlKVwiPlxuICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhIChUaGlzIFBhZ2UpXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgPC9mcy1tZW51PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlJlcG9ydCBzZXR0aW5nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICAgI3NwbGl0XG4gICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fc3BsaXQgZnMtcm93LmFsaWduLXN0YXJ0XCI+XG4gICAgPGZzLWFpLWNoYXRcbiAgICAgICAgI2NoYXRQYW5lbFxuICAgICAgICBjbGFzcz1cImNoYXRcIlxuICAgICAgICBbYmFzZVBhdGhdPVwiYmFzZVBhdGgoKVwiXG4gICAgICAgIFtyZXF1ZXN0RGF0YV09XCJjaGF0UmVxdWVzdERhdGEoKVwiXG4gICAgICAgIFtyZWFkeV09XCJjaGF0UGFnZUlkKCkgIT09IG51bGxcIlxuICAgICAgICAocmVzcG9uc2UpPVwib25DaGF0UmVzcG9uc2UoJGV2ZW50KVwiPlxuICAgIDwvZnMtYWktY2hhdD5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZXNpemVyXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInZpZXdlciBmcy1mbGV4IGZzLWNvbHVtblwiPlxuICAgICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgICA8YXBwLXJlcG9ydC1jYW52YXNcbiAgICAgICAgICAgIFtyZXBvcnRdPVwicmVwb3J0KClcIlxuICAgICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlKClcIlxuICAgICAgICAgICAgW3BhZ2VJZF09XCJwYWdlSWQoKVwiXG4gICAgICAgICAgICAoY29tcG9uZW50U2V0dGluZ3MpPVwiY29tcG9uZW50U2V0dGluZ3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAocmVwb3J0Q2hhbmdlZCk9XCJvbkNhbnZhc1JlcG9ydENoYW5nZWQoKVwiXG4gICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwib25DYW52YXNQYWdlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvYXBwLXJlcG9ydC1jYW52YXM+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
554
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFnQixjQUFjLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FB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TyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7d0JBQ3hELHNFQUFzRTt3QkFDdEUsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztxQkFDdEcsV0FDUTt3QkFDUCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixxQkFBcUI7cUJBQ3RCO3dEQTZHTyxNQUFNO3NCQURiLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJNUIsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBTWxELE9BQU87c0JBRGQsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSwgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xuXG5pbXBvcnQgeyBGc0FpQ2hhdENvbXBvbmVudCwgRnNBaUNoYXREYXRhLCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xuXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0QWlDaGF0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWFpLWNoYXQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VGltZXpvbmVMYWJlbCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyU3RhdGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LCBSZXBvcnRDaGF0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwQnlGaWx0ZXJJdGVtLCBncm91cEJ5U2lnbmF0dXJlLCBncm91cFZhbHVlc0Zyb21RdWVyeSxcbiAgaXNHcmFudWxhcml0eU9mZmVyZWQsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgYnVpbGRSZXBvcnRVcmxQYXJhbXMsIHJlYWRSZXBvcnRVcmxQYXJhbXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtdXJsLXN0YXRlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSwgZGVmYXVsdFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gQSBzaW5nbGUgcmVwb3J0OiB0aGUgQUkgY2hhdCBvbiB0aGUgbGVmdCwgdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0LFxuLy8gdW5kZXIgYW4gSDIgdGl0bGUgKyBzZXR0aW5ncyBnZWFyLiBUaGUgaG9zdCBzdXBwbGllcyBbcmVwb3J0SWRdIChmcm9tIGl0c1xuLy8gcm91dGUpIGFuZCBzd2l0Y2hlcyByZXBvcnRzIHRocm91Z2ggaXRzIG93biByb3V0ZXMg4oCUIHRoaXMgY29tcG9uZW50IG5ldmVyXG4vLyBwaWNrcyBvbmUuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG4gIHByb3ZpZGVyczogW1xuICAgIC8vIFNlc3Npb24gZmlsdGVyIHN0YXRlIGlzIHBlci1vcGVuLXJlcG9ydCwgbm90IGFwcC1nbG9iYWw7IHRoZSBleHBvcnRcbiAgICAvLyBzZXJ2aWNlcyByZXNvbHZlIGZpbHRlcnMgdGhyb3VnaCBpdCwgc28gdGhleSBsaXZlIGF0IHRoZSBzYW1lIGxldmVsLlxuICAgIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlLFxuICAgIFJlcG9ydFBwdHhTZXJ2aWNlLFxuICAgIFJlcG9ydFBkZlNlcnZpY2UsXG4gICAgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0U2VydmljZSxcbiAgICAvLyBmcy1haS1jaGF0IHNpdHMgaW4gdGhpcyB0ZW1wbGF0ZSwgc28gaXQgcmVzb2x2ZXMgaXRzIGdhdGV3YXkgaGVyZTogdGhlXG4gICAgLy8gcmVwb3J0IG9uZSwgd2hpY2ggYWRkcyB0aGUgdmlld2VyJ3Mgc3RhdGUgdG8gZWFjaCB0dXJuIGl0IHNlbmRzLlxuICAgIFJlcG9ydEFpQ2hhdERhdGEsXG4gICAgeyBwcm92aWRlOiBGc0FpQ2hhdERhdGEsIHVzZUV4aXN0aW5nOiBSZXBvcnRBaUNoYXREYXRhIH0sXG4gICAgLy8gVHJlZS1zaGFrZW4gRUNoYXJ0cyBjb3JlICsgdGhlICdyZXBvcnQnIGhvdXNlIHRoZW1lLCBsb2FkZWQgbGF6aWx5LlxuICAgIHByb3ZpZGVFY2hhcnRzQ29yZSh7IGVjaGFydHM6ICgpID0+IGltcG9ydCgnLi4vLi4vdGhlbWUvZWNoYXJ0cycpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlLmRlZmF1bHQpIH0pLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNNZW51TW9kdWxlLFxuICAgIEZzQWlDaGF0Q29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgUmVwb3J0Q2FudmFzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0Q29tcG9uZW50IHtcblxuICAvLyBUaGUgcmVwb3J0IHRoaXMgdmlldyBpcyBmb2N1c2VkIG9uIOKAlCBzdXBwbGllZCBieSB0aGUgaG9zdCBmcm9tIHRoZSByb3V0ZS5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzICsgY2hhdCBlbmRwb2ludHM7IG92ZXJyaWRlIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIHJlYWRvbmx5IGJhc2VQYXRoID0gaW5wdXQ8c3RyaW5nPigncmVwb3J0cycpO1xuXG4gIC8vIFRoZSBxdWVyeSBwYXJhbSB0aGF0IGNhcnJpZXMgdGhlIG9wZW4gcGFnZSdzIGlkLiBEZWVwIGxpbmtpbmcgaXMgb24gYnlcbiAgLy8gZGVmYXVsdDsgYSBob3N0IHRoYXQgbW91bnRzIHNldmVyYWwgcmVwb3J0cyBvbiBvbmUgcm91dGUsIG9yIHdhbnRzIG5vIFVSTFxuICAvLyB3cml0ZXMgYXQgYWxsLCBzZXRzIHRoaXMgdG8gbnVsbCB0byB0dXJuIGl0IG9mZi5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcblxuICAvLyBXaGV0aGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBncm91cC1ieSBncmFpbiBhbmQgbGlzdCBzb3J0cyBsaXZlIGluIHRoZSBVUkxcbiAgLy8gKGc8Z3JvdXBJZD4sIGdyb3VwQnksIHM8Y29tcG9uZW50SWQ+OyBzZWUgcmVwb3J0LXVybC1zdGF0ZS50cyksIHNvIGFcbiAgLy8gcmVmcmVzaCBvciBhIHNoYXJlZCBsaW5rIG9wZW5zIHRoZSByZXBvcnQgYXMgaXQgd2FzIHNlZW4uIE9uIGJ5IGRlZmF1bHQ7IGFcbiAgLy8gaG9zdCB0aGF0IG1vdW50cyBzZXZlcmFsIHJlcG9ydHMgb24gb25lIHJvdXRlLCBvciB1c2VzIHF1ZXJ5IGtleXMgc2hhcGVkXG4gIC8vIGxpa2UgZzxuPiBvciBzPG4+IGl0c2VsZiwgdHVybnMgaXQgb2ZmLlxuICBwdWJsaWMgcmVhZG9ubHkgdXJsU3RhdGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyBkZWxldGVkIGZyb20gaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIGhvc3Qgcm91dGVzIGJhY2sgdG9cbiAgLy8gdGhlIGxpc3RpbmcuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVkID0gb3V0cHV0PFJlcG9ydD4oKTtcblxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gVGhpcyB2aWV3IHdyaXRlcyB0aGUgVVJMIGl0c2VsZiAocmlnaHRcbiAgLy8gYWZ0ZXIgdGhpcyBmaXJlcykg4oCUIHRoaXMgaXMgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3IgdGhlaXJcbiAgLy8gb3duIHJlYXNvbnMuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlQ2hhbmdlZCA9IG91dHB1dDxudW1iZXIgfCBudWxsPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvb2xiYXIncyB6b25lIGluZGljYXRvciAoJ05ldyBZb3JrIChFRFQpJyk6IHRoZSB6b25lIGV2ZXJ5IGRhdGUgaW5cbiAgLy8gdGhpcyByZXBvcnQgaXMgZmlsdGVyZWQgYW5kIGdyb3VwZWQgaW4uIEVtcHR5IHdoZW4gdGhlIHNlcnZlciBpcyB0b28gb2xkXG4gIC8vIHRvIHNlbmQgdGhlIGVmZmVjdGl2ZSB6b25lLCBhbmQgdGhlIGluZGljYXRvciBpcyBub3Qgc2hvd24uXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWV6b25lID0gdGhpcy5yZXBvcnQoKT8uZWZmZWN0aXZlVGltZXpvbmU7XG5cbiAgICByZXR1cm4gZWZmZWN0aXZlVGltZXpvbmUgPyBnZXRUaW1lem9uZUxhYmVsKGVmZmVjdGl2ZVRpbWV6b25lKSA6ICcnO1xuICB9KTtcblxuICAvLyBUaGUgcGFnZSB0aGUgY2FudmFzIHNob3VsZCBvcGVuIG9uLCByZWFkIGZyb20gdGhlIFVSTCBvbmNlIHBlciByZXBvcnQuXG4gIC8vIENsZWFyZWQgYXMgc29vbiBhcyB0aGUgY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYSBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2VcbiAgLy8gaXMgbmV2ZXIgZm91Z2h0IGJ5IGEgc3RhbGUgdmFsdWUuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cbiAgLy8gYmVsb25ncyB0byBleGFjdGx5IG9uZSBwYWdlLCBzbyB0aGlzIGJvdGggc2NvcGVzIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcbiAgLy8gW3JlcXVlc3REYXRhXSDigJQgY2hhbmdpbmcgaXQgaXMgd2hhdCByZWxvYWRzIHRoZSBwYW5lbCBvbnRvIHRoZSBuZXcgcGFnZSdzXG4gIC8vIGNvbnZlcnNhdGlvbnMuIE51bGwgdW50aWwgdGhlIGNhbnZhcyByZXBvcnRzIHdoaWNoIHBhZ2UgaXQgb3BlbmVkIG9uLCB3aGljaFxuICAvLyBrZWVwcyB0aGUgY2hhdCBmcm9tIGxpc3RpbmcgYWdhaW5zdCBhIHBhZ2UgZ3Vlc3MuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFdoYXQgdGhlIGNoYXQgc2VuZHMgd2l0aCBldmVyeSBjb252ZXJzYXRpb24gY2FsbDogdGhlIHJlcG9ydCwgYW5kIHRoZSBwYWdlXG4gIC8vIGl0IGlzIGJvdW5kIHRvLlxuICAvL1xuICAvLyByZXBvcnRQYWdlSWQgaXMgT01JVFRFRCwgbm90IHNlbnQgYXMgbnVsbCwgd2hpbGUgdGhlIG9wZW4gcGFnZSBpcyB1bmtub3duLlxuICAvLyBUaGUgYmFja2VuZCByZWFkcyBhIFBSRVNFTlQgcmVwb3J0UGFnZUlkIG9mIDAvbnVsbCBhcyBcInRoZSByZXBvcnQncyBlYXJsaWVyLFxuICAvLyBwYWdlLWxlc3MgY29udmVyc2F0aW9uc1wiLCBzbyBzZW5kaW5nIG51bGwgYmVmb3JlIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIGluXG4gIC8vIHdvdWxkIGFzayBmb3IgdGhlIHdyb25nIGxpc3Qg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGJpbmQgYSBjb252ZXJzYXRpb24gc3RhcnRlZFxuICAvLyBpbiB0aGF0IHdpbmRvdyB0byBubyBwYWdlIGF0IGFsbC5cbiAgLy9cbiAgLy8gVGhlIGNoYXQgaXMgYWxzbyBoZWxkIGNsb3NlZCAoW3JlYWR5XSBpbiB0aGUgdGVtcGxhdGUpIHVudGlsIHRoZSBwYWdlIGlzXG4gIC8vIGtub3duLCBzbyB0aGlzIHBhcnRpYWwgY29udGV4dCBpcyBuZXZlciBhY3R1YWxseSBzZW50OiBvbiBhIGZyZXNoIGxvYWQgdGhlXG4gIC8vIHJlcG9ydCBoYXMgdG8gYXJyaXZlIGFuZCB0aGUgY2FudmFzIGhhcyB0byByZW5kZXIgYmVmb3JlIGFueSBwYWdlIGV4aXN0cyxcbiAgLy8gYW5kIGEgbGlzdCBmZXRjaGVkIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIHRoZSB3aG9sZSByZXBvcnQncyBjb252ZXJzYXRpb25zXG4gIC8vIOKAlCB0aGUgdW5zY29wZWQgbGlzdCwgc2hvd24gYW5kIGF1dG8tc2VsZWN0ZWQgYmVmb3JlIHRoZSByZWFsIG9uZSBsYW5kcy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRSZXF1ZXN0RGF0YSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0UGFnZUlkID0gdGhpcy5jaGF0UGFnZUlkKCk7XG5cbiAgICByZXR1cm4gcmVwb3J0UGFnZUlkID09PSBudWxsXG4gICAgICA/IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSB9XG4gICAgICA6IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSwgcmVwb3J0UGFnZUlkIH07XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxuICAvLyByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpIGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJDb25maWcgPSBzaWduYWw8RmlsdGVyQ29uZmlnIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH0pO1xuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxuICAvLyByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRoZSBlZmZlY3RpdmUgem9uZSBpcyBwYXJ0IG9mIGl0IHRvbzogYSB6b25lIGNoYW5nZSByZS1yZXNvbHZlcyByZWxhdGl2ZVxuICAgICAgLy8gcHJlc2V0cywgYW5kIHRoZSBiYXIgbXVzdCBiZSByZWNyZWF0ZWQgdG8gc2hvdyB0aGUgbmV3IGRheXMuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XG4gICAgICAvLyBzZXR0aW5ncyByZWJ1aWxkcyB0aGUgY29uZmlnLCBidXQgd2l0aG91dCBhIGtleSBjaGFuZ2UgZnMtZmlsdGVyIGtlZXBzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQoKSksXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfSk7XG5cbiAgQFZpZXdDaGlsZCgnc3BsaXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF9zcGxpdCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXRQYW5lbCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgX2NoYXRQYW5lbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE9ubHkgdGhlIGNhbnZhcyBrbm93cyB3aGljaCBwYWdlIGlzIG9uIHNjcmVlbiwgYW5kIGEgcGFnZS1zY29wZWQgZXhwb3J0XG4gIC8vIGhhcyB0byBhc2sgaXQuXG4gIEBWaWV3Q2hpbGQoUmVwb3J0Q2FudmFzQ29tcG9uZW50KVxuICBwcml2YXRlIF9jYW52YXM/OiBSZXBvcnRDYW52YXNDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcmVwb3J0QWlDaGF0RGF0YSA9IGluamVjdChSZXBvcnRBaUNoYXREYXRhKTtcbiAgcHJpdmF0ZSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZXhwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wcm9jZXNzID0gaW5qZWN0KEZzUHJvY2Vzcyk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLy8gVGhlIHJlcG9ydCB3aG9zZSBVUkwgc3RhdGUgaGFzIGJlZW4gcmVhZC4gVGhlIFVSTCBpcyByZWFkIG9ubHkgb24gYVxuICAvLyByZXBvcnQncyBmaXJzdCBsb2FkOyBhIHJlbG9hZCBhZnRlciBhIGNoYXQgb3IgZGlhbG9nIGVkaXQga2VlcHMgdGhlIHN0YXRlXG4gIC8vIGluIG1lbW9yeSwgd2hpY2ggaXMgbmV3ZXIgdGhhbiBhbnl0aGluZyB0aGUgVVJMIGhvbGRzLlxuICBwcml2YXRlIF9yZXN0b3JlZFJlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIHRoZSBvcGVuIHBhZ2UgZm9yIHRoaXMgcmVwb3J0LiBVbnRpbCBpdFxuICAvLyBoYXMsIHRoZSBwYWdlIHBhcmFtIGluIHRoZSBVUkwgaXMgdGhlIGRlZXAgbGluayBzdGlsbCBiZWluZyBob25vcmVkLCBhbmRcbiAgLy8gdGhlIFVSTCB3cml0ZXIgbGVhdmVzIGl0IGFsb25lLlxuICBwcml2YXRlIF9wYWdlUmVwb3J0ZWQgPSBmYWxzZTtcblxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gTWVyZ2VkIGludG8gdGhlIHNpbmdsZSBVUkwgd3JpdGVyLlxuICBwcml2YXRlIF9wYWdlV3JpdGUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFYWNoIGNoYXQgdHVybiBjYXJyaWVzIHdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuLiBPbmx5IHRoZSBmdW5jdGlvblxuICAgIC8vIGlzIHNldCBoZXJlOyBpdCBpcyBjYWxsZWQgd2hlbiBhIHR1cm4gaXMgc2VudC5cbiAgICB0aGlzLl9yZXBvcnRBaUNoYXREYXRhLnR1cm5EYXRhID0gKCkgPT4gKHsgdmlld2VyU3RhdGU6IHRoaXMuX2NoYXRWaWV3ZXJTdGF0ZSgpIH0pO1xuXG4gICAgLy8gVGhlIE9ORSB3cml0ZXIgb2YgdGhpcyB2aWV3J3MgcXVlcnkgcGFyYW1zLiBQYWdlIG1vdmVzIGFuZCB2aWV3ZXItc3RhdGVcbiAgICAvLyBjaGFuZ2VzIGJvdGggZnVubmVsIGhlcmUsIGFuZCBhdWRpdFRpbWUoMCkgZm9sZHMgYSBidXJzdCAoYSBiYXIgcmUtc2V0c1xuICAgIC8vIGV2ZXJ5IGdyb3VwIGl0IHNob3dzKSBpbnRvIGEgc2luZ2xlIHdyaXRlLiBFdmVyeSB3cml0ZSBjYXJyaWVzIHRoZSB3aG9sZVxuICAgIC8vIHN0YXRlLCBzbyBhIHdyaXRlIHRoYXQgc3VwZXJzZWRlcyBhbm90aGVyIGxvc2VzIG5vdGhpbmcuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUudXJsQ2hhbmdlcygpLCB0aGlzLl9wYWdlV3JpdGUkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGF1ZGl0VGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3dyaXRlVXJsKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG5cbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcblxuICAgICAgLy8gU2VlZCB0aGUgb3BlbiBwYWdlIGZyb20gdGhlIFVSTCBmb3IgdGhpcyByZXBvcnQuIFJlYWQgcGVyIGxvYWQgcmF0aGVyXG4gICAgICAvLyB0aGFuIG9uY2UgYXQgY29uc3RydWN0aW9uOiB0aGUgaG9zdCBtYXkgc3dhcCByZXBvcnRzIG9uIHRoZSBzYW1lIHJvdXRlLFxuICAgICAgLy8gYW5kIGVhY2ggYXJyaXZhbCBjYXJyaWVzIGl0cyBvd24gP3BhZ2U9LlxuICAgICAgY29uc3QgcGFnZUlkID0gdGhpcy5fcGFnZUlkRnJvbVVybCgpO1xuXG4gICAgICAvLyBPbmx5IHRoZSByZXBvcnQgaWQgYW5kIHRoZSBwYWdlIHBhcmFtIHJlLXJ1biB0aGlzLiBUaGUgdmlldyBzdGF0ZSBiZWxvd1xuICAgICAgLy8gaXMgd3JpdHRlbiBoZXJlIGFuZCByZWFkIGJ5IHRoZSBjb25maWcgYnVpbGQsIHNvIGl0IHN0YXlzIHVudHJhY2tlZC5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdE1vZGUuc2V0KGZhbHNlKTtcblxuICAgICAgICAvLyBBIG5ldyByZXBvcnQncyBwYWdlcyBhcmUgbm90IHRoaXMgcmVwb3J0J3MgcGFnZXMg4oCUIGRyb3AgdGhlIGJpbmRpbmdcbiAgICAgICAgLy8gdW50aWwgaXRzIGNhbnZhcyBzYXlzIHdoaWNoIHBhZ2UgaXQgbGFuZGVkIG9uLlxuICAgICAgICB0aGlzLmNoYXRQYWdlSWQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAgICAgdGhpcy5fcGFnZVJlcG9ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJlcG9ydElkICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3JnZXQgdGhlIHJlc3RvcmVkIHJlcG9ydCwgc28gYSBob3N0IHRoYXQgY29tZXMgYmFjayB0byBpdCByZWFkc1xuICAgICAgICAgIC8vIHRoZSBVUkwgYWdhaW4uXG4gICAgICAgICAgdGhpcy5fcmVzdG9yZWRSZXBvcnRJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRNb2RlLnVwZGF0ZSgoZWRpdE1vZGUpID0+ICFlZGl0TW9kZSk7XG4gIH1cblxuICAvLyBUaGUgZWRpdCB0b29scyBsaXZlIGluIHRoaXMgdG9vbGJhciwgYnV0IHRoZSBjYW52YXMgb3ducyB3aGF0IHRoZXkgYWN0IG9uXG4gIC8vICh0aGUgYWN0aXZlIHBhZ2UsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRzLCB3aGljaCBsYXllciBpcyBsaXZlKS5cbiAgcHVibGljIGdldCBpc01hc3Rlck1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbnZhcz8ubWFzdGVyTW9kZSgpID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFkZFRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy5hZGRUZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWFzdGVyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXM/LnRvZ2dsZU1hc3Rlck1vZGUoKTtcbiAgfVxuXG4gIC8vIFJlcG9ydCBzZXR0aW5ncyDigJQgbmFtZSwgcGFnZSBzaXplLCBkZWxldGUuIFRoZVxuICAvLyBkaWFsb2cgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGY7IHdlIHJlYWN0IHRvIHdoYXQgaXQgcmVwb3J0cyBiYWNrLlxuICBwdWJsaWMgcmVwb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0LmlkO1xuXG4gICAgdGhpcy5fZGlhbG9nLm9wZW48UmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIFJlcG9ydFNldHRpbmdzUmVzdWx0PihSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyByZXBvcnQgfSxcbiAgICAgIHdpZHRoOiAnNDYwcHgnLFxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVkLmVtaXQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzIOKAlCB0aXRsZSwgZXhhY3QgZ2VvbWV0cnksIGFuZCB0aGUgZGlhZ25vc3RpYyB2aWV3c1xuICAvLyAoU1FMLCBjb25maWcsIGZpbHRlciB3aXJpbmcpLlxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnRNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdD4oXG4gICAgICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgZGF0YTogeyByZXBvcnQsIGNvbXBvbmVudCB9LFxuICAgICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhZGQvcmVtb3ZlL2xldmVsIGNoYW5nZXMgcGVyc2lzdCBpbW1lZGlhdGVseSBpbnNpZGUgdGhlIGRpYWxvZyAobm9cbiAgICAvLyBcInNhdmVcIikgYW5kIGNhbiBsZWF2ZSBpdCBieSBhbiBleGl0IHRoYXQgY2FycmllcyBubyByZXN1bHQsIHNvIHRoZXkgYXJlXG4gICAgLy8gYW5ub3VuY2VkIGFzIHRoZXkgbGFuZC4gVGhlIHJlbG9hZCB3YWl0cyBmb3IgdGhlIGNsb3NlIHNvIHRoZSBjYW52YXMgaXNuJ3RcbiAgICAvLyByZS1yZW5kZXJpbmcgdW5kZXJuZWF0aCBhbiBvcGVuIGRpYWxvZy5cbiAgICBsZXQgZmlsdGVyc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZmlsdGVyc0NoYW5nZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGZpbHRlcnNDaGFuZ2VkID0gdHJ1ZSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIFRoZSBkaWFsb2cgY29uZmlybXMgKyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZi4gVGhlIGNvbXBvbmVudCBpc1xuICAgICAgICAvLyBnb25lIGZyb20gdGhlIHJlcG9ydCwgc28gcmVsb2FkIHJhdGhlciB0aGFuIHBhdGNoaW5nIGl0IG91dCBsb2NhbGx5IOKAlFxuICAgICAgICAvLyBpdHMgZmlsdGVycyB3ZW50IHdpdGggaXQsIHdoaWNoIHRoZSByZXBvcnQgYmFyIGhhcyB0byBiZSByZWJ1aWx0IGZvci5cbiAgICAgICAgaWYgKHJlc3VsdD8uZGVsZXRlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcG9ydCdzIGZpbHRlciBncm91cHMgY2hhbmdlZCwgc28gdGhlIHJlcG9ydCBiYXIgYW5kIHRoZVxuICAgICAgICAvLyBvbi1jb21wb25lbnQgc3RyaXBzIGhhdmUgdG8gYmUgcmVidWlsdCBmcm9tIGEgZnJlc2ggcmVwb3J0LlxuICAgICAgICBpZiAoZmlsdGVyc0NoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgZWxzZSBpbiB0aGUgZGlhbG9nIHRvdWNoZXMgdGhlIHF1ZXJ5IOKAlCB0aXRsZSBhbmQgcGFkZGluZyBhcmVcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLiBSZXBhaW50IHRoZSBvbmUgY29tcG9uZW50IGl0IHdhcyBvcGVuZWQgZm9yIGFuZCBsZWF2ZVxuICAgICAgICAvLyBldmVyeSBvdGhlciBjb21wb25lbnQncyBkYXRhLCBhbmQgaXRzIHF1ZXJ5LCBhbG9uZS5cbiAgICAgICAgaWYgKHJlc3VsdD8uc2V0dGluZ3MpIHtcbiAgICAgICAgICB0aGlzLl9jYW52YXM/LmFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50LmlkLCByZXN1bHQuc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgbW92ZWQgdG8gYW5vdGhlciBwYWdlOiByZWZsZWN0IGl0IGluIHRoZSBVUkwgc28gYSByZWZyZXNoIG9yIGFcbiAgLy8gc2hhcmVkIGxpbmsgY29tZXMgYmFjayBoZXJlICh0aGUgd3JpdGUgaXRzZWxmIGlzIF93cml0ZVVybCdzKS5cbiAgcHVibGljIG9uQ2FudmFzUGFnZUNoYW5nZWQocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gVGhlIGRlZXAgbGluayBoYXMgYmVlbiBjb25zdW1lZDsgZnJvbSBoZXJlIHRoZSBjYW52YXMgb3ducyB0aGUgcGFnZS5cbiAgICB0aGlzLnBhZ2VJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGF0UGFnZUlkLnNldChwYWdlSWQpO1xuICAgIHRoaXMuX3BhZ2VSZXBvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2VJZCk7XG4gICAgdGhpcy5fcGFnZVdyaXRlJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSAoYWRkZWQgYSBwYWdlKSDigJQgcmUtZmV0Y2ggc28gdGhlXG4gIC8vIG5ldyBwYWdlIHJlbmRlcnM7IHRoZSBjYW52YXMgbGFuZHMgdGhlIHZpZXcgb24gaXQuXG4gIHB1YmxpYyBvbkNhbnZhc1JlcG9ydENoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG5hdGl2ZSBlZGl0YWJsZVxuICAvLyBjaGFydHM7IHBhZ2UgPSBzbGlkZSkuIFRoZSBkb2NrIHNob3dzIHByb2dyZXNzIHVudGlsIHRoZSBmaWxlIHNhdmVzLlxuICBwdWJsaWMgZXhwb3J0UG93ZXJwb2ludCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBvd2VyUG9pbnQnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0byBQREYsIGVudGlyZWx5IGNsaWVudC1zaWRlIChvZmZzY3JlZW4gRUNoYXJ0cyBhdCAzw5c7IHBhZ2UgPSBQREYgcGFnZSkuXG4gIHB1YmxpYyBleHBvcnRQZGYoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHdob2xlIHJlcG9ydCBhcyBmaWxlcyBpbiBvbmUgYWN0aW9uOiB0aGUgc2VydmVyIHdyaXRlcyBvbmUgQ1NWIHBlclxuICAvLyBjb21wb25lbnQsIGVhY2ggd2hhdCB0aGUgc2NyZWVuIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyBkcmF3biwgYXQgdGhlXG4gIC8vIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluOyBhIGxpc3QgaW4gZnVsbCksIGFuZCB6aXBzIHRoZW0gZm9sZGVyZWQgYnkgcGFnZVxuICAvLyB3aXRoIGFuIEV4cG9ydCBOb3Rlcy50eHQgdGhhdCByZWNvcmRzIHRoZSBmaWx0ZXJzIGFzIHRoZSBiYXIgcmVhZHMgdGhlbS5cbiAgLy8gTGlzdHMgdXNlIHRoZWlyIHNhdmVkIGRlZmF1bHQgc29ydDsgYSBoZWFkZXIgY2xpY2sgaXMgY2FycmllZCBvbmx5IGJ5IGFcbiAgLy8gY29tcG9uZW50J3Mgb3duIENTViBleHBvcnQuIGB0aGlzUGFnZWAgbmFycm93cyBpdCB0byB0aGUgcGFnZSB0aGUgY2FudmFzIGlzXG4gIC8vIHNob3dpbmcuIFVubGlrZSB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0aGUgZmlsZXMgYXJlIHdyaXR0ZW5cbiAgLy8gc2VydmVyLXNpZGUsIHNvIHRoZXkgYXJlIG5vdCBjYXBwZWQgYnkgd2hhdCBhIHNsaWRlIGNhbiBob2xkLlxuICBwdWJsaWMgZXhwb3J0RGF0YSh0aGlzUGFnZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXNQYWdlID8gdGhpcy5fY2FudmFzPy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvclJlcG9ydChyZXBvcnQsIHBhZ2VJZCk7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgJ0V4cG9ydGluZyBkYXRhJyxcbiAgICAgIHRoaXMuX2NvbGxlY3Rvci5nZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChsaW5lcykgPT4gdGhpcy5fcmVwb3J0RGF0YS5leHBvcnRSZXBvcnQoXG4gICAgICAgICAgICByZXBvcnQuaWQsXG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgKSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIGVhY2ggY2hhdCB0dXJuIChmcy1jaGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QgKyBwZXJzaXN0ZW5jZSk7IHdlXG4gIC8vIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVwb3J0IHNpZGUgZWZmZWN0cyB0aGlzIGNvbnRleHQncyBiYWNrZW5kIGZsYWdzLlxuICBwdWJsaWMgb25DaGF0UmVzcG9uc2UocmVzcG9uc2U6IEZzQWlDaGF0UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICBpZiAocmVwb3J0SWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydFJlc3BvbnNlID0gcmVzcG9uc2UgYXMgRnNBaUNoYXRSZXNwb25zZSAmIFJlcG9ydENoYXRSZXNwb25zZTtcblxuICAgIC8vIEEgc3RydWN0dXJhbCBjaGFuZ2Ugb3IgYSByZW5hbWUgYm90aCByZS1mZXRjaCB0aGUgcmVwb3J0IChzZXNzaW9uIGZpbHRlclxuICAgIC8vIHZhbHVlcyBzdXJ2aXZlKTsgYSByZW5hbWUgYWRkaXRpb25hbGx5IG5vdGlmaWVzIHRoZSBob3N0IHNvIGl0IGNhblxuICAgIC8vIHJlZnJlc2ggYSBicmVhZGNydW1iIC8gdGl0bGUuXG4gICAgaWYgKHJlcG9ydFJlc3BvbnNlLnJlcG9ydENoYW5nZWQgfHwgcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgISFyZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHRoZSBkaXZpZGVyIGJldHdlZW4gdGhlIGNoYXQgYW5kIGNhbnZhcyBwYW5lcyAocG9pbnRlci1jYXB0dXJlIGxvb3BcbiAgLy8gb3V0c2lkZSBBbmd1bGFyKS5cbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5fcmVzaXplVG8oZS5jbGllbnRYKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICAgICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuIGFzIGEgY2hhdCB0dXJuIHNlbmRzIGl0LiBUaGUgY2FudmFzXG4gIC8vIHNlbGVjdGlvbiBjb3VudHMgb25seSBpbiBlZGl0IG1vZGU6IGl0IGlzIGRyYXduIG9ubHkgdGhlbiwgYW5kIGl0IGlzIGtlcHRcbiAgLy8gKG5vdCBjbGVhcmVkKSB3aGVuIGVkaXQgbW9kZSBpcyBsZWZ0LlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnVsYXJpdHk6IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpLFxuICAgICAgc2VsZWN0ZWRDb21wb25lbnRJZDogdGhpcy5lZGl0TW9kZSgpID8gdGhpcy5fY2FudmFzPy5zZWxlY3RlZENvbXBvbmVudElkKCkgPz8gbnVsbCA6IG51bGwsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3ZXJGaWx0ZXJzKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgaWQgc2l0dGluZyBpbiB0aGUgVVJMIHJpZ2h0IG5vdywgb3IgbnVsbCB3aGVuIGRlZXAgbGlua2luZyBpcyBvZmZcbiAgLy8gb3IgdGhlIHZhbHVlIGlzIG5vdCBhIHVzYWJsZSBpZC5cbiAgcHJpdmF0ZSBfcGFnZUlkRnJvbVVybCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAoIXBhcmFtKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBOdW1iZXIodGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQocGFyYW0pKTtcblxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFnZUlkKSAmJiBwYWdlSWQgPiAwID8gcGFnZUlkIDogbnVsbDtcbiAgfVxuXG4gIC8vIFdyaXRlcyB0aGUgb3BlbiBwYWdlIGFuZCB0aGUgdmlld2VyIHN0YXRlIGludG8gdGhlIFVSTCBpbiBvbmUgZ28uIE9ubHlcbiAgLy8gdGhlIGtleXMgdGhpcyB2aWV3IG93bnMgYXJlIHRvdWNoZWQgKCdtZXJnZScpLCBhbmQgcmVwbGFjZVVybCBrZWVwcyB0aGVcbiAgLy8gd3JpdGVzIG91dCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5OiBCYWNrIGxlYXZlcyB0aGUgcmVwb3J0IHJhdGhlciB0aGFuXG4gIC8vIHdhbGtpbmcgZXZlcnkgcGFnZSBhbmQgZmlsdGVyIHZpc2l0ZWQuXG4gIHByaXZhdGUgX3dyaXRlVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICAvLyBBIHJlcG9ydCBzdGlsbCBvbiBzY3JlZW4gd2hpbGUgdGhlIGhvc3QncyBuZXh0IG9uZSBsb2FkcyBtdXN0IG5vdCB3cml0ZVxuICAgIC8vIGl0cyBzdGF0ZSBvdmVyIHRoZSBuZXcgcmVwb3J0J3MgVVJMLlxuICAgIGlmICghcmVwb3J0IHx8IHJlcG9ydC5pZCAhPT0gdGhpcy5yZXBvcnRJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHRoaXMudXJsU3RhdGUoKVxuICAgICAgPyBidWlsZFJlcG9ydFVybFBhcmFtcyh0aGlzLl9maWx0ZXJTdGF0ZS51cmxTbmFwc2hvdChyZXBvcnQpLCB0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwKVxuICAgICAgOiB7fTtcblxuICAgIGNvbnN0IHBhZ2VQYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAocGFnZVBhcmFtICYmIHRoaXMuX3BhZ2VSZXBvcnRlZCkge1xuICAgICAgcXVlcnlQYXJhbXNbcGFnZVBhcmFtXSA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUsXG4gICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xuICAgICAgICAvLyBUaGUgVVJMIGlzIHJlYWQgb25jZSBwZXIgcmVwb3J0LCBvbiBpdHMgZmlyc3QgbG9hZDsgZXZlcnkgbGF0ZXIgbG9hZFxuICAgICAgICAvLyBrZWVwcyB0aGUgc3RhdGUgaW4gbWVtb3J5LlxuICAgICAgICBjb25zdCByZXN0b3JlID0gdGhpcy51cmxTdGF0ZSgpICYmIHJlcG9ydElkICE9PSB0aGlzLl9yZXN0b3JlZFJlcG9ydElkXG4gICAgICAgICAgPyByZWFkUmVwb3J0VXJsUGFyYW1zKHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXApXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLl9yZXN0b3JlZFJlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0LCByZXN0b3JlKTtcbiAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcblxuICAgICAgICBpZiAoZW1pdFJlbmFtZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbmFtZWQuZW1pdChyZXBvcnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cykuXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMucmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3JlcG9ydCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJylcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIGNvbmZpZyDigJQgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaXRlbXMgYW5kXG4gIC8vIHRoZW4gdGhlIGdyb3VwLWJ5IGNvbnRyb2wuXG4gIHByaXZhdGUgX2J1aWxkUmVwb3J0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQ/LmlkID8/IG51bGw7XG5cbiAgICAvLyBEcm9wIGEgZ3JhaW4gdGhlIGNvbnRyb2wgbm8gbG9uZ2VyIG9mZmVycyDigJQgdGhlIGFnZW50IGNhbiBuYXJyb3cgdGhlIGxpc3RcbiAgICAvLyBtaWQtc2Vzc2lvbiwgYW5kIGFuIG92ZXJyaWRlIHRoZSB2aWV3ZXIgY2FuJ3Qgc2VlIGlzIHdvcnNlIHRoYW4gbm9uZS5cbiAgICBpZiAocmVwb3J0ICYmICFpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcbiAgICAgID8gdGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpKSlcbiAgICAgIDogW107XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgY29udHJvbCBsZWFkcyB0aGUgYmFyLCBhaGVhZCBvZiBldmVyeSBmaWx0ZXI6IGl0IHNldHMgdGhlXG4gICAgLy8gZ3JhaW4gdGhlIHdob2xlIHJlcG9ydCBpcyByZWFkIGF0LCBzbyBpdCBpcyB0aGUgZmlyc3QgdGhpbmcgYSB2aWV3ZXJcbiAgICAvLyBkZWNpZGVzLiBJdCBpcyBub3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIGl0IHJlLWJ1Y2tldHMgcm93cyByYXRoZXIgdGhhblxuICAgIC8vIG5hcnJvd2luZyB0aGVtIOKAlCBzbyBpdCBpcyBwbGFjZWQgaGVyZSByYXRoZXIgdGhhbiBvcmRlcmVkIGFtb25nIHRoZW0uXG4gICAgY29uc3QgZ3JvdXBCeUl0ZW0gPSB0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICAgIGlmIChncm91cEJ5SXRlbSkge1xuICAgICAgaXRlbXMudW5zaGlmdChncm91cEJ5SXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXBvcnRGaWx0ZXJDb25maWcuc2V0KHtcbiAgICAgIC8vIGZzLWZpbHRlciBuZXZlciB0b3VjaGVzIHRoZSBVUkwgb3IgcGVyc2lzdHMgZmlsdGVyIHN0YXRlOiBpdHMga2V5cyBhcmVcbiAgICAgIC8vIG5vdCBuYW1lc3BhY2VkLCBpdCB3cml0ZXMgb3V0c2lkZSB0aGUgcm91dGVyLCBhbmQgaXQgd291bGQgZnJlZXplIGFcbiAgICAgIC8vIHJvbGxpbmcgcmFuZ2UgYXMgdHdvIGRhdGVzLiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Ugb3ducyB0aGUgdmFsdWVzLFxuICAgICAgLy8gYW5kIF93cml0ZVVybCBpcyB0aGUgb25lIHdyaXRlciBvZiB0aGUgVVJMLlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIGl0ZW1zLFxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IGdyb3VwSWQsIHZhbHVlIH0gb2YgZ3JvdXBWYWx1ZXNGcm9tUXVlcnkocXVlcnkgPz8ge30sIHRoaXMuX3JlcG9ydEdyb3VwcygpKSkge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSBncmFpbiBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgcXVlcnkuXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnk/LltHUk9VUF9CWV9JVEVNXSBhcyBDaGFydEdyYW51bGFyaXR5KSB8fCBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBhcyBhbiBmcy1maWx0ZXIgaXRlbSwgb3IgbnVsbCB3aGVuIHRoZSByZXBvcnRcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUl0ZW0oKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbShyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0IGZzLWNvbHVtblwiPlxuXG4gIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2hlYWRlciBmcy1yb3cuYWxpZ24tY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aXRsZSBmcy1mbGV4XCI+e3sgcmVwb3J0KCk/Lm5hbWUgfX08L2gyPlxuXG4gICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgPCEtLSBSZXBvcnQtbGV2ZWwgZmlsdGVycywgaW5saW5lIHdpdGggdGhlIHRvb2xiYXIgYWN0aW9ucy4gZnMtZmlsdGVyXG4gICAgICAgICAgIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZSBibG9jayBpc1xuICAgICAgICAgICByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMoKSkge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleSgpXTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj5cbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdC5cbiAgICAgICAgICAgT25lIHN0eWxlIGZvciBhbGwgdGhyZWUg4oCUIG91dGxpbmVkLCBpY29uIGFuZCB0ZXh0LiBcIkhlYWRlciAmIGZvb3RlclwiXG4gICAgICAgICAgIGlzIGEgdG9nZ2xlOiBpdCBrZWVwcyBpdHMgbGFiZWwgYW5kIHR1cm5zIGdyYXkgd2hpbGUgaXQgaXMgb24uIC0tPlxuICAgICAgQGlmIChlZGl0TW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2VkaXQtdG9vbHMgZnMtcm93LmFsaWduLWNlbnRlci5nYXAteHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBhIGJsb2NrIG9mIHRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgQWRkIHRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX21hc3RlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNYXN0ZXJNb2RlID8gJ0JhY2sgdG8gZWRpdGluZyB0aGlzIHBhZ2UnIDogJ0VkaXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHNob3duIG9uIGV2ZXJ5IHBhZ2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICBIZWFkZXIgJiBmb290ZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gVGhlIHpvbmUgZXZlcnkgZGF0ZSBpbiB0aGlzIHJlcG9ydCBpcyBmaWx0ZXJlZCBhbmQgZ3JvdXBlZCBpbiwgdGhlXG4gICAgICAgICAgIHNhbWUgZm9yIGV2ZXJ5IHZpZXdlci4gU2hvd24gb25seSB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgaXQ7IGEgY2xpY2tcbiAgICAgICAgICAgb3BlbnMgUmVwb3J0IHNldHRpbmdzLCB3aGVyZSBpdCBpcyBjaGFuZ2VkLiAtLT5cbiAgICAgIEBpZiAocmVwb3J0KCk/LmVmZmVjdGl2ZVRpbWV6b25lOyBhcyBlZmZlY3RpdmVUaW1lem9uZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aW1lem9uZVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInRGF0ZXMgYXJlIGZpbHRlcmVkIGFuZCBncm91cGVkIGluICcgKyBlZmZlY3RpdmVUaW1lem9uZSArICcgZm9yIGV2ZXJ5b25lLiBDaGFuZ2UgaXQgaW4gUmVwb3J0IHNldHRpbmdzLidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+c2NoZWR1bGU8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHRpbWV6b25lTGFiZWwoKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBPbmUgaWNvbiBmb3IgYm90aCBzdGF0ZXM6IGl0IHJlYWRzIGFzIHByZXNzZWQgd2hpbGUgZWRpdGluZyByYXRoZXJcbiAgICAgICAgICAgdGhhbiBzd2FwcGluZyB0byBzb21ldGhpbmcgZWxzZS4gLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3RvZ2dsZVwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJlZGl0TW9kZSgpID8gJ0RvbmUgZWRpdGluZycgOiAnRWRpdCBsYXlvdXQnXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiPlxuICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkX2N1c3RvbWl6ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJFeHBvcnRcIlxuICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIj5cbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGZzLW1lbnUgI2V4cG9ydE1lbnU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UG93ZXJwb2ludCgpXCI+XG4gICAgICAgICAgRXhwb3J0IFBvd2VyUG9pbnRcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQZGYoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQREZcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKClcIj5cbiAgICAgICAgICBFeHBvcnQgUmF3IERhdGFcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgQGlmICgocmVwb3J0KCk/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSh0cnVlKVwiPlxuICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhIChUaGlzIFBhZ2UpXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgPC9mcy1tZW51PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlJlcG9ydCBzZXR0aW5nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICAgI3NwbGl0XG4gICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fc3BsaXQgZnMtcm93LmFsaWduLXN0YXJ0XCI+XG4gICAgPGZzLWFpLWNoYXRcbiAgICAgICAgI2NoYXRQYW5lbFxuICAgICAgICBjbGFzcz1cImNoYXRcIlxuICAgICAgICBbYmFzZVBhdGhdPVwiYmFzZVBhdGgoKVwiXG4gICAgICAgIFtyZXF1ZXN0RGF0YV09XCJjaGF0UmVxdWVzdERhdGEoKVwiXG4gICAgICAgIFtyZWFkeV09XCJjaGF0UGFnZUlkKCkgIT09IG51bGxcIlxuICAgICAgICAocmVzcG9uc2UpPVwib25DaGF0UmVzcG9uc2UoJGV2ZW50KVwiPlxuICAgIDwvZnMtYWktY2hhdD5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZXNpemVyXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInZpZXdlciBmcy1mbGV4IGZzLWNvbHVtblwiPlxuICAgICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgICA8YXBwLXJlcG9ydC1jYW52YXNcbiAgICAgICAgICAgIFtyZXBvcnRdPVwicmVwb3J0KClcIlxuICAgICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlKClcIlxuICAgICAgICAgICAgW3BhZ2VJZF09XCJwYWdlSWQoKVwiXG4gICAgICAgICAgICAoY29tcG9uZW50U2V0dGluZ3MpPVwiY29tcG9uZW50U2V0dGluZ3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAocmVwb3J0Q2hhbmdlZCk9XCJvbkNhbnZhc1JlcG9ydENoYW5nZWQoKVwiXG4gICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwib25DYW52YXNQYWdlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvYXBwLXJlcG9ydC1jYW52YXM+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|