@firestitch/report 18.6.1 → 18.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-chart/component-chart.component.d.ts +6 -7
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +17 -9
- package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
- package/app/reports/components/component-list/component-list.component.d.ts +39 -10
- package/app/reports/components/component-note/component-note.component.d.ts +12 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -10
- package/app/reports/components/report-component/report-component.component.d.ts +5 -12
- package/app/reports/data/report.data.d.ts +2 -3
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
- package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
- package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -2
- package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
- package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
- package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
- package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
- package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
- package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
- package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
- package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
- package/app/reports/enums/report-number-units.enum.d.ts +6 -0
- package/app/reports/enums/report-value-format.enum.d.ts +5 -0
- package/app/reports/export/offscreen-chart.d.ts +2 -2
- package/app/reports/export/report-export-collector.service.d.ts +37 -8
- package/app/reports/export/report-pdf.service.d.ts +6 -0
- package/app/reports/export/report-pptx.service.d.ts +24 -0
- package/app/reports/format.d.ts +64 -3
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +205 -14
- package/app/reports/kpi-card.d.ts +48 -0
- package/app/reports/layout.d.ts +0 -9
- package/app/reports/list-config.d.ts +16 -0
- package/app/reports/option-builder.d.ts +76 -9
- package/app/reports/output-notes.d.ts +14 -0
- package/app/reports/pipes/report-date.pipe.d.ts +2 -1
- package/app/reports/pipes/report-number.pipe.d.ts +8 -0
- package/app/reports/pipes/report-output.pipe.d.ts +10 -0
- package/app/reports/report-filter-items.d.ts +5 -2
- package/app/reports/report-url-state.d.ts +4 -0
- package/app/reports/services/report-filter-state.service.d.ts +27 -2
- package/app/reports/theme/palette.d.ts +6 -0
- package/app/reports/theme/typography.d.ts +2 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +23 -20
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +56 -29
- package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +218 -32
- package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -61
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +99 -100
- package/esm2022/app/reports/data/report.data.mjs +20 -7
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
- package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
- package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +138 -20
- package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
- package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
- package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
- package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
- package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
- package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
- package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
- package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
- package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
- package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
- package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
- package/esm2022/app/reports/export/report-export-collector.service.mjs +186 -40
- package/esm2022/app/reports/export/report-pdf.service.mjs +332 -67
- package/esm2022/app/reports/export/report-pptx.service.mjs +765 -106
- package/esm2022/app/reports/format.mjs +917 -57
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/kpi-card.mjs +174 -0
- package/esm2022/app/reports/layout.mjs +1 -46
- package/esm2022/app/reports/list-config.mjs +106 -0
- package/esm2022/app/reports/option-builder.mjs +1457 -117
- package/esm2022/app/reports/output-notes.mjs +158 -0
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
- package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
- package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
- package/esm2022/app/reports/report-filter-items.mjs +28 -3
- package/esm2022/app/reports/report-url-state.mjs +56 -15
- package/esm2022/app/reports/services/report-filter-state.service.mjs +274 -22
- package/esm2022/app/reports/theme/echarts.mjs +8 -2
- package/esm2022/app/reports/theme/palette.mjs +35 -1
- package/esm2022/app/reports/theme/typography.mjs +8 -1
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +3 -4
- package/esm2022/public_api.mjs +10 -1
- package/fesm2022/{firestitch-report-echarts-Djtmaxj1.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +9 -3
- package/fesm2022/firestitch-report-echarts-qCBE3LqM.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-D3zseBZc.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +5523 -875
- package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +9 -0
- package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +0 -1
|
@@ -4,13 +4,15 @@ import { GROUP_BY_ITEM, GROUP_PARAM_PREFIX, dateBoundString, dateFromBound, grou
|
|
|
4
4
|
// that differ from the authored defaults) and checks what is read back against
|
|
5
5
|
// the report; this file only turns values into query params and back.
|
|
6
6
|
//
|
|
7
|
-
// ?page=7&groupBy=week&g12=last30Days&g15=3,5&g16=2026-01-01..&s31=-create_date
|
|
7
|
+
// ?page=7&groupBy=week&g12=last30Days&g15=3,5&g16=2026-01-01..&s31=-create_date&q31=north&h31=notes,total
|
|
8
8
|
//
|
|
9
9
|
// - g<groupId>: one key per filter group. A dateRange is its relative preset
|
|
10
10
|
// name when it carries one, else 'YYYY-MM-DD..YYYY-MM-DD' (either side may be
|
|
11
11
|
// empty); a select is its values joined by ','; a keyword is its text. An
|
|
12
12
|
// empty value is an explicit clear of a group that has a default.
|
|
13
13
|
// - s<componentId>: a list's sort column, '-' prefixed when descending.
|
|
14
|
+
// - q<componentId>: the text in a list's search box.
|
|
15
|
+
// - h<componentId>: the columns a viewer hid on a list (encodeColumnList).
|
|
14
16
|
// - groupBy: the group-by grain (GROUP_BY_ITEM).
|
|
15
17
|
// The page key is the host's (FsAiReportComponent.pageQueryParam) and is
|
|
16
18
|
// written beside these, never by this codec.
|
|
@@ -22,29 +24,61 @@ export { GROUP_PARAM_PREFIX } from './report-filter-items';
|
|
|
22
24
|
export const LIST_SORT_PARAM_PREFIX = 's';
|
|
23
25
|
// Between the two days of an encoded fixed date range.
|
|
24
26
|
export const DATE_RANGE_SEPARATOR = '..';
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
// The prefix of a list's search key.
|
|
28
|
+
export const LIST_SEARCH_PARAM_PREFIX = 'q';
|
|
29
|
+
// The prefix of a list's hidden-columns key.
|
|
30
|
+
export const LIST_HIDDEN_PARAM_PREFIX = 'h';
|
|
31
|
+
// The prefixes of the keys this codec owns, each followed by an id.
|
|
32
|
+
const OWNED_PREFIXES = [
|
|
33
|
+
GROUP_PARAM_PREFIX, LIST_SORT_PARAM_PREFIX, LIST_SEARCH_PARAM_PREFIX, LIST_HIDDEN_PARAM_PREFIX,
|
|
34
|
+
];
|
|
35
|
+
// A key this codec owns: a group value, or a list's sort, search or hidden
|
|
36
|
+
// columns. Any such key the snapshot no longer carries is removed from the
|
|
37
|
+
// URL, so a host must not keep its own state under a key of this shape (one
|
|
38
|
+
// of the prefixes above, then digits).
|
|
39
|
+
export const OWNED_PARAM = new RegExp(`^[${OWNED_PREFIXES.join('')}]\\d+$`);
|
|
28
40
|
const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
29
41
|
// The viewer-state params of a URL as raw strings. Keys this codec does not
|
|
30
42
|
// own are ignored.
|
|
31
43
|
export function readReportUrlParams(params) {
|
|
32
44
|
const groups = new Map();
|
|
33
45
|
const listSorts = new Map();
|
|
46
|
+
const listSearches = new Map();
|
|
47
|
+
const listHidden = new Map();
|
|
48
|
+
// Each owned prefix names the map its keys go to; a prefix with no entry
|
|
49
|
+
// here is never read as some other kind of state.
|
|
50
|
+
const byPrefix = {
|
|
51
|
+
[GROUP_PARAM_PREFIX]: groups,
|
|
52
|
+
[LIST_SORT_PARAM_PREFIX]: listSorts,
|
|
53
|
+
[LIST_SEARCH_PARAM_PREFIX]: listSearches,
|
|
54
|
+
[LIST_HIDDEN_PARAM_PREFIX]: listHidden,
|
|
55
|
+
};
|
|
34
56
|
for (const key of params.keys) {
|
|
35
|
-
if (
|
|
36
|
-
|
|
57
|
+
if (OWNED_PARAM.test(key)) {
|
|
58
|
+
byPrefix[key.charAt(0)]?.set(Number(key.slice(1)), params.get(key) ?? '');
|
|
37
59
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
60
|
+
}
|
|
61
|
+
return { groups, listSorts, listSearches, listHidden, groupBy: params.get(GROUP_BY_ITEM) };
|
|
62
|
+
}
|
|
63
|
+
// A list's hidden column names as one param value. A name is a query's output
|
|
64
|
+
// alias, which can hold a comma, so each is percent-encoded before the join.
|
|
65
|
+
export function encodeColumnList(names) {
|
|
66
|
+
return names.map((name) => encodeURIComponent(name)).join(',');
|
|
67
|
+
}
|
|
68
|
+
// The column names of a hidden-columns param, in its order. Empty items are
|
|
69
|
+
// dropped, and an item that does not decode (a hand-edited '%') is kept as
|
|
70
|
+
// written. Whether a name is a column of the list is the caller's check.
|
|
71
|
+
export function decodeColumnList(raw) {
|
|
72
|
+
return raw.split(',')
|
|
73
|
+
.filter((item) => item !== '')
|
|
74
|
+
.map((item) => {
|
|
75
|
+
try {
|
|
76
|
+
return decodeURIComponent(item);
|
|
42
77
|
}
|
|
43
|
-
|
|
44
|
-
|
|
78
|
+
catch {
|
|
79
|
+
return item;
|
|
45
80
|
}
|
|
46
|
-
}
|
|
47
|
-
return { groups, listSorts, groupBy: params.get(GROUP_BY_ITEM) };
|
|
81
|
+
});
|
|
48
82
|
}
|
|
49
83
|
// A group value read back from its URL param. null is an explicit clear (an
|
|
50
84
|
// empty param). undefined means the param is unusable for a group of this type
|
|
@@ -118,6 +152,13 @@ export function buildReportUrlParams(snapshot, current) {
|
|
|
118
152
|
snapshot.listSorts.forEach((sort, componentId) => {
|
|
119
153
|
params[`${LIST_SORT_PARAM_PREFIX}${componentId}`] = encodeSort(sort);
|
|
120
154
|
});
|
|
155
|
+
// The text as typed: the router percent-encodes it in the URL.
|
|
156
|
+
snapshot.listSearches.forEach((search, componentId) => {
|
|
157
|
+
params[`${LIST_SEARCH_PARAM_PREFIX}${componentId}`] = search;
|
|
158
|
+
});
|
|
159
|
+
snapshot.listHidden.forEach((names, componentId) => {
|
|
160
|
+
params[`${LIST_HIDDEN_PARAM_PREFIX}${componentId}`] = encodeColumnList(names);
|
|
161
|
+
});
|
|
121
162
|
if (snapshot.frequency) {
|
|
122
163
|
params[GROUP_BY_ITEM] = snapshot.frequency;
|
|
123
164
|
}
|
|
@@ -145,4 +186,4 @@ function decodePreset(name, resolveRelative) {
|
|
|
145
186
|
const range = resolveRelative(name);
|
|
146
187
|
return range ? { start: range.start, end: range.end, preset: name } : undefined;
|
|
147
188
|
}
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXVybC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdXJsLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQ2pGLE1BQU0sdUJBQXVCLENBQUM7QUFHL0IsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFFN0MsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxzRUFBc0U7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUUxQyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRXpDLHdFQUF3RTtBQUN4RSxzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssa0JBQWtCLEdBQUcsc0JBQXNCLFFBQVEsQ0FBQyxDQUFDO0FBRWhHLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBRTFDLDRFQUE0RTtBQUM1RSxtQkFBbUI7QUFDbkIsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQWdCO0lBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFD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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFFRCwyRUFBMkU7QUFDM0Usa0JBQWtCO0FBQ2xCLFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsSUFBWSxFQUNaLGVBQW9FO0lBRXBFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNsRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyYW1NYXAsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gIEZpbHRlckdyb3VwVmFsdWUsIFJlcG9ydEZpbHRlclR5cGUsIFJlcG9ydFNvcnQsIFJlcG9ydFVybFBhcmFtcywgUmVwb3J0VXJsU25hcHNob3QsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIEdST1VQX1BBUkFNX1BSRUZJWCwgZGF0ZUJvdW5kU3RyaW5nLCBkYXRlRnJvbUJvdW5kLCBncm91cEl0ZW1OYW1lLFxufSBmcm9tICcuL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuXG5cbi8vIFRoZSByZXBvcnQgdmlld2VyJ3Mgc3RhdGUgaW4gaXRzIFVSTDogYSBwdXJlIGNvZGVjLCB3aXRoIG5vIGtub3dsZWRnZSBvZiBhXG4vLyBsb2FkZWQgcmVwb3J0LiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgZGVjaWRlcyBXSEFUIGlzIGNhcnJpZWQgKG9ubHkgdmFsdWVzXG4vLyB0aGF0IGRpZmZlciBmcm9tIHRoZSBhdXRob3JlZCBkZWZhdWx0cykgYW5kIGNoZWNrcyB3aGF0IGlzIHJlYWQgYmFjayBhZ2FpbnN0XG4vLyB0aGUgcmVwb3J0OyB0aGlzIGZpbGUgb25seSB0dXJucyB2YWx1ZXMgaW50byBxdWVyeSBwYXJhbXMgYW5kIGJhY2suXG4vL1xuLy8gICA/cGFnZT03Jmdyb3VwQnk9d2VlayZnMTI9bGFzdDMwRGF5cyZnMTU9Myw1JmcxNj0yMDI2LTAxLTAxLi4mczMxPS1jcmVhdGVfZGF0ZVxuLy9cbi8vIC0gZzxncm91cElkPjogb25lIGtleSBwZXIgZmlsdGVyIGdyb3VwLiBBIGRhdGVSYW5nZSBpcyBpdHMgcmVsYXRpdmUgcHJlc2V0XG4vLyAgIG5hbWUgd2hlbiBpdCBjYXJyaWVzIG9uZSwgZWxzZSAnWVlZWS1NTS1ERC4uWVlZWS1NTS1ERCcgKGVpdGhlciBzaWRlIG1heSBiZVxuLy8gICBlbXB0eSk7IGEgc2VsZWN0IGlzIGl0cyB2YWx1ZXMgam9pbmVkIGJ5ICcsJzsgYSBrZXl3b3JkIGlzIGl0cyB0ZXh0LiBBblxuLy8gICBlbXB0eSB2YWx1ZSBpcyBhbiBleHBsaWNpdCBjbGVhciBvZiBhIGdyb3VwIHRoYXQgaGFzIGEgZGVmYXVsdC5cbi8vIC0gczxjb21wb25lbnRJZD46IGEgbGlzdCdzIHNvcnQgY29sdW1uLCAnLScgcHJlZml4ZWQgd2hlbiBkZXNjZW5kaW5nLlxuLy8gLSBncm91cEJ5OiB0aGUgZ3JvdXAtYnkgZ3JhaW4gKEdST1VQX0JZX0lURU0pLlxuLy8gVGhlIHBhZ2Uga2V5IGlzIHRoZSBob3N0J3MgKEZzQWlSZXBvcnRDb21wb25lbnQucGFnZVF1ZXJ5UGFyYW0pIGFuZCBpc1xuLy8gd3JpdHRlbiBiZXNpZGUgdGhlc2UsIG5ldmVyIGJ5IHRoaXMgY29kZWMuXG5cbi8vIFRoZSBwcmVmaXggb2YgYSBncm91cCdzIHZhbHVlIGtleS4gRGVjbGFyZWQgYmVzaWRlIHRoZSBmaWx0ZXIgaXRlbXMsIHdoaWNoXG4vLyByZWFkIGl0IHRvbyAoZGVjbGFyaW5nIGl0IGhlcmUgd291bGQgbWFrZSB0aGUgdHdvIGZpbGVzIGltcG9ydCBlYWNoIG90aGVyKTtcbi8vIHJlLWV4cG9ydGVkIHNvIGV2ZXJ5IGNvZGVjIGNvbnN0YW50IGNhbiBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjb2RlYy5cbmV4cG9ydCB7IEdST1VQX1BBUkFNX1BSRUZJWCB9IGZyb20gJy4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5cbi8vIFRoZSBwcmVmaXggb2YgYSBsaXN0J3Mgc29ydCBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCA9ICdzJztcblxuLy8gQmV0d2VlbiB0aGUgdHdvIGRheXMgb2YgYW4gZW5jb2RlZCBmaXhlZCBkYXRlIHJhbmdlLlxuZXhwb3J0IGNvbnN0IERBVEVfUkFOR0VfU0VQQVJBVE9SID0gJy4uJztcblxuLy8gQSBrZXkgdGhpcyBjb2RlYyBvd25zOiBhIGdyb3VwIHZhbHVlIG9yIGEgbGlzdCBzb3J0LiBBbnkgc3VjaCBrZXkgdGhlXG4vLyBzbmFwc2hvdCBubyBsb25nZXIgY2FycmllcyBpcyByZW1vdmVkIGZyb20gdGhlIFVSTC5cbmV4cG9ydCBjb25zdCBPV05FRF9QQVJBTSA9IG5ldyBSZWdFeHAoYF5bJHtHUk9VUF9QQVJBTV9QUkVGSVh9JHtMSVNUX1NPUlRfUEFSQU1fUFJFRklYfV1cXFxcZCskYCk7XG5cbmNvbnN0IERBWV9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuXG4vLyBUaGUgdmlld2VyLXN0YXRlIHBhcmFtcyBvZiBhIFVSTCBhcyByYXcgc3RyaW5ncy4gS2V5cyB0aGlzIGNvZGVjIGRvZXMgbm90XG4vLyBvd24gYXJlIGlnbm9yZWQuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlcG9ydFVybFBhcmFtcyhwYXJhbXM6IFBhcmFtTWFwKTogUmVwb3J0VXJsUGFyYW1zIHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMua2V5cykge1xuICAgIGlmICghT1dORURfUEFSQU0udGVzdChrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IE51bWJlcihrZXkuc2xpY2UoMSkpO1xuICAgIGNvbnN0IHJhdyA9IHBhcmFtcy5nZXQoa2V5KSA/PyAnJztcblxuICAgIGlmIChrZXkuc3RhcnRzV2l0aChHUk9VUF9QQVJBTV9QUkVGSVgpKSB7XG4gICAgICBncm91cHMuc2V0KGlkLCByYXcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0U29ydHMuc2V0KGlkLCByYXcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGdyb3VwcywgbGlzdFNvcnRzLCBncm91cEJ5OiBwYXJhbXMuZ2V0KEdST1VQX0JZX0lURU0pIH07XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgcmVhZCBiYWNrIGZyb20gaXRzIFVSTCBwYXJhbS4gbnVsbCBpcyBhbiBleHBsaWNpdCBjbGVhciAoYW5cbi8vIGVtcHR5IHBhcmFtKS4gdW5kZWZpbmVkIG1lYW5zIHRoZSBwYXJhbSBpcyB1bnVzYWJsZSBmb3IgYSBncm91cCBvZiB0aGlzIHR5cGVcbi8vIChhbiB1bmtub3duIHByZXNldCBuYW1lLCBhIG1hbGZvcm1lZCBkYXksIGEgd3Jvbmcgc2hhcGUpIGFuZCBpcyBpZ25vcmVkLlxuLy8gYHJlc29sdmVSZWxhdGl2ZWAgdHVybnMgYSBwcmVzZXQgbmFtZSBpbnRvIHRvZGF5J3MgcmFuZ2UgZm9yIGl0LCBvciBudWxsIGZvclxuLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmlsdGVyVmFsdWUoXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGUsXG4gIHJhdzogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJhdyA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICByZXR1cm4gcmF3LmluY2x1ZGVzKERBVEVfUkFOR0VfU0VQQVJBVE9SKVxuICAgICAgICA/IGRlY29kZUZpeGVkUmFuZ2UocmF3KVxuICAgICAgICA6IGRlY29kZVByZXNldChyYXcsIHJlc29sdmVSZWxhdGl2ZSk7XG5cbiAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSByYXcuc3BsaXQoJywnKS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gJycpO1xuXG4gICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IHsgdmFsdWVzIH0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgICByZXR1cm4gcmF3LnRyaW0oKSA/IHsgdmFsdWU6IHJhdyB9IDogdW5kZWZpbmVkO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8gQSBncm91cCB2YWx1ZSBhcyBpdHMgVVJMIHBhcmFtLiBUaGUgc2hhcGUgc2F5cyBob3c6IGEgcHJlc2V0IG5hbWUsIHRoZW4gYVxuLy8gZGF0ZSByYW5nZSwgdGhlbiBzZWxlY3QgdmFsdWVzLCB0aGVuIGtleXdvcmQgdGV4dC4gbnVsbCAoYSBjbGVhcmVkIGdyb3VwKVxuLy8gaXMgdGhlIGVtcHR5IHBhcmFtLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUZpbHRlclZhbHVlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodmFsdWUucHJlc2V0KSB7XG4gICAgcmV0dXJuIHZhbHVlLnByZXNldDtcbiAgfVxuXG4gIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICByZXR1cm4gW2RhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCkgPz8gJycsIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpID8/ICcnXVxuICAgICAgLmpvaW4oREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICB9XG5cbiAgaWYgKHZhbHVlLnZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZS52YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywnKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS52YWx1ZSA/PyAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVNvcnQoc29ydDogUmVwb3J0U29ydCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzb3J0LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJy0nIDogJyd9JHtzb3J0LmNvbHVtbn1gO1xufVxuXG4vLyBBIGxpc3Qgc29ydCByZWFkIGJhY2sgZnJvbSBpdHMgVVJMIHBhcmFtLCBvciBudWxsIHdoZW4gaXQgbmFtZXMgbm8gY29sdW1uLlxuLy8gV2hldGhlciB0aGUgY29sdW1uIGlzIG9uZSB0aGUgbGlzdCBjYW4gc29ydCBieSBpcyB0aGUgY2FsbGVyJ3MgY2hlY2suXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU29ydChyYXc6IHN0cmluZyk6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgY29uc3QgZGVzY2VuZGluZyA9IHJhdy5zdGFydHNXaXRoKCctJyk7XG4gIGNvbnN0IGNvbHVtbiA9IGRlc2NlbmRpbmcgPyByYXcuc2xpY2UoMSkgOiByYXc7XG5cbiAgcmV0dXJuIGNvbHVtblxuICAgID8geyBjb2x1bW4sIGRpcmVjdGlvbjogZGVzY2VuZGluZyA/ICdkZXNjJyA6ICdhc2MnIH1cbiAgICA6IG51bGw7XG59XG5cbi8vIFRoZSBxdWVyeSBwYXJhbXMgdGhhdCBtYWtlIHRoZSBVUkwgY2FycnkgYHNuYXBzaG90YDogZXZlcnkgc25hcHNob3Qga2V5IGlzXG4vLyBzZXQsIGFuZCBlYWNoIG93bmVkIGtleSAob3IgdGhlIGdyYWluKSB0aGF0IGBjdXJyZW50YCBjYXJyaWVzIGJ1dCB0aGVcbi8vIHNuYXBzaG90IGRvZXMgbm90IGlzIHNldCB0byBudWxsLCB3aGljaCByZW1vdmVzIGl0IHVuZGVyIHRoZSByb3V0ZXInc1xuLy8gJ21lcmdlJyBoYW5kbGluZy4gS2V5cyB0aGlzIGNvZGVjIGRvZXMgbm90IG93biBhcmUgbGVmdCBhbG9uZS5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlcG9ydFVybFBhcmFtcyhzbmFwc2hvdDogUmVwb3J0VXJsU25hcHNob3QsIGN1cnJlbnQ6IFBhcmFtTWFwKTogUGFyYW1zIHtcbiAgY29uc3QgcGFyYW1zOiBQYXJhbXMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBjdXJyZW50LmtleXMpIHtcbiAgICBpZiAoT1dORURfUEFSQU0udGVzdChrZXkpIHx8IGtleSA9PT0gR1JPVVBfQllfSVRFTSkge1xuICAgICAgcGFyYW1zW2tleV0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNuYXBzaG90Lmdyb3Vwcy5mb3JFYWNoKCh2YWx1ZSwgZ3JvdXBJZCkgPT4ge1xuICAgIHBhcmFtc1tncm91cEl0ZW1OYW1lKHsgaWQ6IGdyb3VwSWQgfSldID0gZW5jb2RlRmlsdGVyVmFsdWUodmFsdWUpO1xuICB9KTtcblxuICBzbmFwc2hvdC5saXN0U29ydHMuZm9yRWFjaCgoc29ydCwgY29tcG9uZW50SWQpID0+IHtcbiAgICBwYXJhbXNbYCR7TElTVF9TT1JUX1BBUkFNX1BSRUZJWH0ke2NvbXBvbmVudElkfWBdID0gZW5jb2RlU29ydChzb3J0KTtcbiAgfSk7XG5cbiAgaWYgKHNuYXBzaG90LmZyZXF1ZW5jeSkge1xuICAgIHBhcmFtc1tHUk9VUF9CWV9JVEVNXSA9IHNuYXBzaG90LmZyZXF1ZW5jeTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8vICdZWVlZLU1NLURELi5ZWVlZLU1NLUREJywgZWl0aGVyIHNpZGUgb3B0aW9uYWwgYnV0IG5vdCBib3RoLiBFYWNoIHNpZGUgbXVzdFxuLy8gYmUgYSByZWFsIGNhbGVuZGFyIGRheS5cbmZ1bmN0aW9uIGRlY29kZUZpeGVkUmFuZ2UocmF3OiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lkZXMgPSByYXcuc3BsaXQoREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICBpZiAoc2lkZXMubGVuZ3RoICE9PSAyIHx8ICghc2lkZXNbMF0gJiYgIXNpZGVzWzFdKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzaWRlcy5tYXAoKHNpZGUpID0+IHNpZGUgPyBkZWNvZGVEYXkoc2lkZSkgOiBudWxsKTtcbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG4vLyBPbmUgc2lkZSBvZiBhIGZpeGVkIHJhbmdlIGFzIGEgbG9jYWwgRGF0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IGFcbi8vIHJlYWwgWS1NLUQgZGF5LlxuZnVuY3Rpb24gZGVjb2RlRGF5KHNpZGU6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gREFZX1BBVFRFUk4udGVzdChzaWRlKSA/IChkYXRlRnJvbUJvdW5kKHNpZGUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVByZXNldChcbiAgbmFtZTogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYW5nZSA9IHJlc29sdmVSZWxhdGl2ZShuYW1lKTtcblxuICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogbmFtZSB9IDogdW5kZWZpbmVkO1xufVxuIl19
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXVybC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdXJsLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQ2pGLE1BQU0sdUJBQXVCLENBQUM7QUFHL0IsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLEVBQUU7QUFDRiw0R0FBNEc7QUFDNUcsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEUscURBQXFEO0FBQ3JELDJFQUEyRTtBQUMzRSxpREFBaUQ7QUFDakQseUVBQXlFO0FBQ3pFLDZDQUE2QztBQUU3Qyw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLHNFQUFzRTtBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxtQ0FBbUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBRTFDLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFFekMscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUU1Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0FBRTVDLG9FQUFvRTtBQUNwRSxNQUFNLGNBQWMsR0FBRztJQUNyQixrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0I7Q0FDL0YsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHVDQUF1QztBQUN2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QUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcmFtTWFwLCBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICBGaWx0ZXJHcm91cFZhbHVlLCBSZXBvcnRGaWx0ZXJUeXBlLCBSZXBvcnRTb3J0LCBSZXBvcnRVcmxQYXJhbXMsIFJlcG9ydFVybFNuYXBzaG90LFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBHUk9VUF9QQVJBTV9QUkVGSVgsIGRhdGVCb3VuZFN0cmluZywgZGF0ZUZyb21Cb3VuZCwgZ3JvdXBJdGVtTmFtZSxcbn0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcblxuXG4vLyBUaGUgcmVwb3J0IHZpZXdlcidzIHN0YXRlIGluIGl0cyBVUkw6IGEgcHVyZSBjb2RlYywgd2l0aCBubyBrbm93bGVkZ2Ugb2YgYVxuLy8gbG9hZGVkIHJlcG9ydC4gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGRlY2lkZXMgV0hBVCBpcyBjYXJyaWVkIChvbmx5IHZhbHVlc1xuLy8gdGhhdCBkaWZmZXIgZnJvbSB0aGUgYXV0aG9yZWQgZGVmYXVsdHMpIGFuZCBjaGVja3Mgd2hhdCBpcyByZWFkIGJhY2sgYWdhaW5zdFxuLy8gdGhlIHJlcG9ydDsgdGhpcyBmaWxlIG9ubHkgdHVybnMgdmFsdWVzIGludG8gcXVlcnkgcGFyYW1zIGFuZCBiYWNrLlxuLy9cbi8vICAgP3BhZ2U9NyZncm91cEJ5PXdlZWsmZzEyPWxhc3QzMERheXMmZzE1PTMsNSZnMTY9MjAyNi0wMS0wMS4uJnMzMT0tY3JlYXRlX2RhdGUmcTMxPW5vcnRoJmgzMT1ub3Rlcyx0b3RhbFxuLy9cbi8vIC0gZzxncm91cElkPjogb25lIGtleSBwZXIgZmlsdGVyIGdyb3VwLiBBIGRhdGVSYW5nZSBpcyBpdHMgcmVsYXRpdmUgcHJlc2V0XG4vLyAgIG5hbWUgd2hlbiBpdCBjYXJyaWVzIG9uZSwgZWxzZSAnWVlZWS1NTS1ERC4uWVlZWS1NTS1ERCcgKGVpdGhlciBzaWRlIG1heSBiZVxuLy8gICBlbXB0eSk7IGEgc2VsZWN0IGlzIGl0cyB2YWx1ZXMgam9pbmVkIGJ5ICcsJzsgYSBrZXl3b3JkIGlzIGl0cyB0ZXh0LiBBblxuLy8gICBlbXB0eSB2YWx1ZSBpcyBhbiBleHBsaWNpdCBjbGVhciBvZiBhIGdyb3VwIHRoYXQgaGFzIGEgZGVmYXVsdC5cbi8vIC0gczxjb21wb25lbnRJZD46IGEgbGlzdCdzIHNvcnQgY29sdW1uLCAnLScgcHJlZml4ZWQgd2hlbiBkZXNjZW5kaW5nLlxuLy8gLSBxPGNvbXBvbmVudElkPjogdGhlIHRleHQgaW4gYSBsaXN0J3Mgc2VhcmNoIGJveC5cbi8vIC0gaDxjb21wb25lbnRJZD46IHRoZSBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIGxpc3QgKGVuY29kZUNvbHVtbkxpc3QpLlxuLy8gLSBncm91cEJ5OiB0aGUgZ3JvdXAtYnkgZ3JhaW4gKEdST1VQX0JZX0lURU0pLlxuLy8gVGhlIHBhZ2Uga2V5IGlzIHRoZSBob3N0J3MgKEZzQWlSZXBvcnRDb21wb25lbnQucGFnZVF1ZXJ5UGFyYW0pIGFuZCBpc1xuLy8gd3JpdHRlbiBiZXNpZGUgdGhlc2UsIG5ldmVyIGJ5IHRoaXMgY29kZWMuXG5cbi8vIFRoZSBwcmVmaXggb2YgYSBncm91cCdzIHZhbHVlIGtleS4gRGVjbGFyZWQgYmVzaWRlIHRoZSBmaWx0ZXIgaXRlbXMsIHdoaWNoXG4vLyByZWFkIGl0IHRvbyAoZGVjbGFyaW5nIGl0IGhlcmUgd291bGQgbWFrZSB0aGUgdHdvIGZpbGVzIGltcG9ydCBlYWNoIG90aGVyKTtcbi8vIHJlLWV4cG9ydGVkIHNvIGV2ZXJ5IGNvZGVjIGNvbnN0YW50IGNhbiBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjb2RlYy5cbmV4cG9ydCB7IEdST1VQX1BBUkFNX1BSRUZJWCB9IGZyb20gJy4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5cbi8vIFRoZSBwcmVmaXggb2YgYSBsaXN0J3Mgc29ydCBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCA9ICdzJztcblxuLy8gQmV0d2VlbiB0aGUgdHdvIGRheXMgb2YgYW4gZW5jb2RlZCBmaXhlZCBkYXRlIHJhbmdlLlxuZXhwb3J0IGNvbnN0IERBVEVfUkFOR0VfU0VQQVJBVE9SID0gJy4uJztcblxuLy8gVGhlIHByZWZpeCBvZiBhIGxpc3QncyBzZWFyY2gga2V5LlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX1BBUkFNX1BSRUZJWCA9ICdxJztcblxuLy8gVGhlIHByZWZpeCBvZiBhIGxpc3QncyBoaWRkZW4tY29sdW1ucyBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9ISURERU5fUEFSQU1fUFJFRklYID0gJ2gnO1xuXG4vLyBUaGUgcHJlZml4ZXMgb2YgdGhlIGtleXMgdGhpcyBjb2RlYyBvd25zLCBlYWNoIGZvbGxvd2VkIGJ5IGFuIGlkLlxuY29uc3QgT1dORURfUFJFRklYRVMgPSBbXG4gIEdST1VQX1BBUkFNX1BSRUZJWCwgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCwgTElTVF9TRUFSQ0hfUEFSQU1fUFJFRklYLCBMSVNUX0hJRERFTl9QQVJBTV9QUkVGSVgsXG5dO1xuXG4vLyBBIGtleSB0aGlzIGNvZGVjIG93bnM6IGEgZ3JvdXAgdmFsdWUsIG9yIGEgbGlzdCdzIHNvcnQsIHNlYXJjaCBvciBoaWRkZW5cbi8vIGNvbHVtbnMuIEFueSBzdWNoIGtleSB0aGUgc25hcHNob3Qgbm8gbG9uZ2VyIGNhcnJpZXMgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuLy8gVVJMLCBzbyBhIGhvc3QgbXVzdCBub3Qga2VlcCBpdHMgb3duIHN0YXRlIHVuZGVyIGEga2V5IG9mIHRoaXMgc2hhcGUgKG9uZVxuLy8gb2YgdGhlIHByZWZpeGVzIGFib3ZlLCB0aGVuIGRpZ2l0cykuXG5leHBvcnQgY29uc3QgT1dORURfUEFSQU0gPSBuZXcgUmVnRXhwKGBeWyR7T1dORURfUFJFRklYRVMuam9pbignJyl9XVxcXFxkKyRgKTtcblxuY29uc3QgREFZX1BBVFRFUk4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC87XG5cbi8vIFRoZSB2aWV3ZXItc3RhdGUgcGFyYW1zIG9mIGEgVVJMIGFzIHJhdyBzdHJpbmdzLiBLZXlzIHRoaXMgY29kZWMgZG9lcyBub3Rcbi8vIG93biBhcmUgaWdub3JlZC5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVwb3J0VXJsUGFyYW1zKHBhcmFtczogUGFyYW1NYXApOiBSZXBvcnRVcmxQYXJhbXMge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0SGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgLy8gRWFjaCBvd25lZCBwcmVmaXggbmFtZXMgdGhlIG1hcCBpdHMga2V5cyBnbyB0bzsgYSBwcmVmaXggd2l0aCBubyBlbnRyeVxuICAvLyBoZXJlIGlzIG5ldmVyIHJlYWQgYXMgc29tZSBvdGhlciBraW5kIG9mIHN0YXRlLlxuICBjb25zdCBieVByZWZpeDogUmVjb3JkPHN0cmluZywgTWFwPG51bWJlciwgc3RyaW5nPj4gPSB7XG4gICAgW0dST1VQX1BBUkFNX1BSRUZJWF06IGdyb3VwcyxcbiAgICBbTElTVF9TT1JUX1BBUkFNX1BSRUZJWF06IGxpc3RTb3J0cyxcbiAgICBbTElTVF9TRUFSQ0hfUEFSQU1fUFJFRklYXTogbGlzdFNlYXJjaGVzLFxuICAgIFtMSVNUX0hJRERFTl9QQVJBTV9QUkVGSVhdOiBsaXN0SGlkZGVuLFxuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5rZXlzKSB7XG4gICAgaWYgKE9XTkVEX1BBUkFNLnRlc3Qoa2V5KSkge1xuICAgICAgYnlQcmVmaXhba2V5LmNoYXJBdCgwKV0/LnNldChOdW1iZXIoa2V5LnNsaWNlKDEpKSwgcGFyYW1zLmdldChrZXkpID8/ICcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBncm91cHMsIGxpc3RTb3J0cywgbGlzdFNlYXJjaGVzLCBsaXN0SGlkZGVuLCBncm91cEJ5OiBwYXJhbXMuZ2V0KEdST1VQX0JZX0lURU0pIH07XG59XG5cbi8vIEEgbGlzdCdzIGhpZGRlbiBjb2x1bW4gbmFtZXMgYXMgb25lIHBhcmFtIHZhbHVlLiBBIG5hbWUgaXMgYSBxdWVyeSdzIG91dHB1dFxuLy8gYWxpYXMsIHdoaWNoIGNhbiBob2xkIGEgY29tbWEsIHNvIGVhY2ggaXMgcGVyY2VudC1lbmNvZGVkIGJlZm9yZSB0aGUgam9pbi5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDb2x1bW5MaXN0KG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lcy5tYXAoKG5hbWUpID0+IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSkuam9pbignLCcpO1xufVxuXG4vLyBUaGUgY29sdW1uIG5hbWVzIG9mIGEgaGlkZGVuLWNvbHVtbnMgcGFyYW0sIGluIGl0cyBvcmRlci4gRW1wdHkgaXRlbXMgYXJlXG4vLyBkcm9wcGVkLCBhbmQgYW4gaXRlbSB0aGF0IGRvZXMgbm90IGRlY29kZSAoYSBoYW5kLWVkaXRlZCAnJScpIGlzIGtlcHQgYXNcbi8vIHdyaXR0ZW4uIFdoZXRoZXIgYSBuYW1lIGlzIGEgY29sdW1uIG9mIHRoZSBsaXN0IGlzIHRoZSBjYWxsZXIncyBjaGVjay5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW5MaXN0KHJhdzogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmF3LnNwbGl0KCcsJylcbiAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSAnJylcbiAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vLyBBIGdyb3VwIHZhbHVlIHJlYWQgYmFjayBmcm9tIGl0cyBVUkwgcGFyYW0uIG51bGwgaXMgYW4gZXhwbGljaXQgY2xlYXIgKGFuXG4vLyBlbXB0eSBwYXJhbSkuIHVuZGVmaW5lZCBtZWFucyB0aGUgcGFyYW0gaXMgdW51c2FibGUgZm9yIGEgZ3JvdXAgb2YgdGhpcyB0eXBlXG4vLyAoYW4gdW5rbm93biBwcmVzZXQgbmFtZSwgYSBtYWxmb3JtZWQgZGF5LCBhIHdyb25nIHNoYXBlKSBhbmQgaXMgaWdub3JlZC5cbi8vIGByZXNvbHZlUmVsYXRpdmVgIHR1cm5zIGEgcHJlc2V0IG5hbWUgaW50byB0b2RheSdzIHJhbmdlIGZvciBpdCwgb3IgbnVsbCBmb3Jcbi8vIGEgbmFtZSBpdCBkb2VzIG5vdCBrbm93LlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZpbHRlclZhbHVlKFxuICB0eXBlOiBSZXBvcnRGaWx0ZXJUeXBlLFxuICByYXc6IHN0cmluZyxcbiAgcmVzb2x2ZVJlbGF0aXZlOiAobmFtZTogc3RyaW5nKSA9PiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwsXG4pOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIHJhdy5pbmNsdWRlcyhEQVRFX1JBTkdFX1NFUEFSQVRPUilcbiAgICAgICAgPyBkZWNvZGVGaXhlZFJhbmdlKHJhdylcbiAgICAgICAgOiBkZWNvZGVQcmVzZXQocmF3LCByZXNvbHZlUmVsYXRpdmUpO1xuXG4gICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgY29uc3QgdmFsdWVzID0gcmF3LnNwbGl0KCcsJykuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09ICcnKTtcblxuICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB7IHZhbHVlcyB9IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgICAgcmV0dXJuIHJhdy50cmltKCkgPyB7IHZhbHVlOiByYXcgfSA6IHVuZGVmaW5lZDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgYXMgaXRzIFVSTCBwYXJhbS4gVGhlIHNoYXBlIHNheXMgaG93OiBhIHByZXNldCBuYW1lLCB0aGVuIGFcbi8vIGRhdGUgcmFuZ2UsIHRoZW4gc2VsZWN0IHZhbHVlcywgdGhlbiBrZXl3b3JkIHRleHQuIG51bGwgKGEgY2xlYXJlZCBncm91cClcbi8vIGlzIHRoZSBlbXB0eSBwYXJhbS5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVGaWx0ZXJWYWx1ZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHZhbHVlLnByZXNldCkge1xuICAgIHJldHVybiB2YWx1ZS5wcmVzZXQ7XG4gIH1cblxuICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgcmV0dXJuIFtkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpID8/ICcnLCBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSA/PyAnJ11cbiAgICAgIC5qb2luKERBVEVfUkFOR0VfU0VQQVJBVE9SKTtcbiAgfVxuXG4gIGlmICh2YWx1ZS52YWx1ZXMpIHtcbiAgICByZXR1cm4gdmFsdWUudmFsdWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKS5qb2luKCcsJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudmFsdWUgPz8gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTb3J0KHNvcnQ6IFJlcG9ydFNvcnQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICctJyA6ICcnfSR7c29ydC5jb2x1bW59YDtcbn1cblxuLy8gQSBsaXN0IHNvcnQgcmVhZCBiYWNrIGZyb20gaXRzIFVSTCBwYXJhbSwgb3IgbnVsbCB3aGVuIGl0IG5hbWVzIG5vIGNvbHVtbi5cbi8vIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBvbmUgdGhlIGxpc3QgY2FuIHNvcnQgYnkgaXMgdGhlIGNhbGxlcidzIGNoZWNrLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVNvcnQocmF3OiBzdHJpbmcpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gIGNvbnN0IGRlc2NlbmRpbmcgPSByYXcuc3RhcnRzV2l0aCgnLScpO1xuICBjb25zdCBjb2x1bW4gPSBkZXNjZW5kaW5nID8gcmF3LnNsaWNlKDEpIDogcmF3O1xuXG4gIHJldHVybiBjb2x1bW5cbiAgICA/IHsgY29sdW1uLCBkaXJlY3Rpb246IGRlc2NlbmRpbmcgPyAnZGVzYycgOiAnYXNjJyB9XG4gICAgOiBudWxsO1xufVxuXG4vLyBUaGUgcXVlcnkgcGFyYW1zIHRoYXQgbWFrZSB0aGUgVVJMIGNhcnJ5IGBzbmFwc2hvdGA6IGV2ZXJ5IHNuYXBzaG90IGtleSBpc1xuLy8gc2V0LCBhbmQgZWFjaCBvd25lZCBrZXkgKG9yIHRoZSBncmFpbikgdGhhdCBgY3VycmVudGAgY2FycmllcyBidXQgdGhlXG4vLyBzbmFwc2hvdCBkb2VzIG5vdCBpcyBzZXQgdG8gbnVsbCwgd2hpY2ggcmVtb3ZlcyBpdCB1bmRlciB0aGUgcm91dGVyJ3Ncbi8vICdtZXJnZScgaGFuZGxpbmcuIEtleXMgdGhpcyBjb2RlYyBkb2VzIG5vdCBvd24gYXJlIGxlZnQgYWxvbmUuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXBvcnRVcmxQYXJhbXMoc25hcHNob3Q6IFJlcG9ydFVybFNuYXBzaG90LCBjdXJyZW50OiBQYXJhbU1hcCk6IFBhcmFtcyB7XG4gIGNvbnN0IHBhcmFtczogUGFyYW1zID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY3VycmVudC5rZXlzKSB7XG4gICAgaWYgKE9XTkVEX1BBUkFNLnRlc3Qoa2V5KSB8fCBrZXkgPT09IEdST1VQX0JZX0lURU0pIHtcbiAgICAgIHBhcmFtc1trZXldID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdC5ncm91cHMuZm9yRWFjaCgodmFsdWUsIGdyb3VwSWQpID0+IHtcbiAgICBwYXJhbXNbZ3JvdXBJdGVtTmFtZSh7IGlkOiBncm91cElkIH0pXSA9IGVuY29kZUZpbHRlclZhbHVlKHZhbHVlKTtcbiAgfSk7XG5cbiAgc25hcHNob3QubGlzdFNvcnRzLmZvckVhY2goKHNvcnQsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgcGFyYW1zW2Ake0xJU1RfU09SVF9QQVJBTV9QUkVGSVh9JHtjb21wb25lbnRJZH1gXSA9IGVuY29kZVNvcnQoc29ydCk7XG4gIH0pO1xuXG4gIC8vIFRoZSB0ZXh0IGFzIHR5cGVkOiB0aGUgcm91dGVyIHBlcmNlbnQtZW5jb2RlcyBpdCBpbiB0aGUgVVJMLlxuICBzbmFwc2hvdC5saXN0U2VhcmNoZXMuZm9yRWFjaCgoc2VhcmNoLCBjb21wb25lbnRJZCkgPT4ge1xuICAgIHBhcmFtc1tgJHtMSVNUX1NFQVJDSF9QQVJBTV9QUkVGSVh9JHtjb21wb25lbnRJZH1gXSA9IHNlYXJjaDtcbiAgfSk7XG5cbiAgc25hcHNob3QubGlzdEhpZGRlbi5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICBwYXJhbXNbYCR7TElTVF9ISURERU5fUEFSQU1fUFJFRklYfSR7Y29tcG9uZW50SWR9YF0gPSBlbmNvZGVDb2x1bW5MaXN0KG5hbWVzKTtcbiAgfSk7XG5cbiAgaWYgKHNuYXBzaG90LmZyZXF1ZW5jeSkge1xuICAgIHBhcmFtc1tHUk9VUF9CWV9JVEVNXSA9IHNuYXBzaG90LmZyZXF1ZW5jeTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8vICdZWVlZLU1NLURELi5ZWVlZLU1NLUREJywgZWl0aGVyIHNpZGUgb3B0aW9uYWwgYnV0IG5vdCBib3RoLiBFYWNoIHNpZGUgbXVzdFxuLy8gYmUgYSByZWFsIGNhbGVuZGFyIGRheS5cbmZ1bmN0aW9uIGRlY29kZUZpeGVkUmFuZ2UocmF3OiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lkZXMgPSByYXcuc3BsaXQoREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICBpZiAoc2lkZXMubGVuZ3RoICE9PSAyIHx8ICghc2lkZXNbMF0gJiYgIXNpZGVzWzFdKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzaWRlcy5tYXAoKHNpZGUpID0+IHNpZGUgPyBkZWNvZGVEYXkoc2lkZSkgOiBudWxsKTtcbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG4vLyBPbmUgc2lkZSBvZiBhIGZpeGVkIHJhbmdlIGFzIGEgbG9jYWwgRGF0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IGFcbi8vIHJlYWwgWS1NLUQgZGF5LlxuZnVuY3Rpb24gZGVjb2RlRGF5KHNpZGU6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gREFZX1BBVFRFUk4udGVzdChzaWRlKSA/IChkYXRlRnJvbUJvdW5kKHNpZGUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVByZXNldChcbiAgbmFtZTogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYW5nZSA9IHJlc29sdmVSZWxhdGl2ZShuYW1lKTtcblxuICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogbmFtZSB9IDogdW5kZWZpbmVkO1xufVxuIl19
|