@firestitch/report 18.4.0 → 18.6.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-list/component-list.component.d.ts +3 -6
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +4 -4
- package/app/reports/components/report-component/report-component.component.d.ts +5 -5
- package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
- package/app/reports/consts/report-week.const.d.ts +2 -0
- package/app/reports/data/report-ai-chat.data.d.ts +12 -0
- package/app/reports/data/report.data.d.ts +3 -3
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
- package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +3 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +14 -2
- package/app/reports/export/report-pdf.service.d.ts +14 -1
- package/app/reports/export/report-pptx.service.d.ts +6 -1
- package/app/reports/format.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +19 -3
- package/app/reports/option-builder.d.ts +13 -1
- package/app/reports/pipes/report-date.pipe.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +5 -0
- package/app/reports/report-url-state.d.ts +14 -0
- package/app/reports/services/report-filter-state.service.d.ts +24 -2
- package/app/reports/text.d.ts +1 -0
- package/app/reports/theme/palette.d.ts +2 -0
- package/app/reports/theme/typography.d.ts +2 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
- package/app/reports/views/report/report.component.d.ts +6 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +29 -104
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +52 -44
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +55 -35
- package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
- package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
- package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
- package/esm2022/app/reports/data/report.data.mjs +22 -9
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
- package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +28 -14
- package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +3 -3
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
- package/esm2022/app/reports/export/report-export-collector.service.mjs +92 -28
- package/esm2022/app/reports/export/report-export.service.mjs +11 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +241 -81
- package/esm2022/app/reports/export/report-pptx.service.mjs +143 -60
- package/esm2022/app/reports/format.mjs +119 -8
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/option-builder.mjs +230 -17
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
- package/esm2022/app/reports/report-filter-items.mjs +42 -10
- package/esm2022/app/reports/report-url-state.mjs +144 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +308 -64
- package/esm2022/app/reports/text.mjs +2 -2
- package/esm2022/app/reports/theme/echarts.mjs +6 -5
- package/esm2022/app/reports/theme/palette.mjs +9 -1
- package/esm2022/app/reports/theme/typography.mjs +6 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +191 -90
- package/esm2022/app/reports/views/report/report.component.mjs +64 -62
- package/fesm2022/{firestitch-report-echarts-CFkoNvo_.mjs → firestitch-report-echarts-B9nl9XKM.mjs} +6 -6
- package/fesm2022/firestitch-report-echarts-B9nl9XKM.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-PZzkYYTD.mjs → firestitch-report-firestitch-report-Bb65HEYB.mjs} +2348 -1161
- package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
- package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
- package/fesm2022/firestitch-report-echarts-CFkoNvo_.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-PZzkYYTD.mjs.map +0 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Injectable, signal } from '@angular/core';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import { filter as rxFilter } from 'rxjs/operators';
|
|
4
4
|
import { endOfWeek, startOfMonth, startOfQuarter, startOfWeek, startOfYear, subDays, subMonths, subWeeks, } from 'date-fns';
|
|
5
|
+
import { REPORT_WEEK_STARTS_ON } from '../consts/report-week.const';
|
|
6
|
+
import { getZonedNow, resolveReportTimezone } from '../format';
|
|
7
|
+
import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
|
|
5
8
|
import { dateBoundString } from '../report-filter-items';
|
|
9
|
+
import { decodeFilterValue, decodeSort } from '../report-url-state';
|
|
6
10
|
import * as i0 from "@angular/core";
|
|
7
11
|
// Whether two stored filter-group defaults are the same. Compared on the fields a
|
|
8
12
|
// default can actually carry, so key order in the payload can't read as a change.
|
|
@@ -17,6 +21,18 @@ export function sameDefault(a, b) {
|
|
|
17
21
|
&& (a.values ?? []).length === (b.values ?? []).length
|
|
18
22
|
&& (a.values ?? []).every((value, index) => value === (b.values ?? [])[index]);
|
|
19
23
|
}
|
|
24
|
+
// Whether two list sorts order the rows the same way. No direction reads as
|
|
25
|
+
// ascending, the way the list applies it.
|
|
26
|
+
function sameSort(a, b) {
|
|
27
|
+
return !!b
|
|
28
|
+
&& a.column === b.column
|
|
29
|
+
&& (a.direction ?? 'asc') === (b.direction ?? 'asc');
|
|
30
|
+
}
|
|
31
|
+
// Whether two date-range values cover the same calendar days.
|
|
32
|
+
function sameDays(a, b) {
|
|
33
|
+
return dateBoundString(a.start) === dateBoundString(b.start)
|
|
34
|
+
&& dateBoundString(a.end) === dateBoundString(b.end);
|
|
35
|
+
}
|
|
20
36
|
// A stable signature for a group's stored default. The report toolbar keys its
|
|
21
37
|
// fs-filter on this, because fs-filter reads its config once at init — without a
|
|
22
38
|
// key change it keeps rendering the values it was created with even after the
|
|
@@ -34,72 +50,107 @@ export function defaultSignature(group) {
|
|
|
34
50
|
(groupDefault.values ?? []).join(','),
|
|
35
51
|
].join('~');
|
|
36
52
|
}
|
|
37
|
-
//
|
|
38
|
-
// — this service holds them per filter GROUP (the propagation unit),
|
|
39
|
-
// them into per-component member-filter values for each data request,
|
|
40
|
-
// notifies the components whose groups changed so only they refetch.
|
|
53
|
+
// Viewer filter state for the open report. Filter VALUES are never saved to
|
|
54
|
+
// the report — this service holds them per filter GROUP (the propagation unit),
|
|
55
|
+
// resolves them into per-component member-filter values for each data request,
|
|
56
|
+
// and notifies the components whose groups changed so only they refetch.
|
|
41
57
|
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
58
|
+
// It is also the one source of the viewer state the report URL carries (group
|
|
59
|
+
// values, the group-by grain, list sorts): urlSnapshot() says what differs from
|
|
60
|
+
// the authored defaults, init() restores it, and urlChanges() tells the host's
|
|
61
|
+
// single URL writer when to write.
|
|
62
|
+
//
|
|
63
|
+
// Session-only, never in the URL: per-filter enable/disable toggles from a
|
|
64
|
+
// component's filter menu (the `enabled` column is the authored default; a
|
|
65
|
+
// viewer's toggle shouldn't write to the report).
|
|
45
66
|
export class ReportFilterStateService {
|
|
67
|
+
// The open report's effective zone (resolveReportTimezone). Relative presets
|
|
68
|
+
// resolve against today in it, and date cells render in it.
|
|
69
|
+
timezone = signal('UTC');
|
|
46
70
|
_values = new Map();
|
|
47
71
|
_groups = new Map();
|
|
48
72
|
_sessionDisabled = new Set();
|
|
49
|
-
//
|
|
73
|
+
// Groups that have a default the viewer cleared. Without this a reload of the
|
|
74
|
+
// report (a chat edit, a dialog) would find no value for the group and seed
|
|
75
|
+
// its default straight back. A change to the stored default releases it.
|
|
76
|
+
_cleared = new Set();
|
|
77
|
+
// The report's group-by control: a single report-wide bucket override for all
|
|
50
78
|
// time-series charts. Unset = each chart uses its authored granularity. Never
|
|
51
|
-
//
|
|
79
|
+
// saved to the report (the URL carries it), and carried in the data request's
|
|
52
80
|
// `state`, so it propagates through to the PDF/PowerPoint exports too. Named
|
|
53
81
|
// for the `frequency` wire key it travels under, not for the control's label.
|
|
54
82
|
_frequency = null;
|
|
55
83
|
_frequencyChanged$ = new Subject();
|
|
84
|
+
// Each list's viewer-chosen sort, by component id. Held here rather than only
|
|
85
|
+
// in the list's FsList so it survives the list being recreated (a page switch,
|
|
86
|
+
// a reload after an edit) and so every consumer of viewer state reads one place.
|
|
87
|
+
_listSorts = new Map();
|
|
56
88
|
// Emits the group id that changed; components listen filtered to their own
|
|
57
89
|
// group ids. null = everything changed (re-init).
|
|
58
90
|
_changed$ = new Subject();
|
|
91
|
+
// Fires whenever anything the URL carries may have changed.
|
|
92
|
+
_urlChanged$ = new Subject();
|
|
59
93
|
// Seed groups + their defaults when a report loads. Existing session values
|
|
60
94
|
// for still-existing groups survive a structure re-fetch (a chat edit
|
|
61
|
-
// shouldn't reset the viewer's filters)
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
|
|
95
|
+
// shouldn't reset the viewer's filters), and so does a group the viewer
|
|
96
|
+
// cleared — UNLESS the group's stored default itself changed, which only
|
|
97
|
+
// happens when an operator saved a new default in report settings or the
|
|
98
|
+
// agent set one. That is an explicit instruction to re-seed, so it wins over
|
|
99
|
+
// the surviving session value; without it the bar keeps showing whatever it
|
|
100
|
+
// was first seeded with until a full page reload.
|
|
101
|
+
//
|
|
102
|
+
// A change of the report's zone moves "today", so a value still carrying its
|
|
103
|
+
// group default's preset name is resolved again in the new zone. A value the
|
|
104
|
+
// viewer picked, or one carrying another preset name, is kept as it is.
|
|
105
|
+
//
|
|
106
|
+
// `restore` is the viewer state read from the URL. The host passes it only on
|
|
107
|
+
// the first load of a report; a reload after a chat or dialog edit passes
|
|
108
|
+
// null, so the in-memory state wins. Params that name a group, list or column
|
|
109
|
+
// the report no longer has, or that do not decode, are ignored.
|
|
110
|
+
init(report, restore = null) {
|
|
111
|
+
const previousTimezone = this.timezone();
|
|
112
|
+
// Set first: the defaults seeded below resolve their relative presets in it.
|
|
113
|
+
this.timezone.set(resolveReportTimezone(report));
|
|
114
|
+
const timezoneChanged = previousTimezone !== this.timezone();
|
|
67
115
|
const previousGroups = this._groups;
|
|
68
116
|
this._groups = new Map();
|
|
69
|
-
const validIds = new Set();
|
|
70
117
|
for (const group of report.filterGroups ?? []) {
|
|
71
118
|
this._groups.set(group.id, group);
|
|
72
|
-
|
|
73
|
-
const defaultChanged = !sameDefault(previousGroups.get(group.id)?.config?.default ?? null, group.config?.default ?? null);
|
|
74
|
-
if (!this._values.has(group.id) || defaultChanged) {
|
|
75
|
-
const defaultValue = this._defaultValue(group);
|
|
76
|
-
if (defaultValue) {
|
|
77
|
-
this._values.set(group.id, defaultValue);
|
|
78
|
-
}
|
|
79
|
-
else if (defaultChanged) {
|
|
80
|
-
// The default was cleared, so the value it seeded goes with it.
|
|
81
|
-
this._values.delete(group.id);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
119
|
+
this._seed(group, previousGroups.get(group.id) ?? null, timezoneChanged);
|
|
84
120
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this._values.delete(groupId);
|
|
88
|
-
}
|
|
121
|
+
if (restore) {
|
|
122
|
+
this._restore(report, restore);
|
|
89
123
|
}
|
|
124
|
+
this._prune(report);
|
|
90
125
|
this._changed$.next(null);
|
|
126
|
+
this._urlChanged$.next();
|
|
91
127
|
}
|
|
92
128
|
value(groupId) {
|
|
93
129
|
return this._values.get(groupId);
|
|
94
130
|
}
|
|
131
|
+
// A bar's value for a group. A date range keeps the stored preset name only
|
|
132
|
+
// while its days are still the stored days: the bars re-set every group they
|
|
133
|
+
// show whenever any one of them changes, and an untouched rolling range must
|
|
134
|
+
// keep its name rather than turn into two fixed dates. Any other range, a
|
|
135
|
+
// picker shortcut included, is stored as the fixed dates it shows.
|
|
95
136
|
setValue(groupId, value) {
|
|
96
137
|
if (value === null) {
|
|
97
138
|
this._values.delete(groupId);
|
|
139
|
+
if (this._groups.get(groupId)?.config?.default) {
|
|
140
|
+
this._cleared.add(groupId);
|
|
141
|
+
}
|
|
98
142
|
}
|
|
99
143
|
else {
|
|
100
|
-
this._values.set(groupId, value);
|
|
144
|
+
this._values.set(groupId, this._withPreset(this._values.get(groupId), value));
|
|
145
|
+
this._cleared.delete(groupId);
|
|
101
146
|
}
|
|
102
147
|
this._changed$.next(groupId);
|
|
148
|
+
this._urlChanged$.next();
|
|
149
|
+
}
|
|
150
|
+
// A relative preset name as today's range in the report's zone, or null for
|
|
151
|
+
// a name it does not know. The URL codec decodes preset names through this.
|
|
152
|
+
resolveRelative(name) {
|
|
153
|
+
return this._relativeRange(name);
|
|
103
154
|
}
|
|
104
155
|
// The active group-by grain, or null when the viewer hasn't chosen one.
|
|
105
156
|
frequency() {
|
|
@@ -108,6 +159,7 @@ export class ReportFilterStateService {
|
|
|
108
159
|
setFrequency(frequency) {
|
|
109
160
|
this._frequency = frequency;
|
|
110
161
|
this._frequencyChanged$.next();
|
|
162
|
+
this._urlChanged$.next();
|
|
111
163
|
}
|
|
112
164
|
// Fires whenever the group-by grain changes — every time-series chart listens
|
|
113
165
|
// so it refetches and re-buckets (the override isn't scoped to any filter
|
|
@@ -115,6 +167,54 @@ export class ReportFilterStateService {
|
|
|
115
167
|
frequencyChanges() {
|
|
116
168
|
return this._frequencyChanged$.asObservable();
|
|
117
169
|
}
|
|
170
|
+
// The sort the viewer last fetched a list with, or null when it hasn't sorted
|
|
171
|
+
// (the list then falls back to its authored sort).
|
|
172
|
+
listSort(componentId) {
|
|
173
|
+
return this._listSorts.get(componentId) ?? null;
|
|
174
|
+
}
|
|
175
|
+
// Records a list's sort. Deliberately emits no change: the list sets this from
|
|
176
|
+
// the fetch that already ran with that sort, so a notification would only make
|
|
177
|
+
// it refetch the same rows. Only the URL hears about it.
|
|
178
|
+
setListSort(componentId, sort) {
|
|
179
|
+
if (sort) {
|
|
180
|
+
this._listSorts.set(componentId, sort);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
this._listSorts.delete(componentId);
|
|
184
|
+
}
|
|
185
|
+
this._urlChanged$.next();
|
|
186
|
+
}
|
|
187
|
+
// Fires whenever the viewer state the URL carries may have changed: a group
|
|
188
|
+
// value, the grain, a list sort, or a (re)load of the report.
|
|
189
|
+
urlChanges() {
|
|
190
|
+
return this._urlChanged$.asObservable();
|
|
191
|
+
}
|
|
192
|
+
// The viewer state the URL should carry for `report`: only what differs from
|
|
193
|
+
// the authored defaults, so an untouched report has a bare URL and keeps
|
|
194
|
+
// following its defaults when they change. A group the viewer cleared is
|
|
195
|
+
// null. A date range is compared on its days against its default resolved
|
|
196
|
+
// today, so a value that is the default under another preset name (thisYear
|
|
197
|
+
// against a yearToDate default) is still the default.
|
|
198
|
+
urlSnapshot(report) {
|
|
199
|
+
const groups = new Map();
|
|
200
|
+
for (const group of this._groups.values()) {
|
|
201
|
+
const value = this._values.get(group.id);
|
|
202
|
+
if (this._cleared.has(group.id)) {
|
|
203
|
+
groups.set(group.id, null);
|
|
204
|
+
}
|
|
205
|
+
else if (value && !this._isDefault(group, value)) {
|
|
206
|
+
groups.set(group.id, value);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const listSorts = new Map();
|
|
210
|
+
for (const component of this._listComponents(report)) {
|
|
211
|
+
const sort = this._listSorts.get(component.id);
|
|
212
|
+
if (sort && !sameSort(sort, component.config?.sort ?? null)) {
|
|
213
|
+
listSorts.set(component.id, sort);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { groups, listSorts, frequency: this._frequency };
|
|
217
|
+
}
|
|
118
218
|
isFilterDisabled(filterId) {
|
|
119
219
|
return this._sessionDisabled.has(filterId);
|
|
120
220
|
}
|
|
@@ -144,28 +244,28 @@ export class ReportFilterStateService {
|
|
|
144
244
|
continue;
|
|
145
245
|
}
|
|
146
246
|
const value = this._values.get(filter.filterGroupId);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const entry = { filterId: filter.id };
|
|
151
|
-
if (value.start) {
|
|
152
|
-
entry.start = dateBoundString(value.start);
|
|
153
|
-
}
|
|
154
|
-
if (value.end) {
|
|
155
|
-
entry.end = dateBoundString(value.end);
|
|
156
|
-
}
|
|
157
|
-
if (value.values?.length) {
|
|
158
|
-
entry.values = value.values;
|
|
159
|
-
}
|
|
160
|
-
if (value.value?.trim()) {
|
|
161
|
-
entry.value = value.value.trim();
|
|
162
|
-
}
|
|
163
|
-
if (entry.start || entry.end || entry.values || entry.value) {
|
|
164
|
-
resolved.push(entry);
|
|
247
|
+
const fields = value ? this._resolvedFields(value) : null;
|
|
248
|
+
if (fields) {
|
|
249
|
+
resolved.push({ filterId: filter.id, ...fields });
|
|
165
250
|
}
|
|
166
251
|
}
|
|
167
252
|
return resolved;
|
|
168
253
|
}
|
|
254
|
+
// What the viewer has set, one entry per filter group, for the report chat:
|
|
255
|
+
// the agent reads it to know what is on screen. Group order, not the order
|
|
256
|
+
// the values were set in, so the same state always reads the same. A group
|
|
257
|
+
// with nothing in it is left out, and a saved default counts until the
|
|
258
|
+
// viewer changes it. Per-filter toggles are a component's own business, so
|
|
259
|
+
// they are not part of it.
|
|
260
|
+
viewerFilters() {
|
|
261
|
+
return [...this._values.entries()]
|
|
262
|
+
.sort(([a], [b]) => a - b)
|
|
263
|
+
.map(([groupId, value]) => {
|
|
264
|
+
const fields = this._resolvedFields(value);
|
|
265
|
+
return fields ? { groupId, ...fields } : null;
|
|
266
|
+
})
|
|
267
|
+
.filter((entry) => entry !== null);
|
|
268
|
+
}
|
|
169
269
|
// Every component's resolved values in one array — what a report-level export
|
|
170
270
|
// carries so each file in the archive is filtered exactly as the screen is.
|
|
171
271
|
// Filter ids are unique per component, so the backend picks each component's
|
|
@@ -177,10 +277,148 @@ export class ReportFilterStateService {
|
|
|
177
277
|
.flatMap((page) => (page.components ?? [])
|
|
178
278
|
.flatMap((component) => this.resolveForComponent(component)));
|
|
179
279
|
}
|
|
280
|
+
// A group value as the fields a request carries: date bounds as calendar
|
|
281
|
+
// days, select values when any are picked, keyword text trimmed. Null when
|
|
282
|
+
// all of them are empty. The preset name is URL state only, so it is left
|
|
283
|
+
// behind.
|
|
284
|
+
_resolvedFields(value) {
|
|
285
|
+
const fields = {};
|
|
286
|
+
if (value.start) {
|
|
287
|
+
fields.start = dateBoundString(value.start);
|
|
288
|
+
}
|
|
289
|
+
if (value.end) {
|
|
290
|
+
fields.end = dateBoundString(value.end);
|
|
291
|
+
}
|
|
292
|
+
if (value.values?.length) {
|
|
293
|
+
fields.values = value.values;
|
|
294
|
+
}
|
|
295
|
+
if (value.value?.trim()) {
|
|
296
|
+
fields.value = value.value.trim();
|
|
297
|
+
}
|
|
298
|
+
return fields.start || fields.end || fields.values || fields.value
|
|
299
|
+
? fields
|
|
300
|
+
: null;
|
|
301
|
+
}
|
|
302
|
+
// Seeds one group on (re)load; see init(). `previous` is the group as the
|
|
303
|
+
// last load had it, or null when it is new.
|
|
304
|
+
_seed(group, previous, timezoneChanged) {
|
|
305
|
+
const defaultChanged = !sameDefault(previous?.config?.default ?? null, group.config?.default ?? null);
|
|
306
|
+
if (defaultChanged) {
|
|
307
|
+
this._cleared.delete(group.id);
|
|
308
|
+
}
|
|
309
|
+
if (this._cleared.has(group.id)) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const value = this._values.get(group.id);
|
|
313
|
+
const presetToResolve = timezoneChanged
|
|
314
|
+
&& !!value?.preset
|
|
315
|
+
&& value.preset === group.config?.default?.relative;
|
|
316
|
+
if (value && !defaultChanged && !presetToResolve) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const defaultValue = this._defaultValue(group);
|
|
320
|
+
if (defaultValue) {
|
|
321
|
+
this._values.set(group.id, defaultValue);
|
|
322
|
+
}
|
|
323
|
+
else if (defaultChanged) {
|
|
324
|
+
// The default was cleared, so the value it seeded goes with it.
|
|
325
|
+
this._values.delete(group.id);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Applies the viewer state read from the URL on top of the seeded defaults.
|
|
329
|
+
_restore(report, restore) {
|
|
330
|
+
restore.groups.forEach((raw, groupId) => {
|
|
331
|
+
const group = this._groups.get(groupId);
|
|
332
|
+
const value = group
|
|
333
|
+
? decodeFilterValue(group.type, raw, (name) => this.resolveRelative(name))
|
|
334
|
+
: undefined;
|
|
335
|
+
if (value === null) {
|
|
336
|
+
this._values.delete(groupId);
|
|
337
|
+
if (group?.config?.default) {
|
|
338
|
+
this._cleared.add(groupId);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else if (value) {
|
|
342
|
+
this._values.set(groupId, value);
|
|
343
|
+
this._cleared.delete(groupId);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
const lists = new Map(this._listComponents(report).map((component) => [component.id, component]));
|
|
347
|
+
restore.listSorts.forEach((raw, componentId) => {
|
|
348
|
+
const component = lists.get(componentId);
|
|
349
|
+
const sort = decodeSort(raw);
|
|
350
|
+
if (component && sort && this._sortableColumns(component).includes(sort.column)) {
|
|
351
|
+
this._listSorts.set(componentId, sort);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
// The URL is the whole truth on a first load: no grain in it means the
|
|
355
|
+
// authored ones. The host still drops a grain the report does not offer.
|
|
356
|
+
this._frequency = GRANULARITY_OPTIONS
|
|
357
|
+
.find((option) => option.value === restore.groupBy)?.value ?? null;
|
|
358
|
+
}
|
|
359
|
+
// Drops state kept for groups and lists the report no longer has.
|
|
360
|
+
_prune(report) {
|
|
361
|
+
for (const groupId of [...this._values.keys(), ...this._cleared]) {
|
|
362
|
+
if (!this._groups.has(groupId)) {
|
|
363
|
+
this._values.delete(groupId);
|
|
364
|
+
this._cleared.delete(groupId);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const listIds = new Set(this._listComponents(report).map((component) => component.id));
|
|
368
|
+
for (const componentId of [...this._listSorts.keys()]) {
|
|
369
|
+
if (!listIds.has(componentId)) {
|
|
370
|
+
this._listSorts.delete(componentId);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// The value a bar sets, keeping the stored preset name while the days are
|
|
375
|
+
// still the stored days (see setValue).
|
|
376
|
+
_withPreset(stored, value) {
|
|
377
|
+
const fixed = { ...value };
|
|
378
|
+
delete fixed.preset;
|
|
379
|
+
return stored?.preset && sameDays(stored, fixed)
|
|
380
|
+
? { ...fixed, preset: stored.preset }
|
|
381
|
+
: fixed;
|
|
382
|
+
}
|
|
383
|
+
// Whether a value is the group's authored default, by type: a date range on
|
|
384
|
+
// its days (the default resolved today), a select on its values in any
|
|
385
|
+
// order, a keyword on its text.
|
|
386
|
+
_isDefault(group, value) {
|
|
387
|
+
const defaultValue = this._defaultValue(group);
|
|
388
|
+
if (!defaultValue) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
switch (group.type) {
|
|
392
|
+
case 'dateRange':
|
|
393
|
+
return sameDays(value, defaultValue);
|
|
394
|
+
case 'select': {
|
|
395
|
+
const values = (value.values ?? []).map(String).sort();
|
|
396
|
+
const defaults = (defaultValue.values ?? []).map(String).sort();
|
|
397
|
+
return values.length === defaults.length
|
|
398
|
+
&& values.every((item, index) => item === defaults[index]);
|
|
399
|
+
}
|
|
400
|
+
default:
|
|
401
|
+
return (value.value ?? '').trim() === (defaultValue.value ?? '').trim();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
_listComponents(report) {
|
|
405
|
+
return (report.pages ?? [])
|
|
406
|
+
.flatMap((page) => page.components ?? [])
|
|
407
|
+
.filter((component) => component.type === 'list');
|
|
408
|
+
}
|
|
409
|
+
// The columns a list can be sorted by: every authored column, or a
|
|
410
|
+
// cross-tab's row column only (its pivot columns come and go with the data).
|
|
411
|
+
_sortableColumns(component) {
|
|
412
|
+
const config = component.config;
|
|
413
|
+
if (config?.pivotBy?.column) {
|
|
414
|
+
return config.rowBy?.column ? [config.rowBy.column] : [];
|
|
415
|
+
}
|
|
416
|
+
return (config?.columns ?? []).map((column) => column.column);
|
|
417
|
+
}
|
|
180
418
|
// A group's authored default, mapped to a session value by type. Relative
|
|
181
419
|
// date presets resolve against "now" each time the report opens, so a saved
|
|
182
|
-
// "last 12 months" stays relative
|
|
183
|
-
// text seed verbatim.
|
|
420
|
+
// "last 12 months" stays relative and carries its preset name; a fixed
|
|
421
|
+
// range, select values and keyword text seed verbatim.
|
|
184
422
|
_defaultValue(group) {
|
|
185
423
|
const groupDefault = group.config?.default;
|
|
186
424
|
if (!groupDefault) {
|
|
@@ -188,7 +426,7 @@ export class ReportFilterStateService {
|
|
|
188
426
|
}
|
|
189
427
|
if (groupDefault.relative) {
|
|
190
428
|
const range = this._relativeRange(groupDefault.relative);
|
|
191
|
-
return range ? { start: range.start, end: range.end } : null;
|
|
429
|
+
return range ? { start: range.start, end: range.end, preset: groupDefault.relative } : null;
|
|
192
430
|
}
|
|
193
431
|
if (groupDefault.start || groupDefault.end) {
|
|
194
432
|
return {
|
|
@@ -204,22 +442,28 @@ export class ReportFilterStateService {
|
|
|
204
442
|
}
|
|
205
443
|
return null;
|
|
206
444
|
}
|
|
445
|
+
// A relative preset as a calendar-day range. "Today" is the day in the
|
|
446
|
+
// report's effective zone, not the browser's, so every viewer seeds the same
|
|
447
|
+
// range. The server twin is ReportRelativeRangeEnum (framework/Report/Enum),
|
|
448
|
+
// and ReportRelativeRangeEnumTest pins the table both sides must produce.
|
|
207
449
|
_relativeRange(relative) {
|
|
208
|
-
const now =
|
|
450
|
+
const now = getZonedNow(this.timezone());
|
|
209
451
|
switch (relative) {
|
|
210
|
-
// A calendar week,
|
|
452
|
+
// A calendar week, Monday to Sunday (REPORT_WEEK_STARTS_ON, the same week
|
|
453
|
+
// the server's weekly buckets use), in whole days — not the rolling
|
|
211
454
|
// seven days `last7Days` gives, which never lines up with the week a
|
|
212
455
|
// partner has already been sent. `lastWeek` is the one a weekly report
|
|
213
|
-
// wants: it ends
|
|
214
|
-
// names has closed. `thisWeek` follows every other
|
|
215
|
-
// up to now, so it is deliberately a part-finished
|
|
456
|
+
// wants: it ends on the previous week's Sunday rather than at `now`,
|
|
457
|
+
// because the week it names has closed. `thisWeek` follows every other
|
|
458
|
+
// preset here and runs up to now, so it is deliberately a part-finished
|
|
459
|
+
// week (on a Sunday it is the whole Monday-to-Sunday week).
|
|
216
460
|
case 'thisWeek':
|
|
217
|
-
return { start: startOfWeek(now, { weekStartsOn:
|
|
461
|
+
return { start: startOfWeek(now, { weekStartsOn: REPORT_WEEK_STARTS_ON }), end: now };
|
|
218
462
|
case 'lastWeek': {
|
|
219
463
|
const previous = subWeeks(now, 1);
|
|
220
464
|
return {
|
|
221
|
-
start: startOfWeek(previous, { weekStartsOn:
|
|
222
|
-
end: endOfWeek(previous, { weekStartsOn:
|
|
465
|
+
start: startOfWeek(previous, { weekStartsOn: REPORT_WEEK_STARTS_ON }),
|
|
466
|
+
end: endOfWeek(previous, { weekStartsOn: REPORT_WEEK_STARTS_ON }),
|
|
223
467
|
};
|
|
224
468
|
}
|
|
225
469
|
case 'last7Days':
|
|
@@ -249,4 +493,4 @@ export class ReportFilterStateService {
|
|
|
249
493
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
|
|
250
494
|
type: Injectable
|
|
251
495
|
}] });
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBV2xCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFHekQsa0ZBQWtGO0FBQ2xGLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsV0FBVyxDQUN6QixDQUE0QixFQUM1QixDQUE0QjtJQUU1QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUs7V0FDckIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRztXQUNmLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUs7V0FDbkIsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsUUFBUTtXQUN6QixDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxN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RSxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2xELEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssWUFBWTtnQkFDZixPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDL0M7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7d0dBbFBVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIGVuZE9mV2Vlaywgc3RhcnRPZk1vbnRoLCBzdGFydE9mUXVhcnRlciwgc3RhcnRPZldlZWssIHN0YXJ0T2ZZZWFyLFxuICBzdWJEYXlzLCBzdWJNb250aHMsIHN1YldlZWtzLFxufSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGZpbHRlci1ncm91cCBkZWZhdWx0cyBhcmUgdGhlIHNhbWUuIENvbXBhcmVkIG9uIHRoZSBmaWVsZHMgYVxuLy8gZGVmYXVsdCBjYW4gYWN0dWFsbHkgY2FycnksIHNvIGtleSBvcmRlciBpbiB0aGUgcGF5bG9hZCBjYW4ndCByZWFkIGFzIGEgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZWZhdWx0KFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0XG4gICAgJiYgYS5lbmQgPT09IGIuZW5kXG4gICAgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZVxuICAgICYmIGEucmVsYXRpdmUgPT09IGIucmVsYXRpdmVcbiAgICAmJiAoYS52YWx1ZXMgPz8gW10pLmxlbmd0aCA9PT0gKGIudmFsdWVzID8/IFtdKS5sZW5ndGhcbiAgICAmJiAoYS52YWx1ZXMgPz8gW10pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSAoYi52YWx1ZXMgPz8gW10pW2luZGV4XSk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gIF0uam9pbignficpO1xufVxuXG5cbi8vIFNlc3Npb24gZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHBlcnNpc3RlZFxuLy8g4oCUIHRoaXMgc2VydmljZSBob2xkcyB0aGVtIHBlciBmaWx0ZXIgR1JPVVAgKHRoZSBwcm9wYWdhdGlvbiB1bml0KSwgcmVzb2x2ZXNcbi8vIHRoZW0gaW50byBwZXItY29tcG9uZW50IG1lbWJlci1maWx0ZXIgdmFsdWVzIGZvciBlYWNoIGRhdGEgcmVxdWVzdCwgYW5kXG4vLyBub3RpZmllcyB0aGUgY29tcG9uZW50cyB3aG9zZSBncm91cHMgY2hhbmdlZCBzbyBvbmx5IHRoZXkgcmVmZXRjaC5cbi8vXG4vLyBBbHNvIHNlc3Npb24tc2NvcGVkOiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbSBhIGNvbXBvbmVudCdzXG4vLyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGEgdmlld2VyJ3MgdG9nZ2xlXG4vLyBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCkuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgc2Vzc2lvbi13aWRlIGJ1Y2tldCBvdmVycmlkZSBmb3IgYWxsXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cy4gVW5zZXQgPSBlYWNoIGNoYXJ0IHVzZXMgaXRzIGF1dGhvcmVkIGdyYW51bGFyaXR5LiBOZXZlclxuICAvLyBwZXJzaXN0ZWQgKGl0IGRpZXMgd2l0aCB0aGlzIHJlcG9ydCB2aWV3KSwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycykg4oCUIFVOTEVTUyB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdFxuICAvLyBpdHNlbGYgY2hhbmdlZCwgd2hpY2ggb25seSBoYXBwZW5zIHdoZW4gYW4gb3BlcmF0b3Igc2F2ZWQgYSBuZXcgZGVmYXVsdCBpblxuICAvLyByZXBvcnQgc2V0dGluZ3MuIFRoYXQgaXMgYW4gZXhwbGljaXQgaW5zdHJ1Y3Rpb24gdG8gcmUtc2VlZCwgc28gaXQgd2lucyBvdmVyXG4gIC8vIHRoZSBzdXJ2aXZpbmcgc2Vzc2lvbiB2YWx1ZTsgd2l0aG91dCBpdCB0aGUgYmFyIGtlZXBzIHNob3dpbmcgd2hhdGV2ZXIgaXQgd2FzXG4gIC8vIGZpcnN0IHNlZWRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgcHVibGljIGluaXQocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBjb25zdCB2YWxpZElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgZ3JvdXApO1xuICAgICAgdmFsaWRJZHMuYWRkKGdyb3VwLmlkKTtcblxuICAgICAgY29uc3QgZGVmYXVsdENoYW5nZWQgPSAhc2FtZURlZmF1bHQoXG4gICAgICAgIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCk/LmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsLFxuICAgICAgICBncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5fdmFsdWVzLmhhcyhncm91cC5pZCkgfHwgZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKV0pIHtcbiAgICAgIGlmICghdmFsaWRJZHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSBncm91cC1ieSBncmFpbiBjaGFuZ2VzIOKAlCBldmVyeSB0aW1lLXNlcmllcyBjaGFydCBsaXN0ZW5zXG4gIC8vIHNvIGl0IHJlZmV0Y2hlcyBhbmQgcmUtYnVja2V0cyAodGhlIG92ZXJyaWRlIGlzbid0IHNjb3BlZCB0byBhbnkgZmlsdGVyXG4gIC8vIGdyb3VwLCBzbyBjaGFuZ2VzRm9yKCkgY2FuJ3QgY2FycnkgaXQpLlxuICBwdWJsaWMgZnJlcXVlbmN5Q2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdyb3VwIHZhbHVlcyByZXNvbHZlZCBpbnRvIHRoaXMgY29tcG9uZW50J3MgbWVtYmVyLWZpbHRlciB2YWx1ZXMg4oCUXG4gIC8vIHdoYXQgdGhlIGRhdGEgcmVxdWVzdCBjYXJyaWVzLiBEaXNhYmxlZCBmaWx0ZXJzIChhdXRob3JlZCBvciBzZXNzaW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBlbnRpcmVseS5cbiAgcHVibGljIHJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIWZpbHRlci5lbmFibGVkIHx8IHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5OiBSZXNvbHZlZEZpbHRlclZhbHVlID0geyBmaWx0ZXJJZDogZmlsdGVyLmlkIH07XG5cbiAgICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgICBlbnRyeS5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuZW5kKSB7XG4gICAgICAgIGVudHJ5LmVuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlcyA9IHZhbHVlLnZhbHVlcztcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RhcnQgfHwgZW50cnkuZW5kIHx8IGVudHJ5LnZhbHVlcyB8fCBlbnRyeS52YWx1ZSkge1xuICAgICAgICByZXNvbHZlZC5wdXNoKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICAvLyBBIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCwgbWFwcGVkIHRvIGEgc2Vzc2lvbiB2YWx1ZSBieSB0eXBlLiBSZWxhdGl2ZVxuICAvLyBkYXRlIHByZXNldHMgcmVzb2x2ZSBhZ2FpbnN0IFwibm93XCIgZWFjaCB0aW1lIHRoZSByZXBvcnQgb3BlbnMsIHNvIGEgc2F2ZWRcbiAgLy8gXCJsYXN0IDEyIG1vbnRoc1wiIHN0YXlzIHJlbGF0aXZlOyBhIGZpeGVkIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkXG4gIC8vIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIFN1bmRheSB0byBTYXR1cmRheSwgaW4gd2hvbGUgZGF5cyDigJQgbm90IHRoZSByb2xsaW5nXG4gICAgICAvLyBzZXZlbiBkYXlzIGBsYXN0N0RheXNgIGdpdmVzLCB3aGljaCBuZXZlciBsaW5lcyB1cCB3aXRoIHRoZSB3ZWVrIGFcbiAgICAgIC8vIHBhcnRuZXIgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBgbGFzdFdlZWtgIGlzIHRoZSBvbmUgYSB3ZWVrbHkgcmVwb3J0XG4gICAgICAvLyB3YW50czogaXQgZW5kcyBhdCBlbmRPZldlZWsgcmF0aGVyIHRoYW4gYXQgYG5vd2AsIGJlY2F1c2UgdGhlIHdlZWsgaXRcbiAgICAgIC8vIG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlciBwcmVzZXQgaGVyZSBhbmQgcnVuc1xuICAgICAgLy8gdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkIHdlZWsuXG4gICAgICBjYXNlICd0aGlzV2Vlayc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mV2Vlayhub3csIHsgd2Vla1N0YXJ0c09uOiAwIH0pLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdFdlZWsnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gc3ViV2Vla3Mobm93LCAxKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IDAgfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiAwIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDdEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCA3KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzMERheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDMwKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDMpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDZNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgNiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MTJNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMTIpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc01vbnRoJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZNb250aChub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1F1YXJ0ZXInOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlF1YXJ0ZXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNZZWFyJzpcbiAgICAgIGNhc2UgJ3llYXJUb0RhdGUnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlllYXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
496
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxHQUM3QixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9ELE9BQU8sRUFJTCxtQkFBbUIsR0FRcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUdwRSxrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxXQUFXLENBQ3pCLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztXQUNyQixDQUFD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YTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakQsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9DO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO3dHQS9mVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIGVuZE9mV2Vlaywgc3RhcnRPZk1vbnRoLCBzdGFydE9mUXVhcnRlciwgc3RhcnRPZldlZWssIHN0YXJ0T2ZZZWFyLFxuICBzdWJEYXlzLCBzdWJNb250aHMsIHN1YldlZWtzLFxufSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9IGZyb20gJy4uL2NvbnN0cy9yZXBvcnQtd2Vlay5jb25zdCc7XG5pbXBvcnQgeyBnZXRab25lZE5vdywgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRTb3J0LFxuICBSZXBvcnRVcmxQYXJhbXMsXG4gIFJlcG9ydFVybFNuYXBzaG90LFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5sZW5ndGggPT09IChiLnZhbHVlcyA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIudmFsdWVzID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gZGF0ZS1yYW5nZSB2YWx1ZXMgY292ZXIgdGhlIHNhbWUgY2FsZW5kYXIgZGF5cy5cbmZ1bmN0aW9uIHNhbWVEYXlzKGE6IEZpbHRlckdyb3VwVmFsdWUsIGI6IEZpbHRlckdyb3VwVmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGVCb3VuZFN0cmluZyhhLnN0YXJ0KSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuc3RhcnQpXG4gICAgJiYgZGF0ZUJvdW5kU3RyaW5nKGEuZW5kKSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuZW5kKTtcbn1cblxuXG4vLyBBIHN0YWJsZSBzaWduYXR1cmUgZm9yIGEgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gVGhlIHJlcG9ydCB0b29sYmFyIGtleXMgaXRzXG4vLyBmcy1maWx0ZXIgb24gdGhpcywgYmVjYXVzZSBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQg4oCUIHdpdGhvdXQgYVxuLy8ga2V5IGNoYW5nZSBpdCBrZWVwcyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIGV2ZW4gYWZ0ZXIgdGhlXG4vLyBjb25maWcgYmVoaW5kIGl0IGhhcyBiZWVuIHJlYnVpbHQuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFNpZ25hdHVyZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiBzdHJpbmcge1xuICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGdyb3VwRGVmYXVsdC5zdGFydCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQuZW5kID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC52YWx1ZSA/PyAnJyxcbiAgICBncm91cERlZmF1bHQucmVsYXRpdmUgPz8gJycsXG4gICAgKGdyb3VwRGVmYXVsdC52YWx1ZXMgPz8gW10pLmpvaW4oJywnKSxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIGFsc28gdGhlIG9uZSBzb3VyY2Ugb2YgdGhlIHZpZXdlciBzdGF0ZSB0aGUgcmVwb3J0IFVSTCBjYXJyaWVzIChncm91cFxuLy8gdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIGxpc3Qgc29ydHMpOiB1cmxTbmFwc2hvdCgpIHNheXMgd2hhdCBkaWZmZXJzIGZyb21cbi8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgaW5pdCgpIHJlc3RvcmVzIGl0LCBhbmQgdXJsQ2hhbmdlcygpIHRlbGxzIHRoZSBob3N0J3Ncbi8vIHNpbmdsZSBVUkwgd3JpdGVyIHdoZW4gdG8gd3JpdGUuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgVVJMOiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbSBhXG4vLyBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCkuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBlZmZlY3RpdmUgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lKS4gUmVsYXRpdmUgcHJlc2V0c1xuICAvLyByZXNvbHZlIGFnYWluc3QgdG9kYXkgaW4gaXQsIGFuZCBkYXRlIGNlbGxzIHJlbmRlciBpbiBpdC5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gc2lnbmFsPHN0cmluZz4oJ1VUQycpO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMuIFVuc2V0ID0gZWFjaCBjaGFydCB1c2VzIGl0cyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCAodGhlIFVSTCBjYXJyaWVzIGl0KSwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF91cmxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG5cbiAgICBjb25zdCB0aW1lem9uZUNoYW5nZWQgPSBwcmV2aW91c1RpbWV6b25lICE9PSB0aGlzLnRpbWV6b25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNHcm91cHMgPSB0aGlzLl9ncm91cHM7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KGdyb3VwLmlkLCBncm91cCk7XG4gICAgICB0aGlzLl9zZWVkKGdyb3VwLCBwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpID8/IG51bGwsIHRpbWV6b25lQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIHBpY2tlciBzaG9ydGN1dCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gVGhlIFVSTCBjb2RlYyBkZWNvZGVzIHByZXNldCBuYW1lcyB0aHJvdWdoIHRoaXMuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb21cbiAgLy8gdGhlIGZldGNoIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZVxuICAvLyBpdCByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50SWQsIHNvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwXG4gIC8vIHZhbHVlLCB0aGUgZ3JhaW4sIGEgbGlzdCBzb3J0LCBvciBhIChyZSlsb2FkIG9mIHRoZSByZXBvcnQuXG4gIHB1YmxpYyB1cmxDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl91cmxDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBzaG91bGQgY2FycnkgZm9yIGByZXBvcnRgOiBvbmx5IHdoYXQgZGlmZmVycyBmcm9tXG4gIC8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgc28gYW4gdW50b3VjaGVkIHJlcG9ydCBoYXMgYSBiYXJlIFVSTCBhbmQga2VlcHNcbiAgLy8gZm9sbG93aW5nIGl0cyBkZWZhdWx0cyB3aGVuIHRoZXkgY2hhbmdlLiBBIGdyb3VwIHRoZSB2aWV3ZXIgY2xlYXJlZCBpc1xuICAvLyBudWxsLiBBIGRhdGUgcmFuZ2UgaXMgY29tcGFyZWQgb24gaXRzIGRheXMgYWdhaW5zdCBpdHMgZGVmYXVsdCByZXNvbHZlZFxuICAvLyB0b2RheSwgc28gYSB2YWx1ZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHVuZGVyIGFub3RoZXIgcHJlc2V0IG5hbWUgKHRoaXNZZWFyXG4gIC8vIGFnYWluc3QgYSB5ZWFyVG9EYXRlIGRlZmF1bHQpIGlzIHN0aWxsIHRoZSBkZWZhdWx0LlxuICBwdWJsaWMgdXJsU25hcHNob3QocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRVcmxTbmFwc2hvdCB7XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmICF0aGlzLl9pc0RlZmF1bHQoZ3JvdXAsIHZhbHVlKSkge1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpKSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgY29tcG9uZW50LmNvbmZpZz8uc29ydCA/PyBudWxsKSkge1xuICAgICAgICBsaXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZ3JvdXBzLCBsaXN0U29ydHMsIGZyZXF1ZW5jeTogdGhpcy5fZnJlcXVlbmN5IH07XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdyb3VwIHZhbHVlcyByZXNvbHZlZCBpbnRvIHRoaXMgY29tcG9uZW50J3MgbWVtYmVyLWZpbHRlciB2YWx1ZXMg4oCUXG4gIC8vIHdoYXQgdGhlIGRhdGEgcmVxdWVzdCBjYXJyaWVzLiBEaXNhYmxlZCBmaWx0ZXJzIChhdXRob3JlZCBvciBzZXNzaW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBlbnRpcmVseS5cbiAgcHVibGljIHJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIWZpbHRlci5lbmFibGVkIHx8IHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHZhbHVlID8gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpIDogbnVsbDtcblxuICAgICAgaWYgKGZpZWxkcykge1xuICAgICAgICByZXNvbHZlZC5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgLi4uZmllbGRzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgc2V0LCBvbmUgZW50cnkgcGVyIGZpbHRlciBncm91cCwgZm9yIHRoZSByZXBvcnQgY2hhdDpcbiAgLy8gdGhlIGFnZW50IHJlYWRzIGl0IHRvIGtub3cgd2hhdCBpcyBvbiBzY3JlZW4uIEdyb3VwIG9yZGVyLCBub3QgdGhlIG9yZGVyXG4gIC8vIHRoZSB2YWx1ZXMgd2VyZSBzZXQgaW4sIHNvIHRoZSBzYW1lIHN0YXRlIGFsd2F5cyByZWFkcyB0aGUgc2FtZS4gQSBncm91cFxuICAvLyB3aXRoIG5vdGhpbmcgaW4gaXQgaXMgbGVmdCBvdXQsIGFuZCBhIHNhdmVkIGRlZmF1bHQgY291bnRzIHVudGlsIHRoZVxuICAvLyB2aWV3ZXIgY2hhbmdlcyBpdC4gUGVyLWZpbHRlciB0b2dnbGVzIGFyZSBhIGNvbXBvbmVudCdzIG93biBidXNpbmVzcywgc29cbiAgLy8gdGhleSBhcmUgbm90IHBhcnQgb2YgaXQuXG4gIHB1YmxpYyB2aWV3ZXJGaWx0ZXJzKCk6IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl92YWx1ZXMuZW50cmllcygpXVxuICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYilcbiAgICAgIC5tYXAoKFtncm91cElkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZHMgPyB7IGdyb3VwSWQsIC4uLmZpZWxkcyB9IDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgPT4gZW50cnkgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50J3MgcmVzb2x2ZWQgdmFsdWVzIGluIG9uZSBhcnJheSDigJQgd2hhdCBhIHJlcG9ydC1sZXZlbCBleHBvcnRcbiAgLy8gY2FycmllcyBzbyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGlzLlxuICAvLyBGaWx0ZXIgaWRzIGFyZSB1bmlxdWUgcGVyIGNvbXBvbmVudCwgc28gdGhlIGJhY2tlbmQgcGlja3MgZWFjaCBjb21wb25lbnQnc1xuICAvLyBvd24gb3V0IG9mIHRoZSBwaWxlLiBBIHBhZ2UgaWQgbmFycm93cyBpdCB0byB0aGF0IHBhZ2UuXG4gIHB1YmxpYyByZXNvbHZlRm9yUmVwb3J0KHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCBwYWdlcyA9IChyZXBvcnQucGFnZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZCk7XG5cbiAgICByZXR1cm4gcGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB0aGlzLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSkpO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQsIGtleXdvcmQgdGV4dCB0cmltbWVkLiBOdWxsIHdoZW5cbiAgLy8gYWxsIG9mIHRoZW0gYXJlIGVtcHR5LiBUaGUgcHJlc2V0IG5hbWUgaXMgVVJMIHN0YXRlIG9ubHksIHNvIGl0IGlzIGxlZnRcbiAgLy8gYmVoaW5kLlxuICBwcml2YXRlIF9yZXNvbHZlZEZpZWxkcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gPSB7fTtcblxuICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgZmllbGRzLnN0YXJ0ID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmVuZCkge1xuICAgICAgZmllbGRzLmVuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIGZpZWxkcy52YWx1ZXMgPSB2YWx1ZS52YWx1ZXM7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICBmaWVsZHMudmFsdWUgPSB2YWx1ZS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgcmVzdG9yZS5ncm91cHMuZm9yRWFjaCgocmF3LCBncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdyb3VwXG4gICAgICAgID8gZGVjb2RlRmlsdGVyVmFsdWUoZ3JvdXAudHlwZSwgcmF3LCAobmFtZSkgPT4gdGhpcy5yZXNvbHZlUmVsYXRpdmUobmFtZSkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgICBpZiAoZ3JvdXA/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdmFsdWUpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGxpc3RzID0gbmV3IE1hcCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG5cbiAgICByZXN0b3JlLmxpc3RTb3J0cy5mb3JFYWNoKChyYXcsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBsaXN0cy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgY29uc3Qgc29ydCA9IGRlY29kZVNvcnQocmF3KTtcblxuICAgICAgaWYgKGNvbXBvbmVudCAmJiBzb3J0ICYmIHRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudElkLCBzb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBVUkwgaXMgdGhlIHdob2xlIHRydXRoIG9uIGEgZmlyc3QgbG9hZDogbm8gZ3JhaW4gaW4gaXQgbWVhbnMgdGhlXG4gICAgLy8gYXV0aG9yZWQgb25lcy4gVGhlIGhvc3Qgc3RpbGwgZHJvcHMgYSBncmFpbiB0aGUgcmVwb3J0IGRvZXMgbm90IG9mZmVyLlxuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IEdSQU5VTEFSSVRZX09QVElPTlNcbiAgICAgIC5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gcmVzdG9yZS5ncm91cEJ5KT8udmFsdWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIERyb3BzIHN0YXRlIGtlcHQgZm9yIGdyb3VwcyBhbmQgbGlzdHMgdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLlxuICBwcml2YXRlIF9wcnVuZShyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKSwgLi4udGhpcy5fY2xlYXJlZF0pIHtcbiAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cElkKSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaXN0SWRzID0gbmV3IFNldCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQpKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50SWQgb2YgWy4uLnRoaXMuX2xpc3RTb3J0cy5rZXlzKCldKSB7XG4gICAgICBpZiAoIWxpc3RJZHMuaGFzKGNvbXBvbmVudElkKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYSBiYXIgc2V0cywga2VlcGluZyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIHdoaWxlIHRoZSBkYXlzIGFyZVxuICAvLyBzdGlsbCB0aGUgc3RvcmVkIGRheXMgKHNlZSBzZXRWYWx1ZSkuXG4gIHByaXZhdGUgX3dpdGhQcmVzZXQoc3RvcmVkOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IEZpbHRlckdyb3VwVmFsdWUge1xuICAgIGNvbnN0IGZpeGVkOiBGaWx0ZXJHcm91cFZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgIGRlbGV0ZSBmaXhlZC5wcmVzZXQ7XG5cbiAgICByZXR1cm4gc3RvcmVkPy5wcmVzZXQgJiYgc2FtZURheXMoc3RvcmVkLCBmaXhlZClcbiAgICAgID8geyAuLi5maXhlZCwgcHJlc2V0OiBzdG9yZWQucHJlc2V0IH1cbiAgICAgIDogZml4ZWQ7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgdmFsdWUgaXMgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCwgYnkgdHlwZTogYSBkYXRlIHJhbmdlIG9uXG4gIC8vIGl0cyBkYXlzICh0aGUgZGVmYXVsdCByZXNvbHZlZCB0b2RheSksIGEgc2VsZWN0IG9uIGl0cyB2YWx1ZXMgaW4gYW55XG4gIC8vIG9yZGVyLCBhIGtleXdvcmQgb24gaXRzIHRleHQuXG4gIHByaXZhdGUgX2lzRGVmYXVsdChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcbiAgICBpZiAoIWRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHNhbWVEYXlzKHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xuXG4gICAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSAoZGVmYXVsdFZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZykuc29ydCgpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID09PSBkZWZhdWx0cy5sZW5ndGhcbiAgICAgICAgICAmJiB2YWx1ZXMuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBpdGVtID09PSBkZWZhdWx0c1tpbmRleF0pO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKHZhbHVlLnZhbHVlID8/ICcnKS50cmltKCkgPT09IChkZWZhdWx0VmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|