@gnwebsoft/ui 4.0.14 → 4.0.16
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/dist/{chunk-QATCBGCZ.cjs → chunk-3CHF3PN3.cjs} +10 -4
- package/dist/chunk-6PMJWQ4R.cjs +1 -1
- package/dist/{chunk-KSYRU4D5.cjs → chunk-F3RJ3NFK.cjs} +421 -290
- package/dist/chunk-LUW7V5GI.cjs +1 -1
- package/dist/chunk-ML5UQCRH.js +2535 -0
- package/dist/chunk-MVPLBJRK.cjs +1 -1
- package/dist/chunk-XTPFOURJ.cjs +1 -1
- package/dist/chunk-Y3QTSDLJ.cjs +1 -1
- package/dist/chunk-YTZULD34.js +2384 -0
- package/dist/core/components/LabelText/LabelText.d.ts.map +1 -1
- package/dist/core/index.cjs +3 -3
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/hooks/index.cjs +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.js +4 -4
- package/dist/types/AsyncSelectPayload.d.ts +4 -4
- package/dist/types/AsyncSelectPayload.d.ts.map +1 -1
- package/dist/types/OptionItem.d.ts +0 -9
- package/dist/types/OptionItem.d.ts.map +1 -1
- package/dist/types/index.cjs +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts.map +1 -1
- package/dist/wrappers/AsyncMultiSelect/types.d.ts +5 -5
- package/dist/wrappers/AsyncMultiSelect/types.d.ts.map +1 -1
- package/dist/wrappers/AsyncSelect/index.d.ts.map +1 -1
- package/dist/wrappers/AsyncSelect/types.d.ts +2 -1
- package/dist/wrappers/AsyncSelect/types.d.ts.map +1 -1
- package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts +2 -6
- package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/wrappers/CheckboxGroup/index.d.ts +1 -1
- package/dist/wrappers/CheckboxGroup/index.d.ts.map +1 -1
- package/dist/wrappers/Field/index.d.ts +1 -1
- package/dist/wrappers/Field/index.d.ts.map +1 -1
- package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts +1 -1
- package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts.map +1 -1
- package/dist/wrappers/SelectElement/SelectElement.d.ts +5 -64
- package/dist/wrappers/SelectElement/SelectElement.d.ts.map +1 -1
- package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts +2 -1
- package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts.map +1 -1
- package/dist/wrappers/index.cjs +3 -3
- package/dist/wrappers/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-6SIBDHHA.js +0 -2529
- package/dist/chunk-WNDGEBEU.js +0 -2253
package/dist/chunk-WNDGEBEU.js
DELETED
|
@@ -1,2253 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useEnhancedTransform,
|
|
3
|
-
useTransform
|
|
4
|
-
} from "./chunk-GVWCGJ3F.js";
|
|
5
|
-
import {
|
|
6
|
-
readValueAsDate
|
|
7
|
-
} from "./chunk-FYU2OIMD.js";
|
|
8
|
-
|
|
9
|
-
// src/wrappers/types/common.ts
|
|
10
|
-
function isValidOption(value) {
|
|
11
|
-
return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
|
|
12
|
-
}
|
|
13
|
-
function normalizeOptions(options, labelField = "Label", valueField = "Value") {
|
|
14
|
-
return options.map((option) => ({
|
|
15
|
-
Label: String(option[labelField] ?? ""),
|
|
16
|
-
Value: option[valueField],
|
|
17
|
-
disabled: Boolean(option.disabled)
|
|
18
|
-
}));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
|
|
22
|
-
import {
|
|
23
|
-
Autocomplete,
|
|
24
|
-
CircularProgress,
|
|
25
|
-
Grid,
|
|
26
|
-
TextField
|
|
27
|
-
} from "@mui/material";
|
|
28
|
-
import match from "autosuggest-highlight/match";
|
|
29
|
-
import parse from "autosuggest-highlight/parse";
|
|
30
|
-
import _, { debounce } from "lodash";
|
|
31
|
-
import {
|
|
32
|
-
useState,
|
|
33
|
-
useRef,
|
|
34
|
-
useMemo,
|
|
35
|
-
useEffect,
|
|
36
|
-
useCallback,
|
|
37
|
-
Fragment
|
|
38
|
-
} from "react";
|
|
39
|
-
import { useController } from "react-hook-form";
|
|
40
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
41
|
-
var Component = function AsyncSelectMultiElement(props) {
|
|
42
|
-
const {
|
|
43
|
-
name,
|
|
44
|
-
disabled,
|
|
45
|
-
control,
|
|
46
|
-
placeholder,
|
|
47
|
-
initialValues,
|
|
48
|
-
label,
|
|
49
|
-
queryFn,
|
|
50
|
-
variant,
|
|
51
|
-
labelField = "Label",
|
|
52
|
-
valueField = "Value",
|
|
53
|
-
...rest
|
|
54
|
-
} = props;
|
|
55
|
-
const {
|
|
56
|
-
field,
|
|
57
|
-
fieldState: { error }
|
|
58
|
-
} = useController({
|
|
59
|
-
name,
|
|
60
|
-
control
|
|
61
|
-
});
|
|
62
|
-
const multiSelectRef = useRef(null);
|
|
63
|
-
const [selectedOptions, setSelectedOptions] = useState([]);
|
|
64
|
-
const [inputValue, setInputValue] = useState("");
|
|
65
|
-
const [options, setOptions] = useState([]);
|
|
66
|
-
const [loading, setLoading] = useState(false);
|
|
67
|
-
const initialValuesLoaded = useRef(
|
|
68
|
-
!(initialValues && initialValues.length > 0)
|
|
69
|
-
);
|
|
70
|
-
const inputValue2 = useMemo(() => inputValue, [inputValue]);
|
|
71
|
-
const setInputValue2 = useCallback(
|
|
72
|
-
(inputValue3) => setInputValue(inputValue3),
|
|
73
|
-
[]
|
|
74
|
-
);
|
|
75
|
-
const fetchData = useMemo(
|
|
76
|
-
() => debounce(
|
|
77
|
-
(payload, callback) => {
|
|
78
|
-
queryFn(payload).then((c) => callback(c));
|
|
79
|
-
},
|
|
80
|
-
400
|
|
81
|
-
),
|
|
82
|
-
[queryFn]
|
|
83
|
-
);
|
|
84
|
-
const fillOptions = useCallback(
|
|
85
|
-
(results) => {
|
|
86
|
-
let newOptions = [];
|
|
87
|
-
if (selectedOptions) {
|
|
88
|
-
newOptions = [...selectedOptions];
|
|
89
|
-
}
|
|
90
|
-
if (results) {
|
|
91
|
-
const newlyAdded = _.differenceBy(
|
|
92
|
-
results,
|
|
93
|
-
selectedOptions,
|
|
94
|
-
(c) => c[valueField]
|
|
95
|
-
);
|
|
96
|
-
newOptions = [...newOptions, ...newlyAdded];
|
|
97
|
-
}
|
|
98
|
-
setOptions(newOptions);
|
|
99
|
-
setLoading(false);
|
|
100
|
-
},
|
|
101
|
-
[selectedOptions, valueField]
|
|
102
|
-
);
|
|
103
|
-
useEffect(() => {
|
|
104
|
-
if (initialValuesLoaded.current) return void 0;
|
|
105
|
-
let active = true;
|
|
106
|
-
const payload = {
|
|
107
|
-
query: null,
|
|
108
|
-
initialValues
|
|
109
|
-
};
|
|
110
|
-
setLoading(true);
|
|
111
|
-
fetchData(payload, (results) => {
|
|
112
|
-
if (active && results) {
|
|
113
|
-
setSelectedOptions([...results]);
|
|
114
|
-
field.onChange([...results.map((c) => c[valueField])]);
|
|
115
|
-
initialValuesLoaded.current = true;
|
|
116
|
-
setLoading(false);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
return () => {
|
|
120
|
-
active = false;
|
|
121
|
-
};
|
|
122
|
-
}, [initialValues, fetchData, field, valueField]);
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
let active = true;
|
|
125
|
-
if (inputValue2 === "" || initialValuesLoaded.current === false) {
|
|
126
|
-
setOptions(selectedOptions ? [...selectedOptions] : []);
|
|
127
|
-
return void 0;
|
|
128
|
-
}
|
|
129
|
-
setLoading(true);
|
|
130
|
-
const payload = {
|
|
131
|
-
query: inputValue2,
|
|
132
|
-
initialValues: null
|
|
133
|
-
};
|
|
134
|
-
fetchData(payload, (results) => {
|
|
135
|
-
if (active) {
|
|
136
|
-
fillOptions(results);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return () => {
|
|
140
|
-
active = false;
|
|
141
|
-
};
|
|
142
|
-
}, [initialValues, inputValue2, fetchData, selectedOptions, fillOptions]);
|
|
143
|
-
const handleChange = (_2, newSelectedOptions, reason) => {
|
|
144
|
-
if (reason === "clear" || newSelectedOptions.length === 0) {
|
|
145
|
-
setSelectedOptions([]);
|
|
146
|
-
field.onChange([]);
|
|
147
|
-
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
148
|
-
setSelectedOptions(newSelectedOptions);
|
|
149
|
-
field.onChange(newSelectedOptions.map((c) => c[valueField]));
|
|
150
|
-
}
|
|
151
|
-
setOptions([]);
|
|
152
|
-
};
|
|
153
|
-
const getOptionValue = (option) => {
|
|
154
|
-
return option ? String(option[valueField]) : "";
|
|
155
|
-
};
|
|
156
|
-
const getOptionLabel = (option) => {
|
|
157
|
-
return option ? String(option[labelField]) : "";
|
|
158
|
-
};
|
|
159
|
-
return /* @__PURE__ */ jsx(
|
|
160
|
-
Autocomplete,
|
|
161
|
-
{
|
|
162
|
-
ref: multiSelectRef,
|
|
163
|
-
multiple: true,
|
|
164
|
-
loading,
|
|
165
|
-
getOptionLabel,
|
|
166
|
-
getOptionKey: getOptionValue,
|
|
167
|
-
isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
|
|
168
|
-
options,
|
|
169
|
-
value: selectedOptions,
|
|
170
|
-
disabled,
|
|
171
|
-
filterSelectedOptions: true,
|
|
172
|
-
onChange: handleChange,
|
|
173
|
-
onInputChange: (_2, newInputValue) => {
|
|
174
|
-
setInputValue2(newInputValue);
|
|
175
|
-
},
|
|
176
|
-
renderInput: (params) => /* @__PURE__ */ jsx(
|
|
177
|
-
TextField,
|
|
178
|
-
{
|
|
179
|
-
...params,
|
|
180
|
-
label,
|
|
181
|
-
error: !!error,
|
|
182
|
-
helperText: error ? error.message : "",
|
|
183
|
-
placeholder,
|
|
184
|
-
slotProps: {
|
|
185
|
-
input: {
|
|
186
|
-
...params.InputProps,
|
|
187
|
-
endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
188
|
-
loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
|
|
189
|
-
params.InputProps.endAdornment
|
|
190
|
-
] })
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
variant: variant ? variant : "outlined"
|
|
194
|
-
}
|
|
195
|
-
),
|
|
196
|
-
renderOption: (props2, option, state) => {
|
|
197
|
-
const { key, ...optionProps } = props2;
|
|
198
|
-
const optionLabel = getOptionLabel(option);
|
|
199
|
-
const matches = match(optionLabel, state.inputValue, { insideWords: true });
|
|
200
|
-
const parts = parse(optionLabel, matches);
|
|
201
|
-
return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
|
|
202
|
-
"span",
|
|
203
|
-
{
|
|
204
|
-
style: {
|
|
205
|
-
fontWeight: part.highlight ? 700 : 400
|
|
206
|
-
},
|
|
207
|
-
children: part.text
|
|
208
|
-
},
|
|
209
|
-
index
|
|
210
|
-
)) }) }, key);
|
|
211
|
-
},
|
|
212
|
-
...rest
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
};
|
|
216
|
-
var AsyncSelectMultiElement2 = ({
|
|
217
|
-
gridProps,
|
|
218
|
-
...props
|
|
219
|
-
}) => {
|
|
220
|
-
if (gridProps) {
|
|
221
|
-
return /* @__PURE__ */ jsx(
|
|
222
|
-
Grid,
|
|
223
|
-
{
|
|
224
|
-
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
225
|
-
children: /* @__PURE__ */ jsx(
|
|
226
|
-
Component,
|
|
227
|
-
{
|
|
228
|
-
...props
|
|
229
|
-
}
|
|
230
|
-
)
|
|
231
|
-
}
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
return /* @__PURE__ */ jsx(Component, { ...props });
|
|
235
|
-
};
|
|
236
|
-
AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
|
|
237
|
-
|
|
238
|
-
// src/wrappers/CheckboxElement/CheckboxElement.tsx
|
|
239
|
-
import {
|
|
240
|
-
Checkbox,
|
|
241
|
-
FormControl,
|
|
242
|
-
FormControlLabel,
|
|
243
|
-
FormGroup,
|
|
244
|
-
FormHelperText,
|
|
245
|
-
Grid as Grid2
|
|
246
|
-
} from "@mui/material";
|
|
247
|
-
import { useController as useController2 } from "react-hook-form";
|
|
248
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
249
|
-
var Component2 = function CheckboxElement(props) {
|
|
250
|
-
const {
|
|
251
|
-
name,
|
|
252
|
-
control,
|
|
253
|
-
label,
|
|
254
|
-
labelProps,
|
|
255
|
-
helperText,
|
|
256
|
-
parseError,
|
|
257
|
-
transform,
|
|
258
|
-
disabled,
|
|
259
|
-
onChange: customOnChange,
|
|
260
|
-
...rest
|
|
261
|
-
} = props;
|
|
262
|
-
const {
|
|
263
|
-
field,
|
|
264
|
-
fieldState: { error }
|
|
265
|
-
} = useController2({
|
|
266
|
-
name,
|
|
267
|
-
control,
|
|
268
|
-
disabled
|
|
269
|
-
});
|
|
270
|
-
if (field.value == null || field.value == void 0) {
|
|
271
|
-
field.onChange(false);
|
|
272
|
-
}
|
|
273
|
-
const customOutputTransform = transform?.output;
|
|
274
|
-
const { value, onChange } = useTransform({
|
|
275
|
-
value: field.value,
|
|
276
|
-
onChange: field.onChange,
|
|
277
|
-
transform: {
|
|
278
|
-
input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
|
|
279
|
-
output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
|
|
280
|
-
const event = eventOrValue;
|
|
281
|
-
const checked = _value;
|
|
282
|
-
return customOutputTransform(event, checked);
|
|
283
|
-
} : (eventOrValue, _value) => {
|
|
284
|
-
const checked = _value;
|
|
285
|
-
return checked;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
const handleChange = (event, checked) => {
|
|
290
|
-
onChange(event, checked);
|
|
291
|
-
if (typeof customOnChange === "function") {
|
|
292
|
-
customOnChange(event, checked);
|
|
293
|
-
}
|
|
294
|
-
};
|
|
295
|
-
const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
|
|
296
|
-
return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
|
|
297
|
-
/* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
|
|
298
|
-
FormControlLabel,
|
|
299
|
-
{
|
|
300
|
-
label: label || "",
|
|
301
|
-
...labelProps,
|
|
302
|
-
disabled,
|
|
303
|
-
control: /* @__PURE__ */ jsx2(
|
|
304
|
-
Checkbox,
|
|
305
|
-
{
|
|
306
|
-
...rest,
|
|
307
|
-
color: rest.color || "primary",
|
|
308
|
-
checked: value,
|
|
309
|
-
disabled,
|
|
310
|
-
onChange: handleChange,
|
|
311
|
-
ref: field.ref
|
|
312
|
-
}
|
|
313
|
-
)
|
|
314
|
-
}
|
|
315
|
-
) }),
|
|
316
|
-
(displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
|
|
317
|
-
] });
|
|
318
|
-
};
|
|
319
|
-
var CheckboxElement2 = ({
|
|
320
|
-
gridProps = {},
|
|
321
|
-
...props
|
|
322
|
-
}) => {
|
|
323
|
-
return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
// src/wrappers/CheckboxGroup/CheckboxGroup.tsx
|
|
327
|
-
import {
|
|
328
|
-
Checkbox as Checkbox2,
|
|
329
|
-
FormControl as FormControl2,
|
|
330
|
-
FormControlLabel as FormControlLabel2,
|
|
331
|
-
FormGroup as FormGroup2,
|
|
332
|
-
FormHelperText as FormHelperText2,
|
|
333
|
-
Grid as Grid3
|
|
334
|
-
} from "@mui/material";
|
|
335
|
-
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
|
|
336
|
-
import { useController as useController3 } from "react-hook-form";
|
|
337
|
-
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
338
|
-
var Component3 = function CheckboxGroup(props) {
|
|
339
|
-
const {
|
|
340
|
-
name,
|
|
341
|
-
control,
|
|
342
|
-
labelProps,
|
|
343
|
-
labelKey = "Label",
|
|
344
|
-
valueKey = "Value",
|
|
345
|
-
options,
|
|
346
|
-
...rest
|
|
347
|
-
} = props;
|
|
348
|
-
const {
|
|
349
|
-
field,
|
|
350
|
-
fieldState: { error }
|
|
351
|
-
} = useController3({
|
|
352
|
-
name,
|
|
353
|
-
control,
|
|
354
|
-
disabled: rest.disabled
|
|
355
|
-
});
|
|
356
|
-
const [selectedValues, setSelectedValues] = useState2(
|
|
357
|
-
options.filter((c) => field.value?.includes(c[valueKey])).map((c) => c[valueKey]) || []
|
|
358
|
-
);
|
|
359
|
-
useEffect2(() => {
|
|
360
|
-
field.onChange(selectedValues ? [...selectedValues] : []);
|
|
361
|
-
}, [selectedValues]);
|
|
362
|
-
const handleChange = useCallback2((event) => {
|
|
363
|
-
if (event.target.checked) {
|
|
364
|
-
setSelectedValues((prev) => [...prev, event.target.value]);
|
|
365
|
-
} else {
|
|
366
|
-
setSelectedValues((prev) => prev.filter((item) => item !== event.target.value));
|
|
367
|
-
}
|
|
368
|
-
}, []);
|
|
369
|
-
return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
|
|
370
|
-
/* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx3(
|
|
371
|
-
FormControlLabel2,
|
|
372
|
-
{
|
|
373
|
-
label: option[labelKey],
|
|
374
|
-
...labelProps,
|
|
375
|
-
control: /* @__PURE__ */ jsx3(
|
|
376
|
-
Checkbox2,
|
|
377
|
-
{
|
|
378
|
-
...rest,
|
|
379
|
-
color: rest.color || "primary",
|
|
380
|
-
value: option[valueKey],
|
|
381
|
-
checked: selectedValues.includes(option[valueKey]),
|
|
382
|
-
onChange: handleChange
|
|
383
|
-
}
|
|
384
|
-
)
|
|
385
|
-
},
|
|
386
|
-
`${option[valueKey]}`
|
|
387
|
-
)) }),
|
|
388
|
-
error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
|
|
389
|
-
] });
|
|
390
|
-
};
|
|
391
|
-
var CheckboxGroup2 = ({
|
|
392
|
-
gridProps = {},
|
|
393
|
-
...props
|
|
394
|
-
}) => {
|
|
395
|
-
return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
|
|
396
|
-
};
|
|
397
|
-
CheckboxGroup2.displayName = "CheckboxGroup";
|
|
398
|
-
|
|
399
|
-
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
400
|
-
import { Grid as Grid4 } from "@mui/material";
|
|
401
|
-
import { forwardRef as forwardRef2 } from "react";
|
|
402
|
-
|
|
403
|
-
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
404
|
-
import { useForkRef } from "@mui/material";
|
|
405
|
-
import { DatePicker } from "@mui/x-date-pickers";
|
|
406
|
-
import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
|
|
407
|
-
import { useController as useController4 } from "react-hook-form";
|
|
408
|
-
|
|
409
|
-
// src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
|
|
410
|
-
import { useLocalizationContext } from "@mui/x-date-pickers/internals";
|
|
411
|
-
import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
|
|
412
|
-
function readDatePickerValueAsDate(adapter, value) {
|
|
413
|
-
if (value === null || value === void 0) {
|
|
414
|
-
return null;
|
|
415
|
-
}
|
|
416
|
-
if (typeof value === "string") {
|
|
417
|
-
if (value === "") {
|
|
418
|
-
return null;
|
|
419
|
-
}
|
|
420
|
-
const parsedDate = adapter.utils.date(value);
|
|
421
|
-
return parsedDate;
|
|
422
|
-
}
|
|
423
|
-
return value;
|
|
424
|
-
}
|
|
425
|
-
function useDatePickerValue(options) {
|
|
426
|
-
const { field, transform } = options;
|
|
427
|
-
const adapter = useLocalizationContext();
|
|
428
|
-
const value = useMemo2(() => {
|
|
429
|
-
if (typeof transform?.input === "function") {
|
|
430
|
-
return transform.input(field.value);
|
|
431
|
-
}
|
|
432
|
-
return readDatePickerValueAsDate(adapter, field.value);
|
|
433
|
-
}, [field.value, transform?.input, adapter]);
|
|
434
|
-
const onChange = useCallback3(
|
|
435
|
-
(newValue, context) => {
|
|
436
|
-
if (typeof transform?.output === "function") {
|
|
437
|
-
const transformedValue = transform.output(newValue, context);
|
|
438
|
-
field.onChange(transformedValue);
|
|
439
|
-
} else {
|
|
440
|
-
field.onChange(newValue);
|
|
441
|
-
}
|
|
442
|
-
},
|
|
443
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
444
|
-
[field.onChange, transform?.output]
|
|
445
|
-
);
|
|
446
|
-
return {
|
|
447
|
-
value,
|
|
448
|
-
onChange
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
|
|
453
|
-
import { useMemo as useMemo3 } from "react";
|
|
454
|
-
var DEFAULT_ERROR_MESSAGES = {
|
|
455
|
-
invalidDate: "Please enter a valid date",
|
|
456
|
-
minDate: "Date must be after the minimum allowed date",
|
|
457
|
-
maxDate: "Date must be before the maximum allowed date",
|
|
458
|
-
disabledDate: "This date is not allowed",
|
|
459
|
-
required: "This field is required"
|
|
460
|
-
};
|
|
461
|
-
function useDatePickerValidation(options) {
|
|
462
|
-
const { fieldState, validation, parseError, value } = options;
|
|
463
|
-
const validationResult = useMemo3(() => {
|
|
464
|
-
const { error: fieldError, invalid } = fieldState;
|
|
465
|
-
let currentError = fieldError;
|
|
466
|
-
if (!fieldError && value && validation) {
|
|
467
|
-
const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
|
|
468
|
-
if (minDate && value < minDate) {
|
|
469
|
-
currentError = {
|
|
470
|
-
type: "minDate",
|
|
471
|
-
message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
|
|
472
|
-
};
|
|
473
|
-
} else if (maxDate && value > maxDate) {
|
|
474
|
-
currentError = {
|
|
475
|
-
type: "maxDate",
|
|
476
|
-
message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
|
|
477
|
-
};
|
|
478
|
-
} else if (shouldDisableDate && shouldDisableDate(value)) {
|
|
479
|
-
currentError = {
|
|
480
|
-
type: "disabledDate",
|
|
481
|
-
message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
|
|
482
|
-
};
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
const hasError = Boolean(currentError);
|
|
486
|
-
return {
|
|
487
|
-
hasError,
|
|
488
|
-
error: currentError,
|
|
489
|
-
invalid: invalid || hasError
|
|
490
|
-
};
|
|
491
|
-
}, [fieldState, validation, value]);
|
|
492
|
-
const errorMessage = useMemo3(() => {
|
|
493
|
-
if (!validationResult.error) {
|
|
494
|
-
return null;
|
|
495
|
-
}
|
|
496
|
-
if (parseError) {
|
|
497
|
-
return parseError(validationResult.error);
|
|
498
|
-
}
|
|
499
|
-
if (typeof validationResult.error === "string") {
|
|
500
|
-
return validationResult.error;
|
|
501
|
-
}
|
|
502
|
-
if ("message" in validationResult.error && validationResult.error.message) {
|
|
503
|
-
return validationResult.error.message;
|
|
504
|
-
}
|
|
505
|
-
if ("type" in validationResult.error) {
|
|
506
|
-
const errorType = validationResult.error.type;
|
|
507
|
-
switch (errorType) {
|
|
508
|
-
case "required":
|
|
509
|
-
return DEFAULT_ERROR_MESSAGES.required;
|
|
510
|
-
case "minDate":
|
|
511
|
-
return DEFAULT_ERROR_MESSAGES.minDate;
|
|
512
|
-
case "maxDate":
|
|
513
|
-
return DEFAULT_ERROR_MESSAGES.maxDate;
|
|
514
|
-
case "disabledDate":
|
|
515
|
-
return DEFAULT_ERROR_MESSAGES.disabledDate;
|
|
516
|
-
case "invalidDate":
|
|
517
|
-
default:
|
|
518
|
-
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
522
|
-
}, [validationResult.error, parseError]);
|
|
523
|
-
return {
|
|
524
|
-
...validationResult,
|
|
525
|
-
errorMessage
|
|
526
|
-
};
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
|
|
530
|
-
import { useTheme } from "@mui/material";
|
|
531
|
-
import { useMemo as useMemo4 } from "react";
|
|
532
|
-
function useDatePickerStyles(options = {}) {
|
|
533
|
-
const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
|
|
534
|
-
const theme = useTheme();
|
|
535
|
-
const computedSx = useMemo4(() => {
|
|
536
|
-
const baseStyles = {
|
|
537
|
-
// Input field styling
|
|
538
|
-
"& .MuiOutlinedInput-root": {
|
|
539
|
-
backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
540
|
-
// Transition for smooth state changes
|
|
541
|
-
transition: theme.transitions.create([
|
|
542
|
-
"background-color",
|
|
543
|
-
"border-color",
|
|
544
|
-
"color"
|
|
545
|
-
], {
|
|
546
|
-
duration: theme.transitions.duration.short
|
|
547
|
-
}),
|
|
548
|
-
// Error state styling
|
|
549
|
-
...hasError && {
|
|
550
|
-
borderColor: theme.palette.error.main,
|
|
551
|
-
"&:hover": {
|
|
552
|
-
borderColor: theme.palette.error.main
|
|
553
|
-
},
|
|
554
|
-
"&.Mui-focused": {
|
|
555
|
-
borderColor: theme.palette.error.main,
|
|
556
|
-
boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
|
|
557
|
-
// 25 is 15% opacity in hex
|
|
558
|
-
}
|
|
559
|
-
},
|
|
560
|
-
// Loading state styling
|
|
561
|
-
...loading && {
|
|
562
|
-
opacity: 0.7,
|
|
563
|
-
pointerEvents: "none"
|
|
564
|
-
}
|
|
565
|
-
},
|
|
566
|
-
// Input element styling
|
|
567
|
-
"& .MuiInputBase-input": {
|
|
568
|
-
cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
|
|
569
|
-
// Read-only specific styling
|
|
570
|
-
...textReadOnly && !disabled && {
|
|
571
|
-
cursor: "pointer",
|
|
572
|
-
userSelect: "none",
|
|
573
|
-
caretColor: "transparent"
|
|
574
|
-
// Hide text cursor in read-only mode
|
|
575
|
-
},
|
|
576
|
-
// Loading state
|
|
577
|
-
...loading && {
|
|
578
|
-
cursor: "wait"
|
|
579
|
-
}
|
|
580
|
-
},
|
|
581
|
-
// Required field asterisk styling
|
|
582
|
-
"& .MuiInputLabel-asterisk": {
|
|
583
|
-
color: theme.palette.error.main,
|
|
584
|
-
fontSize: "1.2em"
|
|
585
|
-
},
|
|
586
|
-
// Label styling with better contrast
|
|
587
|
-
"& .MuiInputLabel-root": {
|
|
588
|
-
color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
|
|
589
|
-
// Ensure proper contrast for disabled state
|
|
590
|
-
...disabled && {
|
|
591
|
-
color: theme.palette.text.disabled
|
|
592
|
-
}
|
|
593
|
-
},
|
|
594
|
-
// Helper text styling
|
|
595
|
-
"& .MuiFormHelperText-root": {
|
|
596
|
-
marginLeft: theme.spacing(1),
|
|
597
|
-
marginRight: theme.spacing(1),
|
|
598
|
-
// Error state
|
|
599
|
-
...hasError && {
|
|
600
|
-
color: theme.palette.error.main
|
|
601
|
-
}
|
|
602
|
-
},
|
|
603
|
-
// Calendar icon styling
|
|
604
|
-
"& .MuiInputAdornment-root": {
|
|
605
|
-
color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
|
|
606
|
-
},
|
|
607
|
-
// Focus ring for accessibility
|
|
608
|
-
"& .MuiOutlinedInput-root.Mui-focused": {
|
|
609
|
-
outline: `2px solid ${theme.palette.primary.main}50`,
|
|
610
|
-
// 50 is 31% opacity
|
|
611
|
-
outlineOffset: "2px"
|
|
612
|
-
},
|
|
613
|
-
// Enhanced contrast for dark themes
|
|
614
|
-
...theme.palette.mode === "dark" && {
|
|
615
|
-
"& .MuiOutlinedInput-root": {
|
|
616
|
-
borderWidth: 2
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
};
|
|
620
|
-
return customSx ? [baseStyles, customSx] : baseStyles;
|
|
621
|
-
}, [
|
|
622
|
-
theme,
|
|
623
|
-
disabled,
|
|
624
|
-
hasError,
|
|
625
|
-
loading,
|
|
626
|
-
textReadOnly,
|
|
627
|
-
customSx
|
|
628
|
-
]);
|
|
629
|
-
const className = useMemo4(() => {
|
|
630
|
-
const classes = [];
|
|
631
|
-
if (disabled) classes.push("DatePickerElement--disabled");
|
|
632
|
-
if (hasError) classes.push("DatePickerElement--error");
|
|
633
|
-
if (loading) classes.push("DatePickerElement--loading");
|
|
634
|
-
if (textReadOnly) classes.push("DatePickerElement--readOnly");
|
|
635
|
-
return classes.length > 0 ? classes.join(" ") : void 0;
|
|
636
|
-
}, [disabled, hasError, loading, textReadOnly]);
|
|
637
|
-
return {
|
|
638
|
-
sx: computedSx,
|
|
639
|
-
className
|
|
640
|
-
};
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
644
|
-
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
645
|
-
var DatePickerElementCore = forwardRef(
|
|
646
|
-
(props, ref) => {
|
|
647
|
-
const {
|
|
648
|
-
name,
|
|
649
|
-
required = false,
|
|
650
|
-
control,
|
|
651
|
-
parseError,
|
|
652
|
-
transform,
|
|
653
|
-
validation,
|
|
654
|
-
label,
|
|
655
|
-
placeholder,
|
|
656
|
-
textReadOnly = false,
|
|
657
|
-
helperText,
|
|
658
|
-
inputProps = {},
|
|
659
|
-
slotProps = {},
|
|
660
|
-
datePickerProps = {},
|
|
661
|
-
variant = "outlined",
|
|
662
|
-
loading = false,
|
|
663
|
-
LoadingComponent,
|
|
664
|
-
...restProps
|
|
665
|
-
} = props;
|
|
666
|
-
const {
|
|
667
|
-
disabled,
|
|
668
|
-
inputRef: externalInputRef,
|
|
669
|
-
onClose,
|
|
670
|
-
...restDatePickerProps
|
|
671
|
-
} = datePickerProps;
|
|
672
|
-
const { field, fieldState } = useController4({
|
|
673
|
-
name,
|
|
674
|
-
control,
|
|
675
|
-
defaultValue: null
|
|
676
|
-
// Let react-hook-form handle the default value typing
|
|
677
|
-
});
|
|
678
|
-
const { value, onChange: onValueChange } = useDatePickerValue({
|
|
679
|
-
field,
|
|
680
|
-
transform
|
|
681
|
-
});
|
|
682
|
-
const { hasError, errorMessage, invalid } = useDatePickerValidation({
|
|
683
|
-
fieldState,
|
|
684
|
-
validation,
|
|
685
|
-
parseError,
|
|
686
|
-
value
|
|
687
|
-
});
|
|
688
|
-
const { className } = useDatePickerStyles({
|
|
689
|
-
disabled,
|
|
690
|
-
hasError,
|
|
691
|
-
loading,
|
|
692
|
-
textReadOnly
|
|
693
|
-
});
|
|
694
|
-
const handleInputRef = useForkRef(field.ref, externalInputRef);
|
|
695
|
-
const handleChange = useCallback4(
|
|
696
|
-
(newValue, context) => {
|
|
697
|
-
onValueChange(newValue, context);
|
|
698
|
-
},
|
|
699
|
-
[onValueChange]
|
|
700
|
-
);
|
|
701
|
-
const handleClose = useCallback4(
|
|
702
|
-
(...args) => {
|
|
703
|
-
field.onBlur();
|
|
704
|
-
if (onClose) {
|
|
705
|
-
onClose(...args);
|
|
706
|
-
}
|
|
707
|
-
},
|
|
708
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
709
|
-
[field.onBlur, onClose]
|
|
710
|
-
);
|
|
711
|
-
const handleTextFieldBlur = useCallback4(
|
|
712
|
-
(event) => {
|
|
713
|
-
field.onBlur();
|
|
714
|
-
if (typeof inputProps.onBlur === "function") {
|
|
715
|
-
inputProps.onBlur(event);
|
|
716
|
-
}
|
|
717
|
-
},
|
|
718
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
719
|
-
[field.onBlur, inputProps.onBlur]
|
|
720
|
-
);
|
|
721
|
-
const memoizedSlotProps = useMemo5(
|
|
722
|
-
() => ({
|
|
723
|
-
...slotProps,
|
|
724
|
-
actionBar: {
|
|
725
|
-
actions: ["clear", "today", "cancel", "accept"],
|
|
726
|
-
...slotProps.actionBar
|
|
727
|
-
},
|
|
728
|
-
textField: {
|
|
729
|
-
...inputProps,
|
|
730
|
-
required,
|
|
731
|
-
placeholder,
|
|
732
|
-
fullWidth: true,
|
|
733
|
-
variant,
|
|
734
|
-
onBlur: handleTextFieldBlur,
|
|
735
|
-
error: hasError,
|
|
736
|
-
helperText: hasError ? errorMessage : helperText,
|
|
737
|
-
inputProps: {
|
|
738
|
-
readOnly: textReadOnly,
|
|
739
|
-
"aria-invalid": invalid,
|
|
740
|
-
"aria-describedby": hasError ? `${name}-error` : void 0,
|
|
741
|
-
...inputProps.inputProps
|
|
742
|
-
},
|
|
743
|
-
// Add loading indicator if provided
|
|
744
|
-
...loading && LoadingComponent && {
|
|
745
|
-
InputProps: {
|
|
746
|
-
endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
|
|
747
|
-
...inputProps.InputProps
|
|
748
|
-
}
|
|
749
|
-
},
|
|
750
|
-
...slotProps.textField
|
|
751
|
-
}
|
|
752
|
-
}),
|
|
753
|
-
[
|
|
754
|
-
slotProps,
|
|
755
|
-
inputProps,
|
|
756
|
-
required,
|
|
757
|
-
placeholder,
|
|
758
|
-
variant,
|
|
759
|
-
handleTextFieldBlur,
|
|
760
|
-
hasError,
|
|
761
|
-
errorMessage,
|
|
762
|
-
helperText,
|
|
763
|
-
textReadOnly,
|
|
764
|
-
invalid,
|
|
765
|
-
name,
|
|
766
|
-
loading,
|
|
767
|
-
LoadingComponent
|
|
768
|
-
]
|
|
769
|
-
);
|
|
770
|
-
return /* @__PURE__ */ jsx4(
|
|
771
|
-
DatePicker,
|
|
772
|
-
{
|
|
773
|
-
...restProps,
|
|
774
|
-
...restDatePickerProps,
|
|
775
|
-
ref,
|
|
776
|
-
name,
|
|
777
|
-
value,
|
|
778
|
-
onChange: handleChange,
|
|
779
|
-
onClose: handleClose,
|
|
780
|
-
inputRef: handleInputRef,
|
|
781
|
-
label,
|
|
782
|
-
disabled,
|
|
783
|
-
className,
|
|
784
|
-
slotProps: memoizedSlotProps,
|
|
785
|
-
"aria-invalid": invalid,
|
|
786
|
-
"aria-describedby": hasError ? `${name}-error` : void 0
|
|
787
|
-
}
|
|
788
|
-
);
|
|
789
|
-
}
|
|
790
|
-
);
|
|
791
|
-
DatePickerElementCore.displayName = "DatePickerElementCore";
|
|
792
|
-
|
|
793
|
-
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
794
|
-
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
795
|
-
var DatePickerElement = forwardRef2((props, ref) => {
|
|
796
|
-
const {
|
|
797
|
-
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
798
|
-
...coreProps
|
|
799
|
-
} = props;
|
|
800
|
-
if (gridProps === false) {
|
|
801
|
-
return /* @__PURE__ */ jsx5(
|
|
802
|
-
DatePickerElementCore,
|
|
803
|
-
{
|
|
804
|
-
ref,
|
|
805
|
-
...coreProps
|
|
806
|
-
}
|
|
807
|
-
);
|
|
808
|
-
}
|
|
809
|
-
return /* @__PURE__ */ jsx5(
|
|
810
|
-
Grid4,
|
|
811
|
-
{
|
|
812
|
-
ref,
|
|
813
|
-
...gridProps,
|
|
814
|
-
children: /* @__PURE__ */ jsx5(
|
|
815
|
-
DatePickerElementCore,
|
|
816
|
-
{
|
|
817
|
-
...coreProps
|
|
818
|
-
}
|
|
819
|
-
)
|
|
820
|
-
}
|
|
821
|
-
);
|
|
822
|
-
});
|
|
823
|
-
DatePickerElement.displayName = "DatePickerElement";
|
|
824
|
-
|
|
825
|
-
// src/wrappers/DatePickerElement/utils.ts
|
|
826
|
-
function isValidDate(value) {
|
|
827
|
-
if (value === null || value === void 0) {
|
|
828
|
-
return false;
|
|
829
|
-
}
|
|
830
|
-
if (value instanceof Date) {
|
|
831
|
-
return !isNaN(value.getTime());
|
|
832
|
-
}
|
|
833
|
-
if (typeof value === "object" && value !== null) {
|
|
834
|
-
if ("isValid" in value && typeof value.isValid === "function") {
|
|
835
|
-
return value.isValid();
|
|
836
|
-
}
|
|
837
|
-
if ("isValid" in value && typeof value.isValid === "boolean") {
|
|
838
|
-
return value.isValid;
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
return false;
|
|
842
|
-
}
|
|
843
|
-
function isParsableDateString(value) {
|
|
844
|
-
if (typeof value !== "string" || value === "") {
|
|
845
|
-
return false;
|
|
846
|
-
}
|
|
847
|
-
const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
|
|
848
|
-
if (isoDateRegex.test(value)) {
|
|
849
|
-
return true;
|
|
850
|
-
}
|
|
851
|
-
const parsed = new Date(value);
|
|
852
|
-
return !isNaN(parsed.getTime());
|
|
853
|
-
}
|
|
854
|
-
function createDateInputTransform(adapter) {
|
|
855
|
-
return (value) => {
|
|
856
|
-
if (value === null || value === void 0) {
|
|
857
|
-
return null;
|
|
858
|
-
}
|
|
859
|
-
if (typeof value === "string") {
|
|
860
|
-
if (value === "") {
|
|
861
|
-
return null;
|
|
862
|
-
}
|
|
863
|
-
try {
|
|
864
|
-
const parsed = adapter.utils.date(value);
|
|
865
|
-
return isValidDate(parsed) ? parsed : null;
|
|
866
|
-
} catch {
|
|
867
|
-
return null;
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
if (isValidDate(value)) {
|
|
871
|
-
return value;
|
|
872
|
-
}
|
|
873
|
-
return null;
|
|
874
|
-
};
|
|
875
|
-
}
|
|
876
|
-
function createDateOutputTransform(format) {
|
|
877
|
-
return (value) => {
|
|
878
|
-
if (value === null || value === void 0) {
|
|
879
|
-
return null;
|
|
880
|
-
}
|
|
881
|
-
if (!isValidDate(value)) {
|
|
882
|
-
return null;
|
|
883
|
-
}
|
|
884
|
-
if (!format) {
|
|
885
|
-
return value;
|
|
886
|
-
}
|
|
887
|
-
try {
|
|
888
|
-
if (value instanceof Date) {
|
|
889
|
-
if (format === "iso") {
|
|
890
|
-
return value.toISOString();
|
|
891
|
-
}
|
|
892
|
-
if (format === "date-only") {
|
|
893
|
-
return value.toISOString().split("T")[0];
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
if (typeof value.format === "function") {
|
|
897
|
-
return value.format(format);
|
|
898
|
-
}
|
|
899
|
-
if (typeof value.format === "function") {
|
|
900
|
-
return value.format(format);
|
|
901
|
-
}
|
|
902
|
-
if (typeof value.toFormat === "function") {
|
|
903
|
-
return value.toFormat(format);
|
|
904
|
-
}
|
|
905
|
-
return value;
|
|
906
|
-
} catch {
|
|
907
|
-
return null;
|
|
908
|
-
}
|
|
909
|
-
};
|
|
910
|
-
}
|
|
911
|
-
function createDefaultDatePickerConfig() {
|
|
912
|
-
return {
|
|
913
|
-
// Default slot props for consistent behavior
|
|
914
|
-
slotProps: {
|
|
915
|
-
actionBar: {
|
|
916
|
-
actions: ["clear", "today", "cancel", "accept"]
|
|
917
|
-
},
|
|
918
|
-
textField: {
|
|
919
|
-
fullWidth: true,
|
|
920
|
-
variant: "outlined"
|
|
921
|
-
}
|
|
922
|
-
},
|
|
923
|
-
// Default grid props for layout consistency
|
|
924
|
-
gridProps: {
|
|
925
|
-
size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
|
|
926
|
-
},
|
|
927
|
-
// Default validation configuration
|
|
928
|
-
validation: {
|
|
929
|
-
errorMessages: {
|
|
930
|
-
invalidDate: "Please enter a valid date",
|
|
931
|
-
minDate: "Date must be after the minimum allowed date",
|
|
932
|
-
maxDate: "Date must be before the maximum allowed date",
|
|
933
|
-
disabledDate: "This date is not allowed"
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
};
|
|
937
|
-
}
|
|
938
|
-
function extractErrorMessage(error) {
|
|
939
|
-
if (error === null || error === void 0) {
|
|
940
|
-
return "";
|
|
941
|
-
}
|
|
942
|
-
if (typeof error === "string") {
|
|
943
|
-
return error;
|
|
944
|
-
}
|
|
945
|
-
if (typeof error === "object" && error !== null) {
|
|
946
|
-
if ("message" in error && typeof error.message === "string") {
|
|
947
|
-
return error.message;
|
|
948
|
-
}
|
|
949
|
-
if ("type" in error && typeof error.type === "string") {
|
|
950
|
-
const errorType = error.type;
|
|
951
|
-
switch (errorType) {
|
|
952
|
-
case "invalidDate":
|
|
953
|
-
return "Please enter a valid date";
|
|
954
|
-
case "minDate":
|
|
955
|
-
return "Date is too early";
|
|
956
|
-
case "maxDate":
|
|
957
|
-
return "Date is too late";
|
|
958
|
-
case "disabledDate":
|
|
959
|
-
return "This date is not available";
|
|
960
|
-
default:
|
|
961
|
-
return "Invalid date selection";
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
return "Invalid input";
|
|
966
|
-
}
|
|
967
|
-
function createStableKey(config) {
|
|
968
|
-
try {
|
|
969
|
-
return JSON.stringify(config, (key, value) => {
|
|
970
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
971
|
-
const sorted = {};
|
|
972
|
-
Object.keys(value).sort().forEach((k) => {
|
|
973
|
-
sorted[k] = value[k];
|
|
974
|
-
});
|
|
975
|
-
return sorted;
|
|
976
|
-
}
|
|
977
|
-
return value;
|
|
978
|
-
});
|
|
979
|
-
} catch {
|
|
980
|
-
return Object.keys(config).sort().join("-");
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
// src/wrappers/PasswordElement/PasswordElement.tsx
|
|
985
|
-
import Visibility from "@mui/icons-material/Visibility";
|
|
986
|
-
import VisibilityOff from "@mui/icons-material/VisibilityOff";
|
|
987
|
-
import {
|
|
988
|
-
IconButton,
|
|
989
|
-
InputAdornment,
|
|
990
|
-
TextField as TextField2,
|
|
991
|
-
useForkRef as useForkRef2,
|
|
992
|
-
Grid as Grid5
|
|
993
|
-
} from "@mui/material";
|
|
994
|
-
import { useState as useState3 } from "react";
|
|
995
|
-
import { useController as useController5 } from "react-hook-form";
|
|
996
|
-
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
997
|
-
var Component4 = function PasswordEl(props) {
|
|
998
|
-
const {
|
|
999
|
-
iconColor,
|
|
1000
|
-
renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
|
|
1001
|
-
slotProps,
|
|
1002
|
-
name,
|
|
1003
|
-
control,
|
|
1004
|
-
inputRef,
|
|
1005
|
-
onBlur,
|
|
1006
|
-
...rest
|
|
1007
|
-
} = props;
|
|
1008
|
-
const [password, setPassword] = useState3(true);
|
|
1009
|
-
const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
|
|
1010
|
-
IconButton,
|
|
1011
|
-
{
|
|
1012
|
-
onMouseDown: (e) => e.preventDefault(),
|
|
1013
|
-
onClick: () => setPassword(!password),
|
|
1014
|
-
tabIndex: -1,
|
|
1015
|
-
color: iconColor ?? "default",
|
|
1016
|
-
children: renderIcon(password)
|
|
1017
|
-
}
|
|
1018
|
-
) });
|
|
1019
|
-
const {
|
|
1020
|
-
field,
|
|
1021
|
-
fieldState: { error }
|
|
1022
|
-
} = useController5({
|
|
1023
|
-
name,
|
|
1024
|
-
control
|
|
1025
|
-
});
|
|
1026
|
-
const handleInputRef = useForkRef2(field.ref, inputRef);
|
|
1027
|
-
return /* @__PURE__ */ jsx6(
|
|
1028
|
-
TextField2,
|
|
1029
|
-
{
|
|
1030
|
-
...rest,
|
|
1031
|
-
inputRef: handleInputRef,
|
|
1032
|
-
type: password ? "password" : "text",
|
|
1033
|
-
value: field.value ?? "",
|
|
1034
|
-
fullWidth: true,
|
|
1035
|
-
variant: rest.variant ?? "outlined",
|
|
1036
|
-
onChange: (event) => {
|
|
1037
|
-
field.onChange(event);
|
|
1038
|
-
if (typeof rest.onChange === "function") {
|
|
1039
|
-
rest.onChange(event);
|
|
1040
|
-
}
|
|
1041
|
-
},
|
|
1042
|
-
onBlur: (event) => {
|
|
1043
|
-
field.onBlur();
|
|
1044
|
-
if (typeof onBlur === "function") {
|
|
1045
|
-
onBlur(event);
|
|
1046
|
-
}
|
|
1047
|
-
},
|
|
1048
|
-
...typeof slotProps === "undefined" ? {
|
|
1049
|
-
InputProps: {
|
|
1050
|
-
endAdornment
|
|
1051
|
-
}
|
|
1052
|
-
} : {
|
|
1053
|
-
slotProps: {
|
|
1054
|
-
...slotProps,
|
|
1055
|
-
input: {
|
|
1056
|
-
endAdornment,
|
|
1057
|
-
...slotProps?.input
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
},
|
|
1061
|
-
error: !!error,
|
|
1062
|
-
helperText: error ? error.message : ""
|
|
1063
|
-
}
|
|
1064
|
-
);
|
|
1065
|
-
};
|
|
1066
|
-
var PasswordElement = ({
|
|
1067
|
-
gridProps = {},
|
|
1068
|
-
...props
|
|
1069
|
-
}) => {
|
|
1070
|
-
return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
|
|
1071
|
-
};
|
|
1072
|
-
|
|
1073
|
-
// src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
|
|
1074
|
-
import {
|
|
1075
|
-
FormControl as FormControl3,
|
|
1076
|
-
FormControlLabel as FormControlLabel3,
|
|
1077
|
-
FormHelperText as FormHelperText3,
|
|
1078
|
-
FormLabel,
|
|
1079
|
-
Radio,
|
|
1080
|
-
RadioGroup,
|
|
1081
|
-
Grid as Grid6
|
|
1082
|
-
} from "@mui/material";
|
|
1083
|
-
import { useController as useController6 } from "react-hook-form";
|
|
1084
|
-
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1085
|
-
var Component5 = function RadioButtonGroup(props) {
|
|
1086
|
-
const {
|
|
1087
|
-
options,
|
|
1088
|
-
label,
|
|
1089
|
-
name,
|
|
1090
|
-
labelKey = "label",
|
|
1091
|
-
valueKey = "id",
|
|
1092
|
-
disabledKey = "disabled",
|
|
1093
|
-
required,
|
|
1094
|
-
emptyOptionLabel,
|
|
1095
|
-
returnObject,
|
|
1096
|
-
row = true,
|
|
1097
|
-
control,
|
|
1098
|
-
type,
|
|
1099
|
-
labelProps,
|
|
1100
|
-
disabled,
|
|
1101
|
-
formLabelProps,
|
|
1102
|
-
radioProps,
|
|
1103
|
-
transform,
|
|
1104
|
-
...rest
|
|
1105
|
-
} = props;
|
|
1106
|
-
const {
|
|
1107
|
-
field,
|
|
1108
|
-
fieldState: { error }
|
|
1109
|
-
} = useController6({
|
|
1110
|
-
name,
|
|
1111
|
-
disabled,
|
|
1112
|
-
control
|
|
1113
|
-
});
|
|
1114
|
-
const { value, onChange } = useTransform({
|
|
1115
|
-
value: field.value,
|
|
1116
|
-
onChange: field.onChange,
|
|
1117
|
-
transform: {
|
|
1118
|
-
input: typeof transform?.input === "function" ? transform.input : (value2) => {
|
|
1119
|
-
return value2 || "";
|
|
1120
|
-
},
|
|
1121
|
-
output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
|
|
1122
|
-
if (value2 && type === "number") {
|
|
1123
|
-
return Number(value2);
|
|
1124
|
-
}
|
|
1125
|
-
if (value2 && type === "boolean") {
|
|
1126
|
-
return Boolean(value2);
|
|
1127
|
-
}
|
|
1128
|
-
return value2;
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
});
|
|
1132
|
-
const onRadioChange = (event, radioValue) => {
|
|
1133
|
-
const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
|
|
1134
|
-
onChange(event, returnValue);
|
|
1135
|
-
if (typeof rest.onChange === "function") {
|
|
1136
|
-
rest.onChange(returnValue);
|
|
1137
|
-
}
|
|
1138
|
-
};
|
|
1139
|
-
return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
|
|
1140
|
-
label && /* @__PURE__ */ jsx7(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
|
|
1141
|
-
/* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
|
|
1142
|
-
emptyOptionLabel && /* @__PURE__ */ jsx7(
|
|
1143
|
-
FormControlLabel3,
|
|
1144
|
-
{
|
|
1145
|
-
...labelProps,
|
|
1146
|
-
control: /* @__PURE__ */ jsx7(
|
|
1147
|
-
Radio,
|
|
1148
|
-
{
|
|
1149
|
-
...radioProps,
|
|
1150
|
-
checked: !value
|
|
1151
|
-
}
|
|
1152
|
-
),
|
|
1153
|
-
label: emptyOptionLabel,
|
|
1154
|
-
value: ""
|
|
1155
|
-
}
|
|
1156
|
-
),
|
|
1157
|
-
options.map((option) => {
|
|
1158
|
-
const optionKey = option[valueKey];
|
|
1159
|
-
const optionDisabled = option[disabledKey] || false;
|
|
1160
|
-
let val = returnObject ? value?.[valueKey] : value;
|
|
1161
|
-
if (type === "number" && val !== void 0) {
|
|
1162
|
-
val = Number(val);
|
|
1163
|
-
} else if (type === "boolean" && val !== void 0) {
|
|
1164
|
-
val = Boolean(val);
|
|
1165
|
-
}
|
|
1166
|
-
const isChecked = val === optionKey;
|
|
1167
|
-
return /* @__PURE__ */ jsx7(
|
|
1168
|
-
FormControlLabel3,
|
|
1169
|
-
{
|
|
1170
|
-
...labelProps,
|
|
1171
|
-
control: /* @__PURE__ */ jsx7(
|
|
1172
|
-
Radio,
|
|
1173
|
-
{
|
|
1174
|
-
...radioProps,
|
|
1175
|
-
disabled: disabled || optionDisabled,
|
|
1176
|
-
checked: isChecked
|
|
1177
|
-
}
|
|
1178
|
-
),
|
|
1179
|
-
value: optionKey,
|
|
1180
|
-
label: option[labelKey]
|
|
1181
|
-
},
|
|
1182
|
-
String(optionKey)
|
|
1183
|
-
);
|
|
1184
|
-
})
|
|
1185
|
-
] }),
|
|
1186
|
-
error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
|
|
1187
|
-
] });
|
|
1188
|
-
};
|
|
1189
|
-
var RadioButtonGroup2 = ({
|
|
1190
|
-
gridProps = {},
|
|
1191
|
-
...props
|
|
1192
|
-
}) => {
|
|
1193
|
-
return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
|
|
1194
|
-
Component5,
|
|
1195
|
-
{
|
|
1196
|
-
...props
|
|
1197
|
-
}
|
|
1198
|
-
) });
|
|
1199
|
-
};
|
|
1200
|
-
RadioButtonGroup2.displayName = "RadioButtonGroup";
|
|
1201
|
-
|
|
1202
|
-
// src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
|
|
1203
|
-
import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
|
|
1204
|
-
import { useRef as useRef2, useEffect as useEffect3, useCallback as useCallback5, useMemo as useMemo6 } from "react";
|
|
1205
|
-
import { useController as useController7 } from "react-hook-form";
|
|
1206
|
-
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1207
|
-
var Component6 = function SelectCascadeElement(props) {
|
|
1208
|
-
const {
|
|
1209
|
-
labelField = "Label",
|
|
1210
|
-
valueField = "Value",
|
|
1211
|
-
name,
|
|
1212
|
-
onBlur,
|
|
1213
|
-
onChange,
|
|
1214
|
-
disabled,
|
|
1215
|
-
options: optionsInput,
|
|
1216
|
-
control,
|
|
1217
|
-
loading = false,
|
|
1218
|
-
placeholder,
|
|
1219
|
-
label,
|
|
1220
|
-
dependsOn,
|
|
1221
|
-
textFieldProps = {},
|
|
1222
|
-
variant,
|
|
1223
|
-
isEdit = false,
|
|
1224
|
-
...rest
|
|
1225
|
-
} = props;
|
|
1226
|
-
const { required, ...restTextProps } = textFieldProps;
|
|
1227
|
-
const options = useMemo6(() => optionsInput || [], [optionsInput]);
|
|
1228
|
-
const getOptionKey = useCallback5(
|
|
1229
|
-
(option) => {
|
|
1230
|
-
if (typeof option === "string" || typeof option === "number")
|
|
1231
|
-
return option;
|
|
1232
|
-
const key = option ? option[valueField] : void 0;
|
|
1233
|
-
return key !== void 0 && key !== null ? String(key) : "";
|
|
1234
|
-
},
|
|
1235
|
-
[valueField]
|
|
1236
|
-
);
|
|
1237
|
-
const getOptionLabel = useCallback5(
|
|
1238
|
-
(option) => {
|
|
1239
|
-
if (typeof option === "string") return option;
|
|
1240
|
-
return option ? String(option[labelField]) : "";
|
|
1241
|
-
},
|
|
1242
|
-
[labelField]
|
|
1243
|
-
);
|
|
1244
|
-
const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
|
|
1245
|
-
const {
|
|
1246
|
-
field,
|
|
1247
|
-
fieldState: { error }
|
|
1248
|
-
} = useController7({
|
|
1249
|
-
name,
|
|
1250
|
-
control
|
|
1251
|
-
});
|
|
1252
|
-
const { field: dependentField } = useController7({
|
|
1253
|
-
name: dependsOn,
|
|
1254
|
-
control
|
|
1255
|
-
});
|
|
1256
|
-
const parentValueRef = useRef2(dependentField.value ?? null);
|
|
1257
|
-
const hasAutoSelected = useRef2(false);
|
|
1258
|
-
useEffect3(() => {
|
|
1259
|
-
if (parentValueRef?.current !== dependentField.value) {
|
|
1260
|
-
hasAutoSelected.current = false;
|
|
1261
|
-
}
|
|
1262
|
-
if (!!field.value && parentValueRef?.current !== dependentField.value) {
|
|
1263
|
-
field.onChange(null);
|
|
1264
|
-
}
|
|
1265
|
-
}, [dependentField.value]);
|
|
1266
|
-
useEffect3(() => {
|
|
1267
|
-
if (!isEdit && !disabled && options.length === 1 && !!dependentField.value && !hasAutoSelected.current && field.value == null) {
|
|
1268
|
-
field.onChange(getOptionKey(options[0]));
|
|
1269
|
-
hasAutoSelected.current = true;
|
|
1270
|
-
}
|
|
1271
|
-
}, [
|
|
1272
|
-
options,
|
|
1273
|
-
field.value,
|
|
1274
|
-
field.onChange,
|
|
1275
|
-
hasAutoSelected,
|
|
1276
|
-
isEdit,
|
|
1277
|
-
disabled,
|
|
1278
|
-
field,
|
|
1279
|
-
getOptionKey,
|
|
1280
|
-
dependentField.onChange
|
|
1281
|
-
]);
|
|
1282
|
-
return /* @__PURE__ */ jsx8(
|
|
1283
|
-
Autocomplete2,
|
|
1284
|
-
{
|
|
1285
|
-
...rest,
|
|
1286
|
-
value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
|
|
1287
|
-
loading,
|
|
1288
|
-
options,
|
|
1289
|
-
getOptionKey,
|
|
1290
|
-
getOptionLabel,
|
|
1291
|
-
isOptionEqualToValue,
|
|
1292
|
-
ref: field.ref,
|
|
1293
|
-
disabled: dependentField.value == null || disabled,
|
|
1294
|
-
onChange: (event, newValue, reason) => {
|
|
1295
|
-
field.onChange(newValue ? getOptionKey(newValue) : null);
|
|
1296
|
-
if (onChange && typeof onChange === "function") {
|
|
1297
|
-
onChange(event, newValue, reason);
|
|
1298
|
-
}
|
|
1299
|
-
},
|
|
1300
|
-
onBlur: (event) => {
|
|
1301
|
-
field.onBlur();
|
|
1302
|
-
if (typeof onBlur === "function") {
|
|
1303
|
-
onBlur(event);
|
|
1304
|
-
}
|
|
1305
|
-
},
|
|
1306
|
-
fullWidth: true,
|
|
1307
|
-
renderInput: (params) => /* @__PURE__ */ jsx8(
|
|
1308
|
-
TextField3,
|
|
1309
|
-
{
|
|
1310
|
-
...params,
|
|
1311
|
-
...restTextProps,
|
|
1312
|
-
fullWidth: true,
|
|
1313
|
-
error: !!error,
|
|
1314
|
-
required: required || options.length == 0,
|
|
1315
|
-
helperText: error ? error.message : "",
|
|
1316
|
-
placeholder,
|
|
1317
|
-
label,
|
|
1318
|
-
variant: variant ? variant : "outlined"
|
|
1319
|
-
}
|
|
1320
|
-
)
|
|
1321
|
-
}
|
|
1322
|
-
);
|
|
1323
|
-
};
|
|
1324
|
-
var SelectCascadeElement2 = ({
|
|
1325
|
-
gridProps = {},
|
|
1326
|
-
...props
|
|
1327
|
-
}) => {
|
|
1328
|
-
return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
|
|
1329
|
-
};
|
|
1330
|
-
SelectCascadeElement2.displayName = "SelectCascadeElement";
|
|
1331
|
-
|
|
1332
|
-
// src/wrappers/SelectElement/SelectElement.tsx
|
|
1333
|
-
import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
|
|
1334
|
-
import {
|
|
1335
|
-
useMemo as useMemo7,
|
|
1336
|
-
useEffect as useEffect4,
|
|
1337
|
-
useCallback as useCallback6,
|
|
1338
|
-
useRef as useRef3
|
|
1339
|
-
} from "react";
|
|
1340
|
-
import { useController as useController8 } from "react-hook-form";
|
|
1341
|
-
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
1342
|
-
var Component7 = function SelectElement(props) {
|
|
1343
|
-
const {
|
|
1344
|
-
name,
|
|
1345
|
-
control,
|
|
1346
|
-
onChange,
|
|
1347
|
-
isEdit,
|
|
1348
|
-
options: optionsInput,
|
|
1349
|
-
label,
|
|
1350
|
-
variant,
|
|
1351
|
-
disabled,
|
|
1352
|
-
labelKey = "Label",
|
|
1353
|
-
valueKey = "Value",
|
|
1354
|
-
placeholder,
|
|
1355
|
-
textFieldProps = {},
|
|
1356
|
-
...rest
|
|
1357
|
-
} = props;
|
|
1358
|
-
const { required, ...restTextProps } = textFieldProps;
|
|
1359
|
-
const options = useMemo7(() => optionsInput || [], [optionsInput]);
|
|
1360
|
-
const ignoreAutoSelectRef = useRef3(null);
|
|
1361
|
-
const {
|
|
1362
|
-
field,
|
|
1363
|
-
fieldState: { error }
|
|
1364
|
-
} = useController8({
|
|
1365
|
-
name,
|
|
1366
|
-
control
|
|
1367
|
-
});
|
|
1368
|
-
const getOptionValue = useCallback6(
|
|
1369
|
-
(option) => {
|
|
1370
|
-
if (typeof option === "string") return option;
|
|
1371
|
-
return option ? option[valueKey] : null;
|
|
1372
|
-
},
|
|
1373
|
-
[valueKey]
|
|
1374
|
-
);
|
|
1375
|
-
const getOptionLabel = useCallback6(
|
|
1376
|
-
(option) => {
|
|
1377
|
-
if (typeof option === "string") return option;
|
|
1378
|
-
return option ? String(option[labelKey]) : "";
|
|
1379
|
-
},
|
|
1380
|
-
[labelKey]
|
|
1381
|
-
);
|
|
1382
|
-
const handleChange = (event, newValue, reason) => {
|
|
1383
|
-
const option = newValue;
|
|
1384
|
-
if (reason === "clear" && options.length === 1) {
|
|
1385
|
-
ignoreAutoSelectRef.current = getOptionValue(options[0]);
|
|
1386
|
-
} else {
|
|
1387
|
-
ignoreAutoSelectRef.current = null;
|
|
1388
|
-
}
|
|
1389
|
-
field.onChange(option ? getOptionValue(option) : null);
|
|
1390
|
-
onChange?.(event, newValue, reason);
|
|
1391
|
-
};
|
|
1392
|
-
useEffect4(() => {
|
|
1393
|
-
if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
|
|
1394
|
-
const defaultOption = options[0];
|
|
1395
|
-
const defaultValue = getOptionValue(defaultOption);
|
|
1396
|
-
if (ignoreAutoSelectRef.current !== defaultValue) {
|
|
1397
|
-
field.onChange(defaultValue);
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
}, [options]);
|
|
1401
|
-
const autocompleteValue = useMemo7(
|
|
1402
|
-
() => options.find((option) => getOptionValue(option) === field.value) ?? null,
|
|
1403
|
-
[field.value, options, getOptionValue]
|
|
1404
|
-
);
|
|
1405
|
-
return /* @__PURE__ */ jsx9(
|
|
1406
|
-
Autocomplete3,
|
|
1407
|
-
{
|
|
1408
|
-
...rest,
|
|
1409
|
-
filterSelectedOptions: false,
|
|
1410
|
-
options,
|
|
1411
|
-
value: autocompleteValue,
|
|
1412
|
-
onChange: handleChange,
|
|
1413
|
-
disabled: disabled || options.length == 0,
|
|
1414
|
-
getOptionLabel: (option) => getOptionLabel(option),
|
|
1415
|
-
ref: field.ref,
|
|
1416
|
-
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1417
|
-
renderInput: (params) => /* @__PURE__ */ jsx9(
|
|
1418
|
-
TextField4,
|
|
1419
|
-
{
|
|
1420
|
-
...params,
|
|
1421
|
-
...restTextProps,
|
|
1422
|
-
fullWidth: true,
|
|
1423
|
-
required,
|
|
1424
|
-
error: !!error,
|
|
1425
|
-
helperText: error ? error.message : "",
|
|
1426
|
-
label,
|
|
1427
|
-
placeholder,
|
|
1428
|
-
variant: variant ? variant : "outlined"
|
|
1429
|
-
}
|
|
1430
|
-
)
|
|
1431
|
-
}
|
|
1432
|
-
);
|
|
1433
|
-
};
|
|
1434
|
-
var SelectElement2 = ({
|
|
1435
|
-
gridProps = {},
|
|
1436
|
-
...props
|
|
1437
|
-
}) => {
|
|
1438
|
-
return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
|
|
1439
|
-
};
|
|
1440
|
-
SelectElement2.displayName = "SelectElement";
|
|
1441
|
-
|
|
1442
|
-
// src/wrappers/SelectMultiElement/SelectMultiElement.tsx
|
|
1443
|
-
import CheckBoxIcon from "@mui/icons-material/CheckBox";
|
|
1444
|
-
import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
|
|
1445
|
-
import {
|
|
1446
|
-
Grid as Grid9,
|
|
1447
|
-
Checkbox as Checkbox3,
|
|
1448
|
-
TextField as TextField5,
|
|
1449
|
-
Autocomplete as Autocomplete4,
|
|
1450
|
-
CircularProgress as CircularProgress2
|
|
1451
|
-
} from "@mui/material";
|
|
1452
|
-
import { Fragment as Fragment2, useMemo as useMemo8 } from "react";
|
|
1453
|
-
import { useController as useController9 } from "react-hook-form";
|
|
1454
|
-
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1455
|
-
var Component8 = function SelectMultiElement(props) {
|
|
1456
|
-
const {
|
|
1457
|
-
name,
|
|
1458
|
-
control,
|
|
1459
|
-
onBlur,
|
|
1460
|
-
disabled,
|
|
1461
|
-
options: optionsInput,
|
|
1462
|
-
loading = false,
|
|
1463
|
-
placeholder,
|
|
1464
|
-
label,
|
|
1465
|
-
variant,
|
|
1466
|
-
labelField = "Label",
|
|
1467
|
-
valueField = "Value",
|
|
1468
|
-
...rest
|
|
1469
|
-
} = props;
|
|
1470
|
-
const options = useMemo8(() => optionsInput || [], [optionsInput]);
|
|
1471
|
-
const {
|
|
1472
|
-
field,
|
|
1473
|
-
fieldState: { error }
|
|
1474
|
-
} = useController9({
|
|
1475
|
-
name,
|
|
1476
|
-
control
|
|
1477
|
-
});
|
|
1478
|
-
const getOptionValue = (option) => {
|
|
1479
|
-
if (typeof option === "string") return option;
|
|
1480
|
-
return option ? option[valueField] : null;
|
|
1481
|
-
};
|
|
1482
|
-
const getOptionLabel = (option) => {
|
|
1483
|
-
if (typeof option === "string") return option;
|
|
1484
|
-
return option ? String(option[labelField]) : "";
|
|
1485
|
-
};
|
|
1486
|
-
const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
|
|
1487
|
-
const handleChange = (_2, selectedOptions, reason) => {
|
|
1488
|
-
if (reason === "clear") {
|
|
1489
|
-
field.onChange([]);
|
|
1490
|
-
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
1491
|
-
const newValues = selectedOptions.map((option) => getOptionValue(option));
|
|
1492
|
-
field.onChange(newValues);
|
|
1493
|
-
}
|
|
1494
|
-
};
|
|
1495
|
-
const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
|
|
1496
|
-
const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
|
|
1497
|
-
return /* @__PURE__ */ jsx10(
|
|
1498
|
-
Autocomplete4,
|
|
1499
|
-
{
|
|
1500
|
-
multiple: true,
|
|
1501
|
-
value: selectedValue,
|
|
1502
|
-
loading,
|
|
1503
|
-
options,
|
|
1504
|
-
getOptionLabel,
|
|
1505
|
-
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1506
|
-
filterSelectedOptions: true,
|
|
1507
|
-
disableCloseOnSelect: true,
|
|
1508
|
-
ref: field.ref,
|
|
1509
|
-
disabled: disabled ?? field.disabled ?? options.length == 0,
|
|
1510
|
-
onChange: handleChange,
|
|
1511
|
-
onBlur: (event) => {
|
|
1512
|
-
field.onBlur();
|
|
1513
|
-
if (typeof onBlur === "function") {
|
|
1514
|
-
onBlur(event);
|
|
1515
|
-
}
|
|
1516
|
-
},
|
|
1517
|
-
fullWidth: true,
|
|
1518
|
-
renderOption: (props1, option, { selected }) => {
|
|
1519
|
-
const { key, ...optionProps } = props1;
|
|
1520
|
-
return /* @__PURE__ */ jsxs5("li", { ...optionProps, children: [
|
|
1521
|
-
/* @__PURE__ */ jsx10(
|
|
1522
|
-
Checkbox3,
|
|
1523
|
-
{
|
|
1524
|
-
icon,
|
|
1525
|
-
checkedIcon,
|
|
1526
|
-
checked: selected
|
|
1527
|
-
}
|
|
1528
|
-
),
|
|
1529
|
-
getOptionLabel(option)
|
|
1530
|
-
] }, key);
|
|
1531
|
-
},
|
|
1532
|
-
renderInput: (params) => /* @__PURE__ */ jsx10(
|
|
1533
|
-
TextField5,
|
|
1534
|
-
{
|
|
1535
|
-
...params,
|
|
1536
|
-
label,
|
|
1537
|
-
error: !!error,
|
|
1538
|
-
helperText: error ? error.message : "",
|
|
1539
|
-
placeholder,
|
|
1540
|
-
slotProps: {
|
|
1541
|
-
input: {
|
|
1542
|
-
...params.InputProps,
|
|
1543
|
-
endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
1544
|
-
loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
|
|
1545
|
-
params.InputProps.endAdornment
|
|
1546
|
-
] })
|
|
1547
|
-
}
|
|
1548
|
-
},
|
|
1549
|
-
variant: variant ? variant : "outlined"
|
|
1550
|
-
}
|
|
1551
|
-
),
|
|
1552
|
-
...rest
|
|
1553
|
-
}
|
|
1554
|
-
);
|
|
1555
|
-
};
|
|
1556
|
-
var SelectMultiElement2 = ({
|
|
1557
|
-
gridProps = {},
|
|
1558
|
-
...props
|
|
1559
|
-
}) => {
|
|
1560
|
-
return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
|
|
1561
|
-
};
|
|
1562
|
-
SelectMultiElement2.displayName = "SelectMultiElement";
|
|
1563
|
-
|
|
1564
|
-
// src/wrappers/TextFieldElement/TextFieldElement.tsx
|
|
1565
|
-
import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
|
|
1566
|
-
import { useController as useController10 } from "react-hook-form";
|
|
1567
|
-
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
1568
|
-
var Component9 = function TextFieldElement(props) {
|
|
1569
|
-
const {
|
|
1570
|
-
parseError,
|
|
1571
|
-
name,
|
|
1572
|
-
control,
|
|
1573
|
-
component: TextFieldComponent = TextField6,
|
|
1574
|
-
transform,
|
|
1575
|
-
fieldType = "text",
|
|
1576
|
-
// Default to text type
|
|
1577
|
-
defaultValue,
|
|
1578
|
-
label,
|
|
1579
|
-
placeholder,
|
|
1580
|
-
textFieldProps = {},
|
|
1581
|
-
variant,
|
|
1582
|
-
onChange: customOnChange,
|
|
1583
|
-
enableWarnings = process.env.NODE_ENV === "development",
|
|
1584
|
-
...rest
|
|
1585
|
-
} = props;
|
|
1586
|
-
const {
|
|
1587
|
-
type,
|
|
1588
|
-
required,
|
|
1589
|
-
helperText,
|
|
1590
|
-
inputRef,
|
|
1591
|
-
onInput,
|
|
1592
|
-
onBlur,
|
|
1593
|
-
disabled,
|
|
1594
|
-
...restTextProps
|
|
1595
|
-
} = textFieldProps;
|
|
1596
|
-
const {
|
|
1597
|
-
field,
|
|
1598
|
-
fieldState: { error }
|
|
1599
|
-
} = useController10({
|
|
1600
|
-
name,
|
|
1601
|
-
control
|
|
1602
|
-
});
|
|
1603
|
-
const { value, onChange } = useEnhancedTransform(
|
|
1604
|
-
{
|
|
1605
|
-
value: field.value,
|
|
1606
|
-
onChange: field.onChange,
|
|
1607
|
-
transform: transform ? {
|
|
1608
|
-
input: transform.input,
|
|
1609
|
-
output: transform.output
|
|
1610
|
-
} : void 0,
|
|
1611
|
-
fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
|
|
1612
|
-
// Auto-detect number type
|
|
1613
|
-
defaultValue,
|
|
1614
|
-
enableWarnings
|
|
1615
|
-
}
|
|
1616
|
-
);
|
|
1617
|
-
const handleInputRef = useForkRef3(field.ref, inputRef);
|
|
1618
|
-
return /* @__PURE__ */ jsx11(
|
|
1619
|
-
TextFieldComponent,
|
|
1620
|
-
{
|
|
1621
|
-
...rest,
|
|
1622
|
-
...restTextProps,
|
|
1623
|
-
name: field.name,
|
|
1624
|
-
value,
|
|
1625
|
-
onChange: (event) => {
|
|
1626
|
-
const input = event.target.value;
|
|
1627
|
-
if (input === "") {
|
|
1628
|
-
field.onChange(null);
|
|
1629
|
-
} else {
|
|
1630
|
-
onChange(event);
|
|
1631
|
-
}
|
|
1632
|
-
if (typeof customOnChange === "function") {
|
|
1633
|
-
customOnChange(event);
|
|
1634
|
-
}
|
|
1635
|
-
return;
|
|
1636
|
-
},
|
|
1637
|
-
onBlur: (event) => {
|
|
1638
|
-
field.onBlur();
|
|
1639
|
-
if (typeof onBlur === "function") {
|
|
1640
|
-
onBlur(event);
|
|
1641
|
-
}
|
|
1642
|
-
},
|
|
1643
|
-
onInput: (event) => {
|
|
1644
|
-
if (typeof onInput === "function") {
|
|
1645
|
-
onInput(event);
|
|
1646
|
-
}
|
|
1647
|
-
},
|
|
1648
|
-
disabled,
|
|
1649
|
-
label,
|
|
1650
|
-
placeholder,
|
|
1651
|
-
fullWidth: true,
|
|
1652
|
-
required,
|
|
1653
|
-
type,
|
|
1654
|
-
error: !!error,
|
|
1655
|
-
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
1656
|
-
inputRef: handleInputRef,
|
|
1657
|
-
variant: variant ? variant : "outlined"
|
|
1658
|
-
}
|
|
1659
|
-
);
|
|
1660
|
-
};
|
|
1661
|
-
var TextFieldElement2 = ({
|
|
1662
|
-
gridProps = {},
|
|
1663
|
-
...props
|
|
1664
|
-
}) => {
|
|
1665
|
-
return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
|
|
1666
|
-
};
|
|
1667
|
-
|
|
1668
|
-
// src/wrappers/TimePickerElement/TimePickerElement.tsx
|
|
1669
|
-
import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
|
|
1670
|
-
import { TimePicker } from "@mui/x-date-pickers";
|
|
1671
|
-
import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
|
|
1672
|
-
import { useController as useController11 } from "react-hook-form";
|
|
1673
|
-
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
1674
|
-
var Component10 = function TimePickerElement(props) {
|
|
1675
|
-
const {
|
|
1676
|
-
name,
|
|
1677
|
-
required,
|
|
1678
|
-
inputProps,
|
|
1679
|
-
control,
|
|
1680
|
-
textReadOnly,
|
|
1681
|
-
label,
|
|
1682
|
-
placeholder,
|
|
1683
|
-
slotProps,
|
|
1684
|
-
timePickerProps = {},
|
|
1685
|
-
transform,
|
|
1686
|
-
...rest
|
|
1687
|
-
} = props;
|
|
1688
|
-
const adapter = useLocalizationContext2();
|
|
1689
|
-
const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
|
|
1690
|
-
const {
|
|
1691
|
-
field,
|
|
1692
|
-
fieldState: { error }
|
|
1693
|
-
} = useController11({
|
|
1694
|
-
name,
|
|
1695
|
-
control,
|
|
1696
|
-
defaultValue: null
|
|
1697
|
-
});
|
|
1698
|
-
const { value, onChange } = useTransform({
|
|
1699
|
-
value: field.value,
|
|
1700
|
-
onChange: field.onChange,
|
|
1701
|
-
transform: {
|
|
1702
|
-
input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
|
|
1703
|
-
output: (eventOrValue, value2) => {
|
|
1704
|
-
const actualValue = value2 !== void 0 ? value2 : eventOrValue;
|
|
1705
|
-
if (actualValue === null) return null;
|
|
1706
|
-
return actualValue;
|
|
1707
|
-
}
|
|
1708
|
-
}
|
|
1709
|
-
});
|
|
1710
|
-
const handleInputRef = useForkRef4(field.ref, inputRef);
|
|
1711
|
-
return /* @__PURE__ */ jsx12(
|
|
1712
|
-
TimePicker,
|
|
1713
|
-
{
|
|
1714
|
-
...rest,
|
|
1715
|
-
...restTimePickerProps,
|
|
1716
|
-
...field,
|
|
1717
|
-
value,
|
|
1718
|
-
label,
|
|
1719
|
-
disabled,
|
|
1720
|
-
...timePickerProps,
|
|
1721
|
-
inputRef: handleInputRef,
|
|
1722
|
-
onClose: (...args) => {
|
|
1723
|
-
field.onBlur();
|
|
1724
|
-
if (onClose) {
|
|
1725
|
-
onClose(...args);
|
|
1726
|
-
}
|
|
1727
|
-
},
|
|
1728
|
-
onChange: (newValue, context) => {
|
|
1729
|
-
onChange(newValue, context);
|
|
1730
|
-
if (typeof timePickerProps.onChange === "function") {
|
|
1731
|
-
timePickerProps.onChange(newValue, context);
|
|
1732
|
-
}
|
|
1733
|
-
},
|
|
1734
|
-
slotProps: {
|
|
1735
|
-
...slotProps,
|
|
1736
|
-
actionBar: {
|
|
1737
|
-
actions: ["clear", "cancel", "accept"]
|
|
1738
|
-
},
|
|
1739
|
-
textField: {
|
|
1740
|
-
...inputProps,
|
|
1741
|
-
required,
|
|
1742
|
-
placeholder,
|
|
1743
|
-
fullWidth: true,
|
|
1744
|
-
onBlur: (event) => {
|
|
1745
|
-
field.onBlur();
|
|
1746
|
-
if (typeof inputProps?.onBlur === "function") {
|
|
1747
|
-
inputProps.onBlur(event);
|
|
1748
|
-
}
|
|
1749
|
-
},
|
|
1750
|
-
error: !!error,
|
|
1751
|
-
helperText: error ? error.message : inputProps?.helperText || rest.helperText,
|
|
1752
|
-
inputProps: {
|
|
1753
|
-
readOnly: !!textReadOnly,
|
|
1754
|
-
...inputProps?.inputProps
|
|
1755
|
-
}
|
|
1756
|
-
}
|
|
1757
|
-
}
|
|
1758
|
-
}
|
|
1759
|
-
);
|
|
1760
|
-
};
|
|
1761
|
-
var TimePickerElement2 = ({
|
|
1762
|
-
gridProps = {},
|
|
1763
|
-
...props
|
|
1764
|
-
}) => {
|
|
1765
|
-
return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
|
|
1766
|
-
};
|
|
1767
|
-
TimePickerElement2.displayName = "TimePickerElement";
|
|
1768
|
-
|
|
1769
|
-
// src/wrappers/AsyncSelect/index.tsx
|
|
1770
|
-
import {
|
|
1771
|
-
Autocomplete as Autocomplete5,
|
|
1772
|
-
CircularProgress as CircularProgress3,
|
|
1773
|
-
Grid as Grid12,
|
|
1774
|
-
TextField as TextField7
|
|
1775
|
-
} from "@mui/material";
|
|
1776
|
-
import { debounce as debounce2 } from "@mui/material/utils";
|
|
1777
|
-
import * as React4 from "react";
|
|
1778
|
-
import {
|
|
1779
|
-
Fragment as Fragment3,
|
|
1780
|
-
useCallback as useCallback7,
|
|
1781
|
-
useEffect as useEffect6,
|
|
1782
|
-
useMemo as useMemo9,
|
|
1783
|
-
useRef as useRef4,
|
|
1784
|
-
useState as useState5
|
|
1785
|
-
} from "react";
|
|
1786
|
-
import {
|
|
1787
|
-
useController as useController12
|
|
1788
|
-
} from "react-hook-form";
|
|
1789
|
-
import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1790
|
-
var Component11 = function AsyncSelectElement(props) {
|
|
1791
|
-
const {
|
|
1792
|
-
name,
|
|
1793
|
-
disabled,
|
|
1794
|
-
control,
|
|
1795
|
-
placeholder,
|
|
1796
|
-
initialValue,
|
|
1797
|
-
label,
|
|
1798
|
-
queryFn,
|
|
1799
|
-
variant,
|
|
1800
|
-
labelField = "Label",
|
|
1801
|
-
valueField = "Value",
|
|
1802
|
-
...rest
|
|
1803
|
-
} = props;
|
|
1804
|
-
const {
|
|
1805
|
-
field,
|
|
1806
|
-
fieldState: { error }
|
|
1807
|
-
} = useController12({
|
|
1808
|
-
name,
|
|
1809
|
-
control
|
|
1810
|
-
});
|
|
1811
|
-
const [loading, setLoading] = useState5(false);
|
|
1812
|
-
const [selectedOption, setSelectedOption] = useState5(null);
|
|
1813
|
-
const [inputValue, setInputValue] = useState5("");
|
|
1814
|
-
const inputValue2 = useMemo9(() => inputValue, [inputValue]);
|
|
1815
|
-
const setInputValue2 = useCallback7(
|
|
1816
|
-
(newValue) => setInputValue(newValue),
|
|
1817
|
-
[]
|
|
1818
|
-
);
|
|
1819
|
-
const [options, setOptions] = useState5([]);
|
|
1820
|
-
const initialValueLoaded = useRef4(
|
|
1821
|
-
!initialValue ? true : !(initialValue != null)
|
|
1822
|
-
);
|
|
1823
|
-
const fieldValue = useRef4(field.value);
|
|
1824
|
-
const fetchData = useMemo9(
|
|
1825
|
-
() => debounce2(
|
|
1826
|
-
(payload, callback) => {
|
|
1827
|
-
queryFn(payload).then((c) => callback(c));
|
|
1828
|
-
},
|
|
1829
|
-
400
|
|
1830
|
-
),
|
|
1831
|
-
[queryFn]
|
|
1832
|
-
);
|
|
1833
|
-
const fillOptions = useCallback7(
|
|
1834
|
-
(results) => {
|
|
1835
|
-
let newOptions = [];
|
|
1836
|
-
if (selectedOption) {
|
|
1837
|
-
newOptions = [selectedOption];
|
|
1838
|
-
}
|
|
1839
|
-
if (results) {
|
|
1840
|
-
newOptions = [...newOptions, ...results];
|
|
1841
|
-
}
|
|
1842
|
-
setOptions(newOptions);
|
|
1843
|
-
setLoading(false);
|
|
1844
|
-
},
|
|
1845
|
-
[selectedOption]
|
|
1846
|
-
);
|
|
1847
|
-
useEffect6(() => {
|
|
1848
|
-
if (initialValueLoaded.current) return void 0;
|
|
1849
|
-
let active = true;
|
|
1850
|
-
const payload = {
|
|
1851
|
-
query: null,
|
|
1852
|
-
initialValue
|
|
1853
|
-
};
|
|
1854
|
-
setLoading(true);
|
|
1855
|
-
fetchData(payload, (results) => {
|
|
1856
|
-
if (active) {
|
|
1857
|
-
if (!!results && results.length > 0) {
|
|
1858
|
-
fillOptions(results?.filter((c) => c[valueField] == initialValue));
|
|
1859
|
-
setSelectedOption(results[0]);
|
|
1860
|
-
field.onChange(results[0][valueField]);
|
|
1861
|
-
fieldValue.current = results[0][valueField];
|
|
1862
|
-
}
|
|
1863
|
-
initialValueLoaded.current = true;
|
|
1864
|
-
setLoading(false);
|
|
1865
|
-
}
|
|
1866
|
-
});
|
|
1867
|
-
return () => {
|
|
1868
|
-
active = false;
|
|
1869
|
-
};
|
|
1870
|
-
}, [initialValue, fetchData, field, fillOptions, valueField]);
|
|
1871
|
-
React4.useEffect(() => {
|
|
1872
|
-
let active = true;
|
|
1873
|
-
if (inputValue2 === "" || initialValueLoaded.current === false) {
|
|
1874
|
-
setOptions(selectedOption ? [selectedOption] : []);
|
|
1875
|
-
return void 0;
|
|
1876
|
-
}
|
|
1877
|
-
setLoading(true);
|
|
1878
|
-
const payload = {
|
|
1879
|
-
query: inputValue2,
|
|
1880
|
-
initialValue: null
|
|
1881
|
-
};
|
|
1882
|
-
fetchData(payload, (results) => {
|
|
1883
|
-
if (active) {
|
|
1884
|
-
fillOptions(results);
|
|
1885
|
-
}
|
|
1886
|
-
});
|
|
1887
|
-
return () => {
|
|
1888
|
-
active = false;
|
|
1889
|
-
};
|
|
1890
|
-
}, [
|
|
1891
|
-
initialValue,
|
|
1892
|
-
inputValue2,
|
|
1893
|
-
fetchData,
|
|
1894
|
-
fillOptions,
|
|
1895
|
-
selectedOption
|
|
1896
|
-
]);
|
|
1897
|
-
const selectRef = useRef4(null);
|
|
1898
|
-
const handleChange = (_2, newSelectedOption, reason) => {
|
|
1899
|
-
if (reason === "clear") {
|
|
1900
|
-
setSelectedOption(null);
|
|
1901
|
-
field.onChange(null);
|
|
1902
|
-
setLoading(false);
|
|
1903
|
-
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
1904
|
-
if (newSelectedOption) {
|
|
1905
|
-
setSelectedOption(newSelectedOption);
|
|
1906
|
-
field.onChange(newSelectedOption[valueField]);
|
|
1907
|
-
fieldValue.current = newSelectedOption[valueField];
|
|
1908
|
-
setLoading(false);
|
|
1909
|
-
}
|
|
1910
|
-
}
|
|
1911
|
-
setOptions([]);
|
|
1912
|
-
setLoading(false);
|
|
1913
|
-
};
|
|
1914
|
-
useEffect6(() => {
|
|
1915
|
-
if (!field.value) {
|
|
1916
|
-
setInputValue("");
|
|
1917
|
-
setSelectedOption(null);
|
|
1918
|
-
setLoading(false);
|
|
1919
|
-
}
|
|
1920
|
-
}, [field.value]);
|
|
1921
|
-
const getOptionValue = (option) => {
|
|
1922
|
-
return option ? String(option[valueField]) : "";
|
|
1923
|
-
};
|
|
1924
|
-
const getOptionLabel = (option) => {
|
|
1925
|
-
return option ? String(option[labelField]) : "";
|
|
1926
|
-
};
|
|
1927
|
-
return /* @__PURE__ */ jsx13(
|
|
1928
|
-
Autocomplete5,
|
|
1929
|
-
{
|
|
1930
|
-
...rest,
|
|
1931
|
-
ref: selectRef,
|
|
1932
|
-
fullWidth: true,
|
|
1933
|
-
loading,
|
|
1934
|
-
getOptionLabel,
|
|
1935
|
-
getOptionKey: getOptionValue,
|
|
1936
|
-
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1937
|
-
autoComplete: true,
|
|
1938
|
-
disabled,
|
|
1939
|
-
includeInputInList: true,
|
|
1940
|
-
options,
|
|
1941
|
-
filterOptions: (x) => x,
|
|
1942
|
-
value: selectedOption,
|
|
1943
|
-
filterSelectedOptions: true,
|
|
1944
|
-
onChange: handleChange,
|
|
1945
|
-
onInputChange: (_2, newInputValue) => {
|
|
1946
|
-
setInputValue2(newInputValue);
|
|
1947
|
-
},
|
|
1948
|
-
noOptionsText: "Type Something...",
|
|
1949
|
-
renderInput: (params) => /* @__PURE__ */ jsx13(
|
|
1950
|
-
TextField7,
|
|
1951
|
-
{
|
|
1952
|
-
...params,
|
|
1953
|
-
label,
|
|
1954
|
-
error: !!error,
|
|
1955
|
-
helperText: error ? error.message : "",
|
|
1956
|
-
placeholder,
|
|
1957
|
-
slotProps: {
|
|
1958
|
-
input: {
|
|
1959
|
-
...params.InputProps,
|
|
1960
|
-
endAdornment: /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
1961
|
-
loading ? /* @__PURE__ */ jsx13(CircularProgress3, { color: "inherit", size: 20 }) : null,
|
|
1962
|
-
params.InputProps.endAdornment
|
|
1963
|
-
] })
|
|
1964
|
-
}
|
|
1965
|
-
},
|
|
1966
|
-
variant: variant ? variant : "outlined"
|
|
1967
|
-
}
|
|
1968
|
-
),
|
|
1969
|
-
renderOption: (renderProps, option) => {
|
|
1970
|
-
const { key, ...optionProps } = renderProps;
|
|
1971
|
-
return /* @__PURE__ */ jsx13("li", { ...optionProps, children: option[labelField] }, key);
|
|
1972
|
-
}
|
|
1973
|
-
}
|
|
1974
|
-
);
|
|
1975
|
-
};
|
|
1976
|
-
var AsyncSelectElement2 = ({
|
|
1977
|
-
gridProps = {},
|
|
1978
|
-
...props
|
|
1979
|
-
}) => {
|
|
1980
|
-
return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(
|
|
1981
|
-
Component11,
|
|
1982
|
-
{
|
|
1983
|
-
...props
|
|
1984
|
-
}
|
|
1985
|
-
) });
|
|
1986
|
-
};
|
|
1987
|
-
AsyncSelectElement2.displayName = "AsyncSelectElement";
|
|
1988
|
-
|
|
1989
|
-
// src/wrappers/NumberFieldElement/NumberFieldElement.tsx
|
|
1990
|
-
import { Grid as Grid13, TextField as TextField8, useForkRef as useForkRef5 } from "@mui/material";
|
|
1991
|
-
import { useController as useController13 } from "react-hook-form";
|
|
1992
|
-
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
1993
|
-
var Component12 = function NumberFieldElement(props) {
|
|
1994
|
-
const {
|
|
1995
|
-
parseError,
|
|
1996
|
-
name,
|
|
1997
|
-
control,
|
|
1998
|
-
component: TextFieldComponent = TextField8,
|
|
1999
|
-
transform,
|
|
2000
|
-
fieldType = "text",
|
|
2001
|
-
// Default to text type
|
|
2002
|
-
defaultValue,
|
|
2003
|
-
label,
|
|
2004
|
-
placeholder,
|
|
2005
|
-
textFieldProps = {},
|
|
2006
|
-
variant,
|
|
2007
|
-
onChange: customOnChange,
|
|
2008
|
-
enableWarnings = process.env.NODE_ENV === "development",
|
|
2009
|
-
...rest
|
|
2010
|
-
} = props;
|
|
2011
|
-
const {
|
|
2012
|
-
type = "number",
|
|
2013
|
-
required,
|
|
2014
|
-
helperText,
|
|
2015
|
-
inputRef,
|
|
2016
|
-
onInput,
|
|
2017
|
-
onBlur,
|
|
2018
|
-
disabled,
|
|
2019
|
-
...restTextProps
|
|
2020
|
-
} = textFieldProps;
|
|
2021
|
-
const {
|
|
2022
|
-
field,
|
|
2023
|
-
fieldState: { error }
|
|
2024
|
-
} = useController13({
|
|
2025
|
-
name,
|
|
2026
|
-
control
|
|
2027
|
-
});
|
|
2028
|
-
const { value, onChange } = useEnhancedTransform(
|
|
2029
|
-
{
|
|
2030
|
-
value: field.value,
|
|
2031
|
-
onChange: field.onChange,
|
|
2032
|
-
transform: transform ? {
|
|
2033
|
-
input: transform.input,
|
|
2034
|
-
output: transform.output
|
|
2035
|
-
} : void 0,
|
|
2036
|
-
fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
|
|
2037
|
-
// Auto-detect number type
|
|
2038
|
-
defaultValue,
|
|
2039
|
-
enableWarnings
|
|
2040
|
-
}
|
|
2041
|
-
);
|
|
2042
|
-
const handleInputRef = useForkRef5(field.ref, inputRef);
|
|
2043
|
-
return /* @__PURE__ */ jsx14(
|
|
2044
|
-
TextFieldComponent,
|
|
2045
|
-
{
|
|
2046
|
-
...rest,
|
|
2047
|
-
...restTextProps,
|
|
2048
|
-
name: field.name,
|
|
2049
|
-
value,
|
|
2050
|
-
onChange: (event) => {
|
|
2051
|
-
const input = event.target.value;
|
|
2052
|
-
if (input === "") {
|
|
2053
|
-
field.onChange(null);
|
|
2054
|
-
}
|
|
2055
|
-
onChange(event);
|
|
2056
|
-
if (typeof customOnChange === "function") {
|
|
2057
|
-
customOnChange(event);
|
|
2058
|
-
}
|
|
2059
|
-
},
|
|
2060
|
-
onBlur: (event) => {
|
|
2061
|
-
field.onBlur();
|
|
2062
|
-
if (typeof onBlur === "function") {
|
|
2063
|
-
onBlur(event);
|
|
2064
|
-
}
|
|
2065
|
-
},
|
|
2066
|
-
onInput: (event) => {
|
|
2067
|
-
if (typeof onInput === "function") {
|
|
2068
|
-
onInput(event);
|
|
2069
|
-
}
|
|
2070
|
-
},
|
|
2071
|
-
onWheel: (e) => {
|
|
2072
|
-
e.target.blur();
|
|
2073
|
-
},
|
|
2074
|
-
onKeyDown: (e) => {
|
|
2075
|
-
if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
|
|
2076
|
-
e.preventDefault();
|
|
2077
|
-
}
|
|
2078
|
-
},
|
|
2079
|
-
disabled,
|
|
2080
|
-
label,
|
|
2081
|
-
placeholder,
|
|
2082
|
-
fullWidth: true,
|
|
2083
|
-
required,
|
|
2084
|
-
type,
|
|
2085
|
-
error: !!error,
|
|
2086
|
-
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
2087
|
-
inputRef: handleInputRef,
|
|
2088
|
-
variant: variant ? variant : "outlined"
|
|
2089
|
-
}
|
|
2090
|
-
);
|
|
2091
|
-
};
|
|
2092
|
-
var NumberFieldElement2 = ({
|
|
2093
|
-
gridProps = {},
|
|
2094
|
-
...props
|
|
2095
|
-
}) => {
|
|
2096
|
-
return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
|
|
2097
|
-
};
|
|
2098
|
-
|
|
2099
|
-
// src/wrappers/OTPInputElement/OTPInputElement.tsx
|
|
2100
|
-
import { Box, Grid as Grid14, inputBaseClasses } from "@mui/material";
|
|
2101
|
-
import {
|
|
2102
|
-
MuiOtpInput
|
|
2103
|
-
} from "mui-one-time-password-input";
|
|
2104
|
-
import { Controller } from "react-hook-form";
|
|
2105
|
-
|
|
2106
|
-
// src/wrappers/OTPInputElement/HelperText.tsx
|
|
2107
|
-
import FormHelperText4 from "@mui/material/FormHelperText";
|
|
2108
|
-
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
2109
|
-
function HelperText({
|
|
2110
|
-
sx,
|
|
2111
|
-
helperText,
|
|
2112
|
-
errorMessage,
|
|
2113
|
-
disableGutters,
|
|
2114
|
-
...other
|
|
2115
|
-
}) {
|
|
2116
|
-
if (errorMessage || helperText) {
|
|
2117
|
-
return /* @__PURE__ */ jsx15(
|
|
2118
|
-
FormHelperText4,
|
|
2119
|
-
{
|
|
2120
|
-
error: !!errorMessage,
|
|
2121
|
-
sx: [
|
|
2122
|
-
{
|
|
2123
|
-
mx: disableGutters ? 0 : 1.75
|
|
2124
|
-
},
|
|
2125
|
-
...Array.isArray(sx) ? sx : [sx]
|
|
2126
|
-
],
|
|
2127
|
-
...other,
|
|
2128
|
-
children: errorMessage || helperText
|
|
2129
|
-
}
|
|
2130
|
-
);
|
|
2131
|
-
}
|
|
2132
|
-
return null;
|
|
2133
|
-
}
|
|
2134
|
-
|
|
2135
|
-
// src/wrappers/OTPInputElement/OTPInputElement.tsx
|
|
2136
|
-
import { jsx as jsx16, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2137
|
-
var Component13 = function OTPInputElement(props) {
|
|
2138
|
-
const {
|
|
2139
|
-
// parseError,
|
|
2140
|
-
name,
|
|
2141
|
-
control,
|
|
2142
|
-
slotProps,
|
|
2143
|
-
helperText,
|
|
2144
|
-
maxSize = 56,
|
|
2145
|
-
placeholder = "-",
|
|
2146
|
-
...rest
|
|
2147
|
-
} = props;
|
|
2148
|
-
return /* @__PURE__ */ jsx16(
|
|
2149
|
-
Controller,
|
|
2150
|
-
{
|
|
2151
|
-
name,
|
|
2152
|
-
control,
|
|
2153
|
-
render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs7(
|
|
2154
|
-
Box,
|
|
2155
|
-
{
|
|
2156
|
-
...slotProps?.wrapper,
|
|
2157
|
-
sx: [
|
|
2158
|
-
{
|
|
2159
|
-
display: "flex",
|
|
2160
|
-
justifyContent: "center",
|
|
2161
|
-
[`& .${inputBaseClasses.input}`]: {
|
|
2162
|
-
p: 0,
|
|
2163
|
-
height: "auto",
|
|
2164
|
-
aspectRatio: "1/1",
|
|
2165
|
-
maxWidth: maxSize
|
|
2166
|
-
}
|
|
2167
|
-
},
|
|
2168
|
-
...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
|
|
2169
|
-
],
|
|
2170
|
-
children: [
|
|
2171
|
-
/* @__PURE__ */ jsx16(
|
|
2172
|
-
MuiOtpInput,
|
|
2173
|
-
{
|
|
2174
|
-
...field,
|
|
2175
|
-
autoFocus: true,
|
|
2176
|
-
gap: 1.5,
|
|
2177
|
-
length: 4,
|
|
2178
|
-
TextFieldsProps: {
|
|
2179
|
-
placeholder,
|
|
2180
|
-
error: !!error,
|
|
2181
|
-
...slotProps?.textfield
|
|
2182
|
-
},
|
|
2183
|
-
...rest
|
|
2184
|
-
}
|
|
2185
|
-
),
|
|
2186
|
-
/* @__PURE__ */ jsx16(
|
|
2187
|
-
HelperText,
|
|
2188
|
-
{
|
|
2189
|
-
...slotProps?.helperText,
|
|
2190
|
-
errorMessage: error?.message,
|
|
2191
|
-
helperText
|
|
2192
|
-
}
|
|
2193
|
-
)
|
|
2194
|
-
]
|
|
2195
|
-
}
|
|
2196
|
-
)
|
|
2197
|
-
}
|
|
2198
|
-
);
|
|
2199
|
-
};
|
|
2200
|
-
var OTPInputElement2 = ({
|
|
2201
|
-
gridProps = {},
|
|
2202
|
-
...props
|
|
2203
|
-
}) => {
|
|
2204
|
-
return /* @__PURE__ */ jsx16(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component13, { ...props }) });
|
|
2205
|
-
};
|
|
2206
|
-
|
|
2207
|
-
// src/wrappers/Field/index.ts
|
|
2208
|
-
var Field = {
|
|
2209
|
-
Text: TextFieldElement2,
|
|
2210
|
-
Number: NumberFieldElement2,
|
|
2211
|
-
Checkbox: CheckboxElement2,
|
|
2212
|
-
Date: DatePickerElement,
|
|
2213
|
-
RadioGroup: RadioButtonGroup2,
|
|
2214
|
-
Password: PasswordElement,
|
|
2215
|
-
Time: TimePickerElement2,
|
|
2216
|
-
Select: SelectElement2,
|
|
2217
|
-
SelectMulti: SelectMultiElement2,
|
|
2218
|
-
SelectCascade: SelectCascadeElement2,
|
|
2219
|
-
AsyncSelect: AsyncSelectElement2,
|
|
2220
|
-
AsyncMultiSelect: AsyncSelectMultiElement2,
|
|
2221
|
-
CheckboxGroup: CheckboxGroup2,
|
|
2222
|
-
OTPInput: OTPInputElement2
|
|
2223
|
-
};
|
|
2224
|
-
|
|
2225
|
-
export {
|
|
2226
|
-
isValidOption,
|
|
2227
|
-
normalizeOptions,
|
|
2228
|
-
AsyncSelectMultiElement2 as AsyncSelectMultiElement,
|
|
2229
|
-
CheckboxElement2 as CheckboxElement,
|
|
2230
|
-
CheckboxGroup2 as CheckboxGroup,
|
|
2231
|
-
readDatePickerValueAsDate,
|
|
2232
|
-
useDatePickerValue,
|
|
2233
|
-
useDatePickerValidation,
|
|
2234
|
-
useDatePickerStyles,
|
|
2235
|
-
DatePickerElementCore,
|
|
2236
|
-
DatePickerElement,
|
|
2237
|
-
isValidDate,
|
|
2238
|
-
isParsableDateString,
|
|
2239
|
-
createDateInputTransform,
|
|
2240
|
-
createDateOutputTransform,
|
|
2241
|
-
createDefaultDatePickerConfig,
|
|
2242
|
-
extractErrorMessage,
|
|
2243
|
-
createStableKey,
|
|
2244
|
-
PasswordElement,
|
|
2245
|
-
RadioButtonGroup2 as RadioButtonGroup,
|
|
2246
|
-
SelectCascadeElement2 as SelectCascadeElement,
|
|
2247
|
-
SelectElement2 as SelectElement,
|
|
2248
|
-
SelectMultiElement2 as SelectMultiElement,
|
|
2249
|
-
TextFieldElement2 as TextFieldElement,
|
|
2250
|
-
TimePickerElement2 as TimePickerElement,
|
|
2251
|
-
Field
|
|
2252
|
-
};
|
|
2253
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0FzeW5jU2VsZWN0L2luZGV4LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvTnVtYmVyRmllbGRFbGVtZW50L051bWJlckZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9PVFBJbnB1dEVsZW1lbnQvSGVscGVyVGV4dC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpZWxkL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvbW1vbiB0eXBlIGRlZmluaXRpb25zIGZvciB3cmFwcGVyIGNvbXBvbmVudHNcbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEJhc2Ugb3B0aW9uIHR5cGUgZm9yIHNlbGVjdC1iYXNlZCBjb21wb25lbnRzXG4gKlxuICogQHRlbXBsYXRlIFYgLSBUaGUgdmFsdWUgdHlwZSAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU9wdGlvbjxWID0gc3RyaW5nIHwgbnVtYmVyPiB7XG4gIC8qKlxuICAgKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvblxuICAgKi9cbiAgVmFsdWU6IFY7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZsZXhpYmxlIG9wdGlvbiB0eXBlIHRoYXQgZXh0ZW5kcyBiYXNlIG9wdGlvbiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9iamVjdFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmxleGlibGVPcHRpb248XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiA9IFQgJiBCYXNlT3B0aW9uO1xuXG4vKipcbiAqIE9wdGlvbiB0eXBlIHdpdGggY3VzdG9taXphYmxlIGtleSBuYW1lc1xuICogVXNlZnVsIGZvciBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGN1c3RvbSBsYWJlbEZpZWxkL3ZhbHVlRmllbGQgcHJvcHNcbiAqXG4gKiBAdGVtcGxhdGUgVFZhbHVlS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIHZhbHVlXG4gKiBAdGVtcGxhdGUgVExhYmVsS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGxhYmVsXG4gKiBAdGVtcGxhdGUgVERpc2FibGVkS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGRpc2FibGVkIGZsYWdcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUtleU9wdGlvbjxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiAmXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIExlZ2FjeSBvcHRpb24gdHlwZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAqIFVzZXMgVmFsdWUvTGFiZWwgbmFtaW5nIGNvbnZlbnRpb25cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQmFzZU9wdGlvbiBvciBGbGV4aWJsZU9wdGlvbiBpbnN0ZWFkXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5T3B0aW9uIHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgVmFsdWU6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBEaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBvcHRpb25cbiAqXG4gKiBAcGFyYW0gVmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBvcHRpb24gb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE9wdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJhc2VPcHRpb24ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICdMYWJlbCcgaW4gdmFsdWUgJiZcbiAgICAnVmFsdWUnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5MYWJlbCA9PT0gJ3N0cmluZycgJiZcbiAgICAodHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnYm9vbGVhbicpXG4gICk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIG5vcm1hbGl6ZSBvcHRpb25zIHRvIEJhc2VPcHRpb24gZm9ybWF0XG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGFycmF5IHRvIG5vcm1hbGl6ZVxuICogQHBhcmFtIGxhYmVsRmllbGQgLSBDdXN0b20gbGFiZWwgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHZhbHVlRmllbGQgLSBDdXN0b20gdmFsdWUgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHJldHVybnMgTm9ybWFsaXplZCBvcHRpb25zIGFycmF5XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRpb25zOiBUW10sXG4gIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJ1xuKTogQmFzZU9wdGlvbltdIHtcbiAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgIExhYmVsOiBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdID8/ICcnKSxcbiAgICBWYWx1ZTogb3B0aW9uW3ZhbHVlRmllbGRdIGFzIHN0cmluZyB8IG51bWJlcixcbiAgICBkaXNhYmxlZDogQm9vbGVhbihvcHRpb24uZGlzYWJsZWQpLFxuICB9KSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24gfSBmcm9tICdAbXVpL21hdGVyaWFsL0F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgbWF0Y2ggZnJvbSAnYXV0b3N1Z2dlc3QtaGlnaGxpZ2h0L21hdGNoJztcbmltcG9ydCBwYXJzZSBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvcGFyc2UnO1xuaW1wb3J0IF8sIHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIHVzZVN0YXRlLFxuICB1c2VSZWYsXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIEZyYWdtZW50LFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEhUTUxBdHRyaWJ1dGVzLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBUT3B0aW9uXG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgbXVsdGlTZWxlY3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbnMsIHNldFNlbGVjdGVkT3B0aW9uc10gPSB1c2VTdGF0ZTxUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBpbml0aWFsVmFsdWVzTG9hZGVkID0gdXNlUmVmPGJvb2xlYW4+KFxuICAgICEoaW5pdGlhbFZhbHVlcyAmJiBpbml0aWFsVmFsdWVzLmxlbmd0aCA+IDApXG4gICk7XG5cbiAgY29uc3QgaW5wdXRWYWx1ZTI6IHN0cmluZyA9IHVzZU1lbW8oKCkgPT4gaW5wdXRWYWx1ZSwgW2lucHV0VmFsdWVdKTtcbiAgY29uc3Qgc2V0SW5wdXRWYWx1ZTIgPSB1c2VDYWxsYmFjayhcbiAgICAoaW5wdXRWYWx1ZTogc3RyaW5nKSA9PiBzZXRJbnB1dFZhbHVlKGlucHV0VmFsdWUpLFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY011bHRpU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKGMgPT4gY2FsbGJhY2soYykpO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgY29uc3QgZmlsbE9wdGlvbnMgPSB1c2VDYWxsYmFjayhcbiAgICAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgbGV0IG5ld09wdGlvbnM6IHJlYWRvbmx5IFRPcHRpb25bXSA9IFtdO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb25zKSB7XG4gICAgICAgIG5ld09wdGlvbnMgPSBbLi4uc2VsZWN0ZWRPcHRpb25zXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgbmV3bHlBZGRlZCA9IF8uZGlmZmVyZW5jZUJ5KFxuICAgICAgICAgIHJlc3VsdHMsXG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgIGMgPT4gY1t2YWx1ZUZpZWxkXVxuICAgICAgICApO1xuXG4gICAgICAgIG5ld09wdGlvbnMgPSBbLi4ubmV3T3B0aW9ucywgLi4ubmV3bHlBZGRlZF07XG4gICAgICB9XG5cbiAgICAgIHNldE9wdGlvbnMobmV3T3B0aW9ucyk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9LFxuICAgIFtzZWxlY3RlZE9wdGlvbnMsIHZhbHVlRmllbGRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5pdGlhbFZhbHVlc0xvYWRlZC5jdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY011bHRpU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICB9O1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGZldGNoRGF0YShwYXlsb2FkLCAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSAmJiByZXN1bHRzKSB7XG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9ucyhbLi4ucmVzdWx0c10pO1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShbLi4ucmVzdWx0cy5tYXAoYyA9PiBjW3ZhbHVlRmllbGRdKV0pO1xuICAgICAgICBpbml0aWFsVmFsdWVzTG9hZGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbaW5pdGlhbFZhbHVlcywgZmV0Y2hEYXRhLCBmaWVsZCwgdmFsdWVGaWVsZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBpZiAoaW5wdXRWYWx1ZTIgPT09ICcnIHx8IGluaXRpYWxWYWx1ZXNMb2FkZWQuY3VycmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb25zID8gWy4uLnNlbGVjdGVkT3B0aW9uc10gOiBbXSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IGlucHV0VmFsdWUyLFxuICAgICAgaW5pdGlhbFZhbHVlczogbnVsbCxcbiAgICB9O1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBpbnB1dFZhbHVlMiwgZmV0Y2hEYXRhLCBzZWxlY3RlZE9wdGlvbnMsIGZpbGxPcHRpb25zXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1NlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicgfHwgbmV3U2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFtdKTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKFtdKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ3NlbGVjdE9wdGlvbicgfHwgcmVhc29uID09PSAncmVtb3ZlT3B0aW9uJykge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKG5ld1NlbGVjdGVkT3B0aW9ucyk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdTZWxlY3RlZE9wdGlvbnMubWFwKGMgPT4gY1t2YWx1ZUZpZWxkXSkpO1xuICAgIH1cblxuICAgIHNldE9wdGlvbnMoW10pO1xuICB9O1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZF0pIDogJyc7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHJlZj17bXVsdGlTZWxlY3RSZWZ9XG4gICAgICBtdWx0aXBsZVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWwpXG4gICAgICB9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9uc31cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgLy9maWx0ZXJPcHRpb25zPXsoYykgPT4gY31cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4ge1xuICAgICAgICBzZXRJbnB1dFZhbHVlMihuZXdJbnB1dFZhbHVlKTtcbiAgICAgIH19XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMsIG9wdGlvbiwgc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPVxuICAgICAgICAgIHByb3BzIGFzIEhUTUxBdHRyaWJ1dGVzPEhUTUxMSUVsZW1lbnQ+ICYgeyBrZXk6IHN0cmluZyB9O1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGdldE9wdGlvbkxhYmVsKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtYXRjaChvcHRpb25MYWJlbCwgc3RhdGUuaW5wdXRWYWx1ZSwgeyBpbnNpZGVXb3JkczogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZShvcHRpb25MYWJlbCwgbWF0Y2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7cGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogcGFydC5oaWdobGlnaHQgPyA3MDAgOiA0MDAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0LnRleHR9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RNdWx0aSc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IH07XG4iLCAiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBQYXRoVmFsdWUgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBDaGVja2JveEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICBkaXNhYmxlZCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZCxcbiAgfSk7XG5cbiAgaWYgKGZpZWxkLnZhbHVlID09IG51bGwgfHwgZmllbGQudmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgZmllbGQub25DaGFuZ2UoZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID0gdHJhbnNmb3JtPy5vdXRwdXQ7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBib29sZWFuPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gQWRhcHRlcjogRXh0cmFjdCBldmVudCBhbmQgY2hlY2tlZCBmcm9tIHRoZSBjaGVja2JveCBvbkNoYW5nZSBzaWduYXR1cmVcbiAgICAgICAgICAgICAgLy8gQ2hlY2tib3hFbGVtZW50IHBhc3NlcyAoZXZlbnQsIGNoZWNrZWQpLCBidXQgdXNlVHJhbnNmb3JtIGV4cGVjdHMgKGV2ZW50T3JWYWx1ZSwgdmFsdWUpXG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRPclZhbHVlIGFzIFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tT3V0cHV0VHJhbnNmb3JtKGV2ZW50LCBjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IChldmVudE9yVmFsdWUsIF92YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBleHRyYWN0IGNoZWNrZWQgc3RhdGUgZnJvbSB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY2hlY2tlZCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sXG4gICAgY2hlY2tlZDogYm9vbGVhblxuICApID0+IHtcbiAgICBvbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkaXNwbGF5RXJyb3I6IFJlYWN0Tm9kZSA9IGVycm9yXG4gICAgPyB0eXBlb2YgcGFyc2VFcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8ICcnfVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7KGRpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2Rpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0fVxuICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94IGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgY2hlY2tib3ggaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgdmFsdWUgdHJhbnNmb3JtYXRpb24sIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24gd2l0aCB1c2VDb250cm9sbGVyXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmcgc3VwcG9ydFxuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiB3aXRoIHVzZVRyYW5zZm9ybSBob29rIGZvciBib29sZWFuIHZhbHVlc1xuICogLSBDdXN0b21pemFibGUgbGFiZWwgYW5kIHBvc2l0aW9uaW5nXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXIgd2l0aCByZXNwb25zaXZlIGRlc2lnblxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5IHdpdGggZ2VuZXJpYyBjb25zdHJhaW50c1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0IHdpdGggcHJvcGVyIHRoZW1pbmdcbiAqIC0gSGVscGVyIHRleHQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBjb250ZXh0XG4gKiAtIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvblxuICogLSBTaW1wbGUgYm9vbGVhbiB2YWx1ZSBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGN1c3RvbSB0cmFuc2Zvcm1zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhY2NlcHRUZXJtc1wiXG4gKiAgIGxhYmVsPVwiSSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnNcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbGlkYXRpb24gYW5kIGhlbHBlciB0ZXh0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdzbGV0dGVyXCJcbiAqICAgbGFiZWw9XCJTdWJzY3JpYmUgdG8gbmV3c2xldHRlclwiXG4gKiAgIGhlbHBlclRleHQ9XCJZb3UgY2FuIHVuc3Vic2NyaWJlIGF0IGFueSB0aW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2UgYWNjZXB0IHRvIGNvbnRpbnVlJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQgYW5kIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzUHVibGljXCJcbiAqICAgbGFiZWw9XCJNYWtlIHRoaXMgcHVibGljXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGxhYmVsUHJvcHM9e3sgc3g6IHsgZm9udFdlaWdodDogJ2JvbGQnIH0gfX1cbiAqICAgc3g9e3sgY29sb3I6ICdwcmltYXJ5Lm1haW4nIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsdWUgdHJhbnNmb3JtYXRpb24gKHN0cmluZyB0byBib29sZWFuKTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic3RhdHVzXCJcbiAqICAgbGFiZWw9XCJBY3RpdmVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ2FjdGl2ZScsXG4gKiAgICAgb3V0cHV0OiAoY2hlY2tlZCkgPT4gY2hlY2tlZCA/ICdhY3RpdmUnIDogJ2luYWN0aXZlJ1xuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBTaW1wbGUgYm9vbGVhbiBmaWVsZDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNFbmFibGVkXCJcbiAqICAgbGFiZWw9XCJFbmFibGUgZmVhdHVyZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbjpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGVybXNcIlxuICogICBsYWJlbD1cIkFjY2VwdCBUZXJtc1wiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gdChgdmFsaWRhdGlvbi4ke2Vycm9yLnR5cGV9YCwgeyBmaWVsZDogJ1Rlcm1zJyB9KX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENoZWNrYm94R3JvdXAgY29tcG9uZW50XG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj47XG5cbmV4cG9ydCB0eXBlIENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCAnbmFtZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICovXG4gIG5hbWU6IFROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGNoZWNrYm94IGdyb3VwXG4gICAqL1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1snbGFiZWwnXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgRm9ybUNvbnRyb2xMYWJlbFxuICAgKi9cbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnPjtcblxuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBvcHRpb25zIGZvciB0aGUgY2hlY2tib3ggZ3JvdXBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG9wdGlvbnMgd2l0aCBsb3dlcmNhc2Uga2V5cyAobGFiZWwsIHZhbHVlKSBpbnN0ZWFkXG4gICAqL1xuICBvcHRpb25zOiBUT3B0aW9uW107XG5cbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94R3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICBvcHRpb25zLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZFZhbHVlcywgc2V0U2VsZWN0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFxuICAgIG9wdGlvbnNcbiAgICAgIC5maWx0ZXIoYyA9PiBmaWVsZC52YWx1ZT8uaW5jbHVkZXMoY1t2YWx1ZUtleV0pKVxuICAgICAgLm1hcChjID0+IGNbdmFsdWVLZXldKSB8fCBbXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmllbGQub25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNdIDogW10pO1xuICB9LCBbc2VsZWN0ZWRWYWx1ZXNdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgLy8gY29uc3QgdmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWxcbiAgICAvLyBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMocHJldiA9PiBbLi4ucHJldiwgZXZlbnQudGFyZ2V0LnZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKHByZXYgPT4gcHJldi5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBldmVudC50YXJnZXQudmFsdWUpKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAge29wdGlvbnMubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIGtleT17YCR7b3B0aW9uW3ZhbHVlS2V5XX1gfVxuICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvblt2YWx1ZUtleV19XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uW3ZhbHVlS2V5XSl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94R3JvdXAgY29tcG9uZW50IGZvciBtdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBncm91cCBvZiBjaGVja2JveGVzIHRoYXQgd29yayBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogbWFuYWdpbmcgYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgdmFsdWVzIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBNdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24gd2l0aCBhcnJheSB2YWx1ZSBtYW5hZ2VtZW50XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKiAtIE5hTiB2YWxpZGF0aW9uIGZvciBudW1lcmljIHZhbHVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInNlbGVjdGVkQ2F0ZWdvcmllc1wiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IFZhbHVlOiAxLCBMYWJlbDogJ0NhdGVnb3J5IDEnIH0sXG4gKiAgICAgeyBWYWx1ZTogMiwgTGFiZWw6ICdDYXRlZ29yeSAyJyB9LFxuICogICAgIHsgVmFsdWU6IDMsIExhYmVsOiAnQ2F0ZWdvcnkgMycgfSxcbiAqICAgXX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwZXJtaXNzaW9uc1wiXG4gKiAgIG9wdGlvbnM9e3Blcm1pc3Npb25PcHRpb25zfVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgZGlzYWJsZWQ9eyFoYXNFZGl0UGVybWlzc2lvbn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hHcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5DaGVja2JveEdyb3VwLmRpc3BsYXlOYW1lID0gJ0NoZWNrYm94R3JvdXAnO1xuXG5leHBvcnQgeyBDaGVja2JveEdyb3VwIH07XG4iLCAiaW1wb3J0IHsgR3JpZCB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH0gZnJvbSBcIi4vRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50UHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEEgZnVsbHktZmVhdHVyZWQsIHR5cGUtc2FmZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgZm9yIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBjb21iaW5lcyB0aGUgY29yZSBkYXRlIHBpY2tlciBmdW5jdGlvbmFsaXR5IHdpdGggb3B0aW9uYWwgR3JpZCBsYXlvdXQgd3JhcHBpbmcsXG4gKiBwcm92aWRpbmcgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgZm9ybS1iYXNlZCBkYXRlIHNlbGVjdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0LlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gXHVEODNDXHVERkFGICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlcyBhbmQgZGF0ZSB2YWx1ZXNcbiAqIC0gXHVEODNEXHVERDI3ICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0gXHVEODNDXHVERkE4ICoqVGhlbWluZyoqOiBBdXRvbWF0aWMgYWRhcHRhdGlvbiB0byBNVUkgdGhlbWUgd2l0aCBjdXN0b21pemFibGUgc3R5bGVzXG4gKiAtIFx1MjY3RiAqKkFjY2Vzc2liaWxpdHkqKjogV0NBRy1jb21wbGlhbnQgd2l0aCBwcm9wZXIgQVJJQSBhdHRyaWJ1dGVzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gKiAtIFx1RDgzRFx1REU4MCAqKlBlcmZvcm1hbmNlKio6IE9wdGltaXplZCB3aXRoIG1lbW9pemF0aW9uIGFuZCBlZmZpY2llbnQgcmUtcmVuZGVyaW5nXG4gKiAtIFx1RDgzRFx1RENGMSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0gXHVEODNEXHVERUUxXHVGRTBGICoqVmFsaWRhdGlvbioqOiBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gXHVEODNEXHVERDA0ICoqVHJhbnNmb3JtYXRpb24qKjogRmxleGlibGUgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBcdUQ4M0RcdURDREEgKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsICJpbXBvcnQgeyB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGggfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQge1xuICB1c2VEYXRlUGlja2VyVmFsdWUsXG4gIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uLFxuICB1c2VEYXRlUGlja2VyU3R5bGVzLFxufSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgY29yZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aG91dCBHcmlkIHdyYXBwZXIuXG4gKlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0LCBwZXJmb3JtYW50IGRhdGUgcGlja2VyIGNvbXBvbmVudCB0aGF0IGludGVncmF0ZXMgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0gd2hpbGUgcHJvdmlkaW5nIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0IGFuZFxuICogYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlc1xuICogLSBBdXRvbWF0aWMgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gVGhlbWUtYXdhcmUgc3R5bGluZyB3aXRoIGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgd2l0aCBwcm9wZXIgbWVtb2l6YXRpb25cbiAqIC0gRm9yd2FyZCByZWYgc3VwcG9ydCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICByZXF1aXJlZFxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJTdGFydCBEYXRlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH19XG4gKiAgIHZhbGlkYXRpb249e3tcbiAqICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInXG4gKiAgICAgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnRDb3JlID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oXG4gIDxcbiAgICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICAgIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgPihcbiAgICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8XG4gICAgICBURmllbGRWYWx1ZXMsXG4gICAgICBUTmFtZSxcbiAgICAgIFRWYWx1ZSxcbiAgICAgIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmVcbiAgICA+LFxuICAgIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuICApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIGxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICB0ZXh0UmVhZE9ubHkgPSBmYWxzZSxcbiAgICAgIGhlbHBlclRleHQsXG4gICAgICBpbnB1dFByb3BzID0ge30sXG4gICAgICBzbG90UHJvcHMgPSB7fSxcbiAgICAgIGRhdGVQaWNrZXJQcm9wcyA9IHt9LFxuICAgICAgdmFyaWFudCA9ICdvdXRsaW5lZCcsXG4gICAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgICAgLi4ucmVzdFByb3BzXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICAgIG9uQ2xvc2UsXG4gICAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gICAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAgIC8vIFNldCB1cCBmb3JtIGNvbnRyb2xsZXJcbiAgICBjb25zdCB7IGZpZWxkLCBmaWVsZFN0YXRlIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250cm9sLFxuICAgICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIGFueSwgLy8gTGV0IHJlYWN0LWhvb2stZm9ybSBoYW5kbGUgdGhlIGRlZmF1bHQgdmFsdWUgdHlwaW5nXG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2U6IG9uVmFsdWVDaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gICAgICBmaWVsZCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRpb24gaG9va1xuICAgIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgICAgZmllbGRTdGF0ZSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG5cbiAgICAvLyBTdHlsaW5nIGhvb2tcbiAgICBjb25zdCB7IGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGhhc0Vycm9yLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHRleHRSZWFkT25seSxcbiAgICB9KTtcblxuICAgIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAgIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKFxuICAgICAgICBuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgICAgICkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBbb25WYWx1ZUNoYW5nZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgQXJyYXk8XG4gICAgICAgICAgICAnYWNjZXB0JyB8ICdjYW5jZWwnIHwgJ2NsZWFyJyB8ICduZXh0JyB8ICduZXh0T3JBY2NlcHQnIHwgJ3RvZGF5J1xuICAgICAgICAgID4sXG4gICAgICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgJ2FyaWEtaW52YWxpZCc6IGludmFsaWQsXG4gICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLi4uKGxvYWRpbmcgJiZcbiAgICAgICAgICAgIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIHNsb3RQcm9wcyxcbiAgICAgICAgaW5wdXRQcm9wcyxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICBoYXNFcnJvcixcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBoZWxwZXJUZXh0LFxuICAgICAgICB0ZXh0UmVhZE9ubHksXG4gICAgICAgIGludmFsaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAvLyBTcHJlYWQgcmVzdCBwcm9wcyBmaXJzdCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuXG4gICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuICAgICAgICAvLyBDb3JlIHByb3BzXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICAgIC8vIFVJIHByb3BzXG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgLy8gU2xvdCBwcm9wc1xuICAgICAgICBzbG90UHJvcHM9e21lbW9pemVkU2xvdFByb3BzfVxuICAgICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICAgIGFyaWEtaW52YWxpZD17aW52YWxpZH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17aGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbik7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZ1xuRGF0ZVBpY2tlckVsZW1lbnRDb3JlLmRpc3BsYXlOYW1lID0gJ0RhdGVQaWNrZXJFbGVtZW50Q29yZSc7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudENvcmU7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVRyYW5zZm9ybSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIFR5cGUtc2FmZSBkYXRlIHZhbHVlIHJlYWRlciB0aGF0IGhhbmRsZXMgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSBmcm9tIHRoZSBkYXRlIGFkYXB0ZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGxvY2FsaXphdGlvbiBjb250ZXh0IGZyb20gTVVJIGRhdGUgcGlja2Vyc1xuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKHN0cmluZywgZGF0ZSwgb3IgbnVsbClcbiAqIEByZXR1cm5zIFByb3Blcmx5IHR5cGVkIGRhdGUgdmFsdWUgb3IgbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERhdGVQaWNrZXJWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlIHwgdW5kZWZpbmVkXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBhZGFwdGVyIHRvIHBhcnNlIHRoZSBzdHJpbmcgaW50byBhIGRhdGVcbiAgICBjb25zdCBwYXJzZWREYXRlID0gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKTtcblxuICAgIHJldHVybiBwYXJzZWREYXRlIGFzIFREYXRlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVPcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIGNvbnRyb2xsZXIgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cbiAgZmllbGQ6IFVzZUNvbnRyb2xsZXJSZXR1cm48VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJmaWVsZFwiXTtcbiAgLyoqIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyAqL1xuICB0cmFuc2Zvcm0/OiBEYXRlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4ge1xuICAvKiogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXIgKi9cbiAgdmFsdWU6IFRWYWx1ZSB8IG51bGw7XG4gIC8qKiBDaGFuZ2UgaGFuZGxlciBmb3IgcGlja2VyIHZhbHVlIHVwZGF0ZXMgKi9cbiAgb25DaGFuZ2U6IChcbiAgICB2YWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPlxuICApID0+IHZvaWQ7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsdWUgdHJhbnNmb3JtYXRpb25zIHdpdGggdHlwZSBzYWZldHlcbiAqIFxuICogVGhpcyBob29rIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBmb3JtIGZpZWxkIHZhbHVlcyBhbmQgZGF0ZSBwaWNrZXIgdmFsdWVzLFxuICogYXBwbHlpbmcgY3VzdG9tIHRyYW5zZm9ybWF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBzdHJpY3QgVHlwZVNjcmlwdCB0eXBpbmcuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb246XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICogICBmaWVsZCxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIERheS5qcyBkYXRlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBkYXlqcyhkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdmFsdWUgdHJhbnNmb3JtYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYW5zZm9ybWVkIHZhbHVlIGFuZCBjaGFuZ2UgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclZhbHVlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZT4ge1xuICBjb25zdCB7IGZpZWxkLCB0cmFuc2Zvcm0gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFkYXB0ZXIgPSB1c2VMb2NhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgLy8gVHJhbnNmb3JtIHRoZSBmaWVsZCB2YWx1ZSBmb3IgZGlzcGxheSBpbiB0aGUgcGlja2VyXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKTogVFZhbHVlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm0uaW5wdXQoZmllbGQudmFsdWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBoYW5kbGUgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICAgIHJldHVybiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlKGFkYXB0ZXIsIGZpZWxkLnZhbHVlKSBhcyBUVmFsdWUgfCBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZpZWxkLnZhbHVlLCB0cmFuc2Zvcm0/LmlucHV0LCBhZGFwdGVyXSk7XG5cbiAgLy8gQ3JlYXRlIGEgc3RhYmxlIGNoYW5nZSBoYW5kbGVyXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLCBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm0ub3V0cHV0KG5ld1ZhbHVlLCBjb250ZXh0KTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZSh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IHN0b3JlIHRoZSBkYXRlIGFzLWlzXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIHN0YXRlIGZyb20gcmVhY3QtaG9vay1mb3JtIGNvbnRyb2xsZXIgKi9cbiAgZmllbGRTdGF0ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkU3RhdGVcIl07XG4gIC8qKiBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkYXRlIHBpY2tlciAqL1xuICB2YWxpZGF0aW9uPzogRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWc8VFZhbHVlPjtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogVGhlIGN1cnJlbnQgZGF0ZSB2YWx1ZSBmb3IgdmFsaWRhdGlvbiAqL1xuICB2YWx1ZT86IFRWYWx1ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycyAqL1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3IgKGZvcm0gb3IgZGF0ZS1zcGVjaWZpYykgKi9cbiAgZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkO1xuICAvKiogRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlOiBSZWFjdE5vZGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlICovXG4gIGludmFsaWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGRhdGUgdmFsaWRhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gIHJlcXVpcmVkOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsaWRhdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIFxuICogVGhpcyBob29rIGNlbnRyYWxpemVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGRhdGUgcGlja2VycywgaGFuZGxpbmcgYm90aFxuICogcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzXG4gKiBmcm9tIE1VSSBkYXRlIHBpY2tlcnMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGZvcm0gdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHZhbGlkYXRpb246IHtcbiAqICAgICBtaW5EYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICd5ZWFyJyksXG4gKiAgICAgbWF4RGF0ZTogZGF5anMoKS5hZGQoMSwgJ3llYXInKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnRGF0ZSBtdXN0IGJlIHdpdGhpbiB0aGUgbGFzdCB5ZWFyJyxcbiAqICAgICAgIG1heERhdGU6ICdEYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMSB5ZWFyIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBjdXN0b20gZXJyb3IgcGFyc2VyOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgcGFyc2VFcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAqICAgICAgIHJldHVybiBgRGF0ZSBFcnJvcjogJHtlcnJvcn1gO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gc3RhdGUgYW5kIGVycm9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICBjb25zdCB7IGZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHBhcnNlRXJyb3IsIHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE1lbW9pemUgdmFsaWRhdGlvbiByZXN1bHRzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvcjogZmllbGRFcnJvciwgaW52YWxpZCB9ID0gZmllbGRTdGF0ZTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGZvcm0gdmFsaWRhdGlvbiBlcnJvclxuICAgIGxldCBjdXJyZW50RXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkID0gZmllbGRFcnJvcjtcbiAgICBcbiAgICAvLyBDaGVjayBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb25zIGlmIG5vIGZvcm0gZXJyb3IgYW5kIHdlIGhhdmUgYSB2YWx1ZVxuICAgIGlmICghZmllbGRFcnJvciAmJiB2YWx1ZSAmJiB2YWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUsIHNob3VsZERpc2FibGVEYXRlLCBlcnJvck1lc3NhZ2VzIH0gPSB2YWxpZGF0aW9uO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBtaW5pbXVtIGRhdGVcbiAgICAgIGlmIChtaW5EYXRlICYmIHZhbHVlIDwgbWluRGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21pbkRhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1pbkRhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWF4aW11bSBkYXRlXG4gICAgICBlbHNlIGlmIChtYXhEYXRlICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21heERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1heERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZGlzYWJsZWQgZGF0ZVxuICAgICAgZWxzZSBpZiAoc2hvdWxkRGlzYWJsZURhdGUgJiYgc2hvdWxkRGlzYWJsZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnZGlzYWJsZWREYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5kaXNhYmxlZERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNFcnJvciA9IEJvb2xlYW4oY3VycmVudEVycm9yKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3IsXG4gICAgICBlcnJvcjogY3VycmVudEVycm9yLFxuICAgICAgaW52YWxpZDogaW52YWxpZCB8fCBoYXNFcnJvcixcbiAgICB9O1xuICB9LCBbZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgdmFsdWVdKTtcblxuICAvLyBNZW1vaXplIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZ1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB1c2VNZW1vKCgpOiBSZWFjdE5vZGUgPT4ge1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciBwYXJzZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyc2VFcnJvcikge1xuICAgICAgcmV0dXJuIHBhcnNlRXJyb3IodmFsaWRhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlIGhhbmRsaW5nXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCdtZXNzYWdlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgaWYgKCd0eXBlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5yZXF1aXJlZDtcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZTtcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZTtcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGU7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgfSwgW3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IsIHBhcnNlRXJyb3JdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgZXJyb3JNZXNzYWdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjsiLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGEgdmFsaWRhdGlvbiBlcnJvciAqL1xuICBoYXNFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZSAqL1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgaW5wdXQgaXMgcmVhZC1vbmx5ICovXG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gc3R5bGVzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMgKi9cbiAgc3g/OiBTeFByb3BzPFRoZW1lPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICAvKiogQ29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50ICovXG4gIHN4OiBTeFByb3BzPFRoZW1lPjtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIHN0eWxpbmcgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIHRoZW1lLWF3YXJlIGRhdGUgcGlja2VyIHN0eWxlcyB3aXRoIGNvbnNpc3RlbnQgZGVzaWduIHN5c3RlbSBpbnRlZ3JhdGlvblxuICogXG4gKiBUaGlzIGhvb2sgcHJvdmlkZXMgb3B0aW1pemVkLCBtZW1vaXplZCBzdHlsZXMgZm9yIGRhdGUgcGlja2VyIGNvbXBvbmVudHMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhZGFwdCB0byB0aGUgY3VycmVudCBNVUkgdGhlbWUgYW5kIGNvbXBvbmVudCBzdGF0ZSAoZGlzYWJsZWQsIGVycm9yLCBsb2FkaW5nLCBldGMuKS5cbiAqIEl0IGVuc3VyZXMgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBhbGwgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzIHdoaWxlIGFsbG93aW5nIGN1c3RvbWl6YXRpb24uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgbG9hZGluZzogaXNMb2FkaW5nXG4gKiB9KTtcbiAqIFxuICogcmV0dXJuIDxEYXRlUGlja2VyIHN4PXtzeH0gLi4uIC8+O1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgc3g6IHtcbiAqICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgY29sb3I6ICdwcmltYXJ5Lm1haW4nXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFN0eWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29tcHV0ZWQgc3R5bGVzIGFuZCBjbGFzcyBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclN0eWxlcyhcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMgPSB7fVxuKTogVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHksIHN4OiBjdXN0b21TeCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIE1lbW9pemUgY29tcHV0ZWQgc3R5bGVzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCBjb21wdXRlZFN4ID0gdXNlTWVtbygoKTogU3hQcm9wczxUaGVtZT4gPT4ge1xuICAgIGNvbnN0IGJhc2VTdHlsZXM6IFN4UHJvcHM8VGhlbWU+ID0ge1xuICAgICAgLy8gSW5wdXQgZmllbGQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kIFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmb3Igc21vb3RoIHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICAgICAgJ2JvcmRlci1jb2xvcicsXG4gICAgICAgICAgJ2NvbG9yJ1xuICAgICAgICBdLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBFcnJvciBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZm9jdXNlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAycHggJHt0aGVtZS5wYWxldHRlLmVycm9yLm1haW59MjVgLCAvLyAyNSBpcyAxNSUgb3BhY2l0eSBpbiBoZXhcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSW5wdXQgZWxlbWVudCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgIGN1cnNvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyBcIm5vdC1hbGxvd2VkXCIgXG4gICAgICAgICAgOiB0ZXh0UmVhZE9ubHkgXG4gICAgICAgICAgICA/IFwicG9pbnRlclwiIFxuICAgICAgICAgICAgOiBcInRleHRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFJlYWQtb25seSBzcGVjaWZpYyBzdHlsaW5nXG4gICAgICAgIC4uLih0ZXh0UmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnRcIiwgLy8gSGlkZSB0ZXh0IGN1cnNvciBpbiByZWFkLW9ubHkgbW9kZVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwid2FpdFwiLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZpZWxkIGFzdGVyaXNrIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICBmb250U2l6ZTogXCIxLjJlbVwiLFxuICAgICAgfSxcblxuICAgICAgLy8gTGFiZWwgc3R5bGluZyB3aXRoIGJldHRlciBjb250cmFzdFxuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogaGFzRXJyb3IgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgOiB0aGVtZS5wYWxldHRlLnRleHQuc2Vjb25kYXJ5LFxuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciBjb250cmFzdCBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICAgICAgLi4uKGRpc2FibGVkICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEhlbHBlciB0ZXh0IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpRm9ybUhlbHBlclRleHQtcm9vdFwiOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBcbiAgICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIENhbGVuZGFyIGljb24gc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEFkb3JubWVudC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQgXG4gICAgICAgICAgOiBoYXNFcnJvciBcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5hY3RpdmUsXG4gICAgICB9LFxuXG4gICAgICAvLyBGb2N1cyByaW5nIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZm9jdXNlZFwiOiB7XG4gICAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbn01MGAsIC8vIDUwIGlzIDMxJSBvcGFjaXR5XG4gICAgICAgIG91dGxpbmVPZmZzZXQ6IFwiMnB4XCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBFbmhhbmNlZCBjb250cmFzdCBmb3IgZGFyayB0aGVtZXNcbiAgICAgIC4uLih0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdkYXJrJyAmJiB7XG4gICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICAvLyBNZXJnZSB3aXRoIGN1c3RvbSBzdHlsZXNcbiAgICByZXR1cm4gY3VzdG9tU3ggPyBbYmFzZVN0eWxlcywgY3VzdG9tU3hdIGFzIFN4UHJvcHM8VGhlbWU+IDogYmFzZVN0eWxlcztcbiAgfSwgW1xuICAgIHRoZW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGN1c3RvbVN4LFxuICBdKTtcblxuICAvLyBHZW5lcmF0ZSBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBleHRlcm5hbCBzdHlsaW5nIGhvb2tzXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgaWYgKGRpc2FibGVkKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1kaXNhYmxlZCcpO1xuICAgIGlmIChoYXNFcnJvcikgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZXJyb3InKTtcbiAgICBpZiAobG9hZGluZykgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tbG9hZGluZycpO1xuICAgIGlmICh0ZXh0UmVhZE9ubHkpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLXJlYWRPbmx5Jyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMubGVuZ3RoID4gMCA/IGNsYXNzZXMuam9pbignICcpIDogdW5kZWZpbmVkO1xuICB9LCBbZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHldKTtcblxuICByZXR1cm4ge1xuICAgIHN4OiBjb21wdXRlZFN4LFxuICAgIGNsYXNzTmFtZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclN0eWxlczsiLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCAiaW1wb3J0IFZpc2liaWxpdHkgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5JztcbmltcG9ydCBWaXNpYmlsaXR5T2ZmIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eU9mZic7XG5pbXBvcnQgdHlwZSB7IEljb25CdXR0b25Qcm9wcywgVGV4dEZpZWxkUHJvcHMsIEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IE1vdXNlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgUGFzc3dvcmRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+ID0gT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnIHwgJ3NpemUnPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwicGFzc3dvcmRcIiB8IFwidXNlci5jdXJyZW50UGFzc3dvcmRcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb24gYnV0dG9uXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJkZWZhdWx0XCJcbiAgICovXG4gIGljb25Db2xvcj86IEljb25CdXR0b25Qcm9wc1snY29sb3InXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IHBhc3N3b3JkID0+IChwYXNzd29yZCA/IDxWaXNpYmlsaXR5IC8+IDogPFZpc2liaWxpdHlPZmYgLz4pLFxuICAgIHNsb3RQcm9wcyxcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17J2VuZCd9PlxuICAgICAgPEljb25CdXR0b25cbiAgICAgICAgb25Nb3VzZURvd249eyhlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYXNzd29yZCghcGFzc3dvcmQpfVxuICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgIGNvbG9yPXtpY29uQ29sb3IgPz8gJ2RlZmF1bHQnfVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J31cbiAgICAgIHZhbHVlPXtmaWVsZC52YWx1ZSA/PyAnJ31cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgdmFyaWFudD17cmVzdC52YXJpYW50ID8/ICdvdXRsaW5lZCd9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlc3Qub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09ICd1bmRlZmluZWQnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LmlucHV0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1snc2xvdFByb3BzJ10sXG4gICAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgcGFzc3dvcmQgVGV4dEZpZWxkIHdpdGggc2hvdy9oaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHBhc3N3b3JkIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBhIGJ1aWx0LWluIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvbi4gVGhlIHBhc3N3b3JkXG4gKiBjYW4gYmUgc2hvd24gb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBleWUgaWNvbiBpbiB0aGUgaW5wdXQncyBlbmQgYWRvcm5tZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBQYXNzd29yZCB2aXNpYmlsaXR5IHRvZ2dsZVxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgdmlzaWJpbGl0eSBpY29uc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGFzc3dvcmRcIlxuICogICBsYWJlbD1cIlBhc3N3b3JkXCJcbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAqICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IDgsIG1lc3NhZ2U6ICdNaW5pbXVtIDggY2hhcmFjdGVycycgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBpY29uIGNvbG9yOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICogICBsYWJlbD1cIkNvbmZpcm0gUGFzc3dvcmRcIlxuICogICBpY29uQ29sb3I9XCJwcmltYXJ5XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJSZS1lbnRlciB5b3VyIHBhc3N3b3JkXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdQYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiTmV3IFBhc3N3b3JkXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJlbmRlckljb249eyhoaWRkZW4pID0+IGhpZGRlbiA/IDxDdXN0b21IaWRlSWNvbiAvPiA6IDxDdXN0b21TaG93SWNvbiAvPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IFBhc3N3b3JkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcblxuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IFBhc3N3b3JkRWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgUmFkaW9Hcm91cFByb3BzLFxuICBSYWRpb1Byb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIFJhZGlvLFxuICBSYWRpb0dyb3VwLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+IHtcbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogJ251bWJlcicgfCAnc3RyaW5nJyB8ICdib29sZWFuJztcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJyB8ICd2YWx1ZSc+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcbiAgcmFkaW9Qcm9wcz86IFJhZGlvUHJvcHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG5hbWUsXG4gICAgbGFiZWxLZXkgPSAnbGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9ICdpZCcgYXMgVFZhbHVlS2V5LFxuICAgIGRpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyBhcyBURGlzYWJsZWRLZXksXG4gICAgcmVxdWlyZWQsXG4gICAgZW1wdHlPcHRpb25MYWJlbCxcbiAgICByZXR1cm5PYmplY3QsXG4gICAgcm93ID0gdHJ1ZSxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uXG4gID4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgKCcnIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1snb25DaGFuZ2UnXSA9IChldmVudCwgcmFkaW9WYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gcmV0dXJuT2JqZWN0XG4gICAgICA/IChvcHRpb25zIGFzIFRPcHRpb25bXSkuZmluZChvcHRpb24gPT4gb3B0aW9uW3ZhbHVlS2V5XSA9PT0gcmFkaW9WYWx1ZSlcbiAgICAgIDogKHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgIG9uQ2hhbmdlKGV2ZW50LCByZXR1cm5WYWx1ZSk7XG4gICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXN0Lm9uQ2hhbmdlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPFJhZGlvR3JvdXAgb25DaGFuZ2U9e29uUmFkaW9DaGFuZ2V9IG5hbWU9e25hbWV9IHJvdz17cm93fSB2YWx1ZT17dmFsdWV9PlxuICAgICAgICB7ZW1wdHlPcHRpb25MYWJlbCAmJiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxSYWRpb1xuICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9eyF2YWx1ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhYmVsPXtlbXB0eU9wdGlvbkxhYmVsfVxuICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHtvcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvblt2YWx1ZUtleV07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSBvcHRpb25bZGlzYWJsZWRLZXldIHx8IGZhbHNlO1xuICAgICAgICAgIGxldCB2YWw6IFRPcHRpb25bVFZhbHVlS2V5XSB8IHVuZGVmaW5lZCA9IHJldHVybk9iamVjdFxuICAgICAgICAgICAgPyAodmFsdWUgYXMgVE9wdGlvbik/Llt2YWx1ZUtleV1cbiAgICAgICAgICAgIDogKHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbCA9IE51bWJlcih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBvcHRpb25EaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25LZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgIHtlcnJvciAmJiA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD59XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IFJhZGlvQnV0dG9uR3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdsYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzICBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVERpc2FibGVkS2V5XG4+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxcbiAgICAgICAgVEZpZWxkVmFsdWVzLFxuICAgICAgICBUTmFtZSxcbiAgICAgICAgVE9wdGlvbixcbiAgICAgICAgVFZhbHVlS2V5LFxuICAgICAgICBUTGFiZWxLZXksXG4gICAgICAgIFREaXNhYmxlZEtleVxuICAgICAgPlxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblJhZGlvQnV0dG9uR3JvdXAuZGlzcGxheU5hbWUgPSAnUmFkaW9CdXR0b25Hcm91cCc7XG5cbmV4cG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGRlcGVuZHNPbjogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaXNFZGl0PzogYm9vbGVhbjtcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0Q2FzY2FkZUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnLFxuICAgIG5hbWUsXG4gICAgb25CbHVyLFxuICAgIG9uQ2hhbmdlLFxuICAgIGRpc2FibGVkLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBjb250cm9sLFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBkZXBlbmRzT24sXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIGlzRWRpdCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCBnZXRPcHRpb25LZXkgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmPFRPcHRpb24+KGRlcGVuZGVudEZpZWxkLnZhbHVlID8/IG51bGwpO1xuICBjb25zdCBoYXNBdXRvU2VsZWN0ZWQgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHBhcmVudFZhbHVlUmVmPy5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgaGFzQXV0b1NlbGVjdGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoISFmaWVsZC52YWx1ZSAmJiBwYXJlbnRWYWx1ZVJlZj8uY3VycmVudCAhPT0gZGVwZW5kZW50RmllbGQudmFsdWUpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2RlcGVuZGVudEZpZWxkLnZhbHVlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICAhaXNFZGl0ICYmXG4gICAgICAhZGlzYWJsZWQgJiZcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAhIWRlcGVuZGVudEZpZWxkLnZhbHVlICYmXG4gICAgICAhaGFzQXV0b1NlbGVjdGVkLmN1cnJlbnQgJiZcbiAgICAgIGZpZWxkLnZhbHVlID09IG51bGxcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgICBoYXNBdXRvU2VsZWN0ZWQuY3VycmVudCA9IHRydWU7XG4gICAgfVxuXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGZpZWxkLnZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGhhc0F1dG9TZWxlY3RlZCxcbiAgICBpc0VkaXQsXG4gICAgZGlzYWJsZWQsXG4gICAgZmllbGQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGRlcGVuZGVudEZpZWxkLm9uQ2hhbmdlLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcChvcHRpb24gPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsIHx8IGRpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSA/IGdldE9wdGlvbktleShuZXdWYWx1ZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkIHx8IG9wdGlvbnMubGVuZ3RoID09IDB9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWVcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdENhc2NhZGVFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdENhc2NhZGVFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVZhbHVlLFxuICBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24sXG4gIEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICB1c2VNZW1vLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB0eXBlIFN5bnRoZXRpY0V2ZW50LFxuICB1c2VSZWYsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGbGV4aWJsZU9wdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFNlbGVjdEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdvcHRpb25zJ1xuPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiY2F0ZWdvcnlcIiB8IFwidXNlci5kZXBhcnRtZW50XCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBzZWxlY3QgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJDaG9vc2UgYW4gb3B0aW9uLi4uXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJDYXRlZ29yeVwiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGVkaXQgbW9kZSAoYWZmZWN0cyBhdXRvLXNlbGVjdGlvbiBiZWhhdmlvcilcbiAgICogV2hlbiBmYWxzZSBhbmQgb25seSBvbmUgb3B0aW9uIGV4aXN0cywgdGhhdCBvcHRpb24gaXMgYXV0by1zZWxlY3RlZFxuICAgKiBAZGVmYXVsdFZhbHVlIGZhbHNlXG4gICAqL1xuICBpc0VkaXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VsZWN0IGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBpbiBvcHRpb24gb2JqZWN0cyB0byB1c2UgYXMgZGlzcGxheSBsYWJlbFxuICAgKiBAZGVmYXVsdFZhbHVlIFwiTGFiZWxcIlxuICAgKiBAZXhhbXBsZSBcIm5hbWVcIiB8IFwidGl0bGVcIlxuICAgKi9cbiAgbGFiZWxLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBpbiBvcHRpb24gb2JqZWN0cyB0byB1c2UgYXMgdGhlIHZhbHVlXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJWYWx1ZVwiXG4gICAqIEBleGFtcGxlIFwiaWRcIiB8IFwiY29kZVwiXG4gICAqL1xuICB2YWx1ZUtleT86IGtleW9mIFRPcHRpb247XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG5cbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RFbGVtZW50PFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBpc0VkaXQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGxhYmVsLFxuICAgIHZhcmlhbnQsXG4gICAgZGlzYWJsZWQsXG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnLFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcbiAgY29uc3QgaWdub3JlQXV0b1NlbGVjdFJlZiA9IHVzZVJlZjx1bmtub3duPihudWxsKTtcbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDsgLy8gUmV0dXJuIG51bGwgZm9yIGNvbnNpc3RlbmN5XG4gICAgfSxcbiAgICBbdmFsdWVLZXldXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsS2V5XSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1ZhbHVlOiBBdXRvY29tcGxldGVWYWx1ZTxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8+LFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ld1ZhbHVlIGFzIFRPcHRpb24gfCBudWxsO1xuXG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJyAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWdub3JlQXV0b1NlbGVjdFJlZi5jdXJyZW50ID0gZ2V0T3B0aW9uVmFsdWUob3B0aW9uc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGlmIHRoZXkgc2VsZWN0IHNvbWV0aGluZyBlbHNlIG9yIHRoZSBzdGF0ZSBjaGFuZ2VzXG4gICAgICBpZ25vcmVBdXRvU2VsZWN0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGZpZWxkLm9uQ2hhbmdlKG9wdGlvbiA/IGdldE9wdGlvblZhbHVlKG9wdGlvbikgOiBudWxsKTtcbiAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgZmllbGQudmFsdWUgPT09ICcnKVxuICAgICkge1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbiA9IG9wdGlvbnNbMF07XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBnZXRPcHRpb25WYWx1ZShkZWZhdWx0T3B0aW9uKTtcblxuICAgICAgaWYgKGlnbm9yZUF1dG9TZWxlY3RSZWYuY3VycmVudCAhPT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbb3B0aW9uc10pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBmaWVsZC52YWx1ZSkgPz8gbnVsbCxcbiAgICBbZmllbGQudmFsdWUsIG9wdGlvbnMsIGdldE9wdGlvblZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnM9e2ZhbHNlfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgYXV0b2NvbXBsZXRlVmFsdWUgYXMgQXV0b2NvbXBsZXRlVmFsdWU8XG4gICAgICAgICAgVE9wdGlvbixcbiAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgICAgICAgIEZyZWVTb2xvXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9ucy5sZW5ndGggPT0gMH1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXsoXG4gICAgICAgIG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPlxuICAgICAgKSA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBBdXRvY29tcGxldGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgZnJvbSBwcmVkZWZpbmVkIG9wdGlvbnMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHNlbGVjdC9hdXRvY29tcGxldGUgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSwgaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICogZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy4gSXQgc3VwcG9ydHMgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b2NvbXBsZXRlIHdpdGggZmlsdGVyaW5nXG4gKiAtIFNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIHN1cHBvcnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG9wdGlvbiBkaXNwbGF5IChsYWJlbEtleS92YWx1ZUtleSlcbiAqIC0gQXV0by1zZWxlY3Rpb24gd2hlbiBvbmx5IG9uZSBvcHRpb24gZXhpc3RzXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY2F0ZWdvcnlcIlxuICogICBsYWJlbD1cIkNhdGVnb3J5XCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgTGFiZWw6ICdUZWNobm9sb2d5JywgVmFsdWU6ICd0ZWNoJyB9LFxuICogICAgIHsgTGFiZWw6ICdGaW5hbmNlJywgVmFsdWU6ICdmaW5hbmNlJyB9XG4gKiAgIF19XG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5JyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBrZXlzOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcklkXCJcbiAqICAgbGFiZWw9XCJBc3NpZ24gdG8gVXNlclwiXG4gKiAgIG9wdGlvbnM9e3VzZXJzfVxuICogICBsYWJlbEtleT1cImZ1bGxOYW1lXCJcbiAqICAgdmFsdWVLZXk9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24gZXh0ZW5kcyBGbGV4aWJsZU9wdGlvbiA9IEZsZXhpYmxlT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdEVsZW1lbnQnO1xuIiwgImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBHcmlkLFxuICBDaGVja2JveCxcbiAgVGV4dEZpZWxkLFxuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEZsZXhpYmxlT3B0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUsXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgJ25hbWUnIHwgJ3JlbmRlcklucHV0JyB8ICdtdWx0aXBsZScgfCAnb25DaGFuZ2UnIHwgJ3ZhbHVlJ1xuPjtcblxuZXhwb3J0IHR5cGUgU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIEZsZXhpYmxlT3B0aW9uID0gRmxleGlibGVPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbj4ocHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGRdIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBmaWVsZC52YWx1ZS5pbmNsdWRlcyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSlcbiAgICAgIDogW107XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFN5bnRoZXRpY0V2ZW50LFxuICAgIHNlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKFtdKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ3NlbGVjdE9wdGlvbicgfHwgcmVhc29uID09PSAncmVtb3ZlT3B0aW9uJykge1xuICAgICAgY29uc3QgbmV3VmFsdWVzID0gc2VsZWN0ZWRPcHRpb25zLm1hcChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSk7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGljb24gPSA8Q2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcbiAgY29uc3QgY2hlY2tlZEljb24gPSA8Q2hlY2tCb3hJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICB2YWx1ZT17c2VsZWN0ZWRWYWx1ZX1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZGlzYWJsZUNsb3NlT25TZWxlY3RcbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkID8/IGZpZWxkLmRpc2FibGVkID8/IG9wdGlvbnMubGVuZ3RoID09IDB9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzMSwgb3B0aW9uLCB7IHNlbGVjdGVkIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSBwcm9wczE7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgaWNvbj17aWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZEljb249e2NoZWNrZWRJY29ufVxuICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7Z2V0T3B0aW9uTGFiZWwob3B0aW9uIGFzIFRPcHRpb24pfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBGbGV4aWJsZU9wdGlvbiA9IEZsZXhpYmxlT3B0aW9uLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdE11bHRpRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RNdWx0aUVsZW1lbnQnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIC8qKlxuICAgKiBDdXN0b20gb25DaGFuZ2UgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdHJhbnNmb3JtYXRpb25cbiAgICovXG4gIG9uQ2hhbmdlPzogKFxuICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogRW5hYmxlIGRldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb24gaXNzdWVzXG4gICAqIEBkZWZhdWx0VmFsdWUgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICovXG4gIGVuYWJsZVdhcm5pbmdzPzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgdHJhbnNmb3JtLFxuICAgIGZpZWxkVHlwZSA9ICd0ZXh0JywgLy8gRGVmYXVsdCB0byB0ZXh0IHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICBlbmFibGVXYXJuaW5ncyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25JbnB1dCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25JbnB1dD17KGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAgXHUyNkEwXHVGRTBGIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgVGltZVBpY2tlclByb3BzLFxuICBUaW1lUGlja2VyU2xvdFByb3BzLFxuICBUaW1lVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IFRpbWVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFscyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5pbXBvcnQgeyByZWFkVmFsdWVBc0RhdGUgfSBmcm9tICcuLi8uLi91dGlscy9yZWFkVmFsdWVBc0RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiB7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGlzRGF0ZT86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBUaW1lVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGlucHV0UHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBoZWxwZXJUZXh0PzogVGV4dEZpZWxkUHJvcHNbJ2hlbHBlclRleHQnXTtcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICBzbG90UHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJTbG90UHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3RleHRGaWVsZCdcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgdGltZVBpY2tlclByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyUHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3ZhbHVlJyB8ICdzbG90UHJvcHMnXG4gID47XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGltZVBpY2tlckVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkLFxuICAgIGlucHV0UHJvcHMsXG4gICAgY29udHJvbCxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGlucHV0UmVmLCBvbkNsb3NlLCAuLi5yZXN0VGltZVBpY2tlclByb3BzIH0gPVxuICAgIHRpbWVQaWNrZXJQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlIHwgbnVsbD4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogbmV3VmFsdWUgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogKGV2ZW50T3JWYWx1ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gTVVJIERhdGVQaWNrZXIgcGFzc2VzICh2YWx1ZSwgY29udGV4dCksIHNvIHdlIGNoZWNrIHRoZSBzZWNvbmQgcGFyYW1cbiAgICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBldmVudE9yVmFsdWU7XG5cbiAgICAgICAgaWYgKGFjdHVhbFZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG5cbiAgICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRpbWVQaWNrZXJcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUaW1lUGlja2VyUHJvcHN9XG4gICAgICB7Li4uZmllbGR9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICB7Li4udGltZVBpY2tlclByb3BzfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgb25DbG9zZT17KC4uLmFyZ3MpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICBpZiAodHlwZW9mIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ2NhbmNlbCcsICdhY2NlcHQnXSxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgb25CbHVyOiAoXG4gICAgICAgICAgICBldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogISF0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdUaW1lUGlja2VyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24gfSBmcm9tICdAbXVpL21hdGVyaWFsL0F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvdXRpbHMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgRnJhZ21lbnQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG4gIHR5cGUgRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVE9wdGlvblxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBpbml0aWFsVmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFRPcHRpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBpbnB1dFZhbHVlMjogc3RyaW5nID0gdXNlTWVtbygoKSA9PiBpbnB1dFZhbHVlLCBbaW5wdXRWYWx1ZV0pO1xuICBjb25zdCBzZXRJbnB1dFZhbHVlMiA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogc3RyaW5nKSA9PiBzZXRJbnB1dFZhbHVlKG5ld1ZhbHVlKSxcbiAgICBbXVxuICApO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcblxuICBjb25zdCBpbml0aWFsVmFsdWVMb2FkZWQgPSB1c2VSZWY8Ym9vbGVhbj4oXG4gICAgIWluaXRpYWxWYWx1ZSA/IHRydWUgOiAhKGluaXRpYWxWYWx1ZSAhPSBudWxsKVxuICApO1xuXG4gIGNvbnN0IGZpZWxkVmFsdWUgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbD4oZmllbGQudmFsdWUpO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKFxuICAgICAgICAoXG4gICAgICAgICAgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBmaWxsT3B0aW9ucyA9IHVzZUNhbGxiYWNrKFxuICAgIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBsZXQgbmV3T3B0aW9uczogcmVhZG9ubHkgVE9wdGlvbltdID0gW107XG5cbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBuZXdPcHRpb25zID0gW3NlbGVjdGVkT3B0aW9uXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgbmV3T3B0aW9ucyA9IFsuLi5uZXdPcHRpb25zLCAuLi5yZXN1bHRzXTtcbiAgICAgIH1cblxuICAgICAgc2V0T3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgW3NlbGVjdGVkT3B0aW9uXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZSxcbiAgICB9O1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGZldGNoRGF0YShwYXlsb2FkLCAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBpZiAoISFyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHM/LmZpbHRlcihjID0+IGNbdmFsdWVGaWVsZF0gPT0gaW5pdGlhbFZhbHVlKSk7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb24ocmVzdWx0c1swXSk7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0c1swXVt2YWx1ZUZpZWxkXSk7XG4gICAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gcmVzdWx0c1swXVt2YWx1ZUZpZWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgZmV0Y2hEYXRhLCBmaWVsZCwgZmlsbE9wdGlvbnMsIHZhbHVlRmllbGRdKTtcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgaWYgKGlucHV0VmFsdWUyID09PSAnJyB8fCBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb24gPyBbc2VsZWN0ZWRPcHRpb25dIDogW10pO1xuICAgICAgLy8gc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG5cblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogaW5wdXRWYWx1ZTIsXG4gICAgICBpbml0aWFsVmFsdWU6IG51bGwsXG4gICAgfTtcblxuICAgIGZldGNoRGF0YShwYXlsb2FkLCAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBmaWxsT3B0aW9ucyhyZXN1bHRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXG4gICAgaW5pdGlhbFZhbHVlLFxuICAgIGlucHV0VmFsdWUyLFxuICAgIGZldGNoRGF0YSxcbiAgICBmaWxsT3B0aW9ucyxcbiAgICBzZWxlY3RlZE9wdGlvbixcbiAgXSk7XG5cbiAgY29uc3Qgc2VsZWN0UmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBfOiBSZWFjdC5TeW50aGV0aWNFdmVudCxcbiAgICBuZXdTZWxlY3RlZE9wdGlvbjogVE9wdGlvbiB8IG51bGwsXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBpZiAobmV3U2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obmV3U2VsZWN0ZWRPcHRpb24pO1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdTZWxlY3RlZE9wdGlvblt2YWx1ZUZpZWxkXSk7XG4gICAgICAgIGZpZWxkVmFsdWUuY3VycmVudCA9IG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlRmllbGRdO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRPcHRpb25zKFtdKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZmllbGQudmFsdWUpIHtcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtmaWVsZC52YWx1ZV0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZF0pIDogJyc7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgcmVmPXtzZWxlY3RSZWZ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvblZhbHVlfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGF1dG9Db21wbGV0ZVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaW5jbHVkZUlucHV0SW5MaXN0XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9ufVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25JbnB1dENoYW5nZT17KF8sIG5ld0lucHV0VmFsdWUpID0+IHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZTIobmV3SW5wdXRWYWx1ZSk7XG4gICAgICB9fVxuICAgICAgbm9PcHRpb25zVGV4dD1cIlR5cGUgU29tZXRoaW5nLi4uXCJcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhyZW5kZXJQcm9wcywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcmVuZGVyUHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICB7b3B0aW9uW2xhYmVsRmllbGRdfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY1NlbGVjdEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPlxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkFzeW5jU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9ICdBc3luY1NlbGVjdEVsZW1lbnQnO1xuXG5leHBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZCc7XG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZCc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJyA+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gb25DaGFuZ2UgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdHJhbnNmb3JtYXRpb25cbiAgICovXG4gIG9uQ2hhbmdlPzogKFxuICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogRW5hYmxlIGRldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb24gaXNzdWVzXG4gICAqIEBkZWZhdWx0VmFsdWUgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICovXG4gIGVuYWJsZVdhcm5pbmdzPzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVtYmVyRmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSA9ICdudW1iZXInLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25JbnB1dCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25JbnB1dD17KGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uV2hlZWw9e2UgPT4ge1xuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH19XG4gICAgICBvbktleURvd249e2UgPT4ge1xuICAgICAgICBpZiAoWydlJywgJ0UnLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHRcbiAgICAgIH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1iZXJGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEJveFByb3BzLCBGb3JtSGVscGVyVGV4dFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJveCwgR3JpZCwgaW5wdXRCYXNlQ2xhc3NlcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgTXVpT3RwSW5wdXQsXG4gIHR5cGUgTXVpT3RwSW5wdXRQcm9wcyxcbn0gZnJvbSAnbXVpLW9uZS10aW1lLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgSGVscGVyVGV4dCB9IGZyb20gJy4vSGVscGVyVGV4dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1RQSW5wdXRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG5cbiAgc2xvdFByb3BzPzoge1xuICAgIHdyYXBwZXI/OiBCb3hQcm9wcztcbiAgICBoZWxwZXJUZXh0PzogRm9ybUhlbHBlclRleHRQcm9wcztcbiAgICB0ZXh0ZmllbGQ/OiBNdWlPdHBJbnB1dFByb3BzWydUZXh0RmllbGRzUHJvcHMnXTtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBPVFBJbnB1dEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICAvLyBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBzbG90UHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBtYXhTaXplID0gNTYsXG4gICAgcGxhY2Vob2xkZXIgPSAnLScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gY29uc3Qge1xuICAvLyAgIGZpZWxkLFxuICAvLyAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgLy8gfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAvLyAgIG5hbWUsXG4gIC8vICAgY29udHJvbCxcbiAgLy8gfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udHJvbGxlclxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICByZW5kZXI9eyh7IGZpZWxkLCBmaWVsZFN0YXRlOiB7IGVycm9yIH0gfSkgPT4gKFxuICAgICAgICA8Qm94XG4gICAgICAgICAgey4uLnNsb3RQcm9wcz8ud3JhcHBlcn1cbiAgICAgICAgICBzeD17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgW2AmIC4ke2lucHV0QmFzZUNsYXNzZXMuaW5wdXR9YF06IHtcbiAgICAgICAgICAgICAgICBwOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvOiAnMS8xJyxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4U2l6ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzbG90UHJvcHM/LndyYXBwZXI/LnN4KVxuICAgICAgICAgICAgICA/IChzbG90UHJvcHM/LndyYXBwZXI/LnN4ID8/IFtdKVxuICAgICAgICAgICAgICA6IFtzbG90UHJvcHM/LndyYXBwZXI/LnN4XSksXG4gICAgICAgICAgXX1cbiAgICAgICAgPlxuICAgICAgICAgIDxNdWlPdHBJbnB1dFxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICBnYXA9ezEuNX1cbiAgICAgICAgICAgIGxlbmd0aD17NH1cbiAgICAgICAgICAgIFRleHRGaWVsZHNQcm9wcz17e1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8udGV4dGZpZWxkLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8SGVscGVyVGV4dFxuICAgICAgICAgICAgey4uLnNsb3RQcm9wcz8uaGVscGVyVGV4dH1cbiAgICAgICAgICAgIGVycm9yTWVzc2FnZT17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgICAgICBoZWxwZXJUZXh0PXtoZWxwZXJUZXh0fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IE9UUElucHV0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogT1RQSW5wdXRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBGb3JtSGVscGVyVGV4dFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5pbXBvcnQgRm9ybUhlbHBlclRleHQgZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgSGVscGVyVGV4dFByb3BzID0gRm9ybUhlbHBlclRleHRQcm9wcyAmIHtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBkaXNhYmxlR3V0dGVycz86IGJvb2xlYW47XG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSGVscGVyVGV4dCh7XG4gIHN4LFxuICBoZWxwZXJUZXh0LFxuICBlcnJvck1lc3NhZ2UsXG4gIGRpc2FibGVHdXR0ZXJzLFxuICAuLi5vdGhlclxufTogSGVscGVyVGV4dFByb3BzKSB7XG4gIGlmIChlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybUhlbHBlclRleHRcbiAgICAgICAgZXJyb3I9eyEhZXJyb3JNZXNzYWdlfVxuICAgICAgICBzeD17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG14OiBkaXNhYmxlR3V0dGVycyA/IDAgOiAxLjc1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgXX1cbiAgICAgICAgey4uLm90aGVyfVxuICAgICAgPlxuICAgICAgICB7ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9XG4gICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gXCIuLi9Bc3luY011bHRpU2VsZWN0L0FzeW5jTXVsdGlTZWxlY3RcIjtcbmltcG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9IGZyb20gXCIuLi9Bc3luY1NlbGVjdFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSBcIi4uL0NoZWNrYm94RWxlbWVudFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cCB9IGZyb20gXCIuLi9DaGVja2JveEdyb3VwXCI7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gXCIuLi9EYXRlUGlja2VyRWxlbWVudFwiO1xuaW1wb3J0IHsgTnVtYmVyRmllbGRFbGVtZW50IH0gZnJvbSBcIi4uL051bWJlckZpZWxkRWxlbWVudFwiO1xuaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSBcIi4uL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnRcIjtcbmltcG9ydCB7IFBhc3N3b3JkRWxlbWVudCB9IGZyb20gXCIuLi9QYXNzd29yZEVsZW1lbnRcIjtcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tIFwiLi4vUmFkaW9CdXR0b25Hcm91cFwiO1xuaW1wb3J0IHsgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnRcIjtcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0RWxlbWVudFwiO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdE11bHRpRWxlbWVudFwiO1xuaW1wb3J0IHsgVGV4dEZpZWxkRWxlbWVudCB9IGZyb20gXCIuLi9UZXh0RmllbGRFbGVtZW50XCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyRWxlbWVudCB9IGZyb20gXCIuLi9UaW1lUGlja2VyRWxlbWVudFwiO1xuXG5cbmNvbnN0IEZpZWxkID0ge1xuICBUZXh0OiBUZXh0RmllbGRFbGVtZW50LFxuICBOdW1iZXI6IE51bWJlckZpZWxkRWxlbWVudCxcbiAgQ2hlY2tib3g6IENoZWNrYm94RWxlbWVudCxcbiAgRGF0ZTogRGF0ZVBpY2tlckVsZW1lbnQsXG4gIFJhZGlvR3JvdXA6IFJhZGlvQnV0dG9uR3JvdXAsXG4gIFBhc3N3b3JkOiBQYXNzd29yZEVsZW1lbnQsXG4gIFRpbWU6IFRpbWVQaWNrZXJFbGVtZW50LFxuICBTZWxlY3Q6IFNlbGVjdEVsZW1lbnQsXG4gIFNlbGVjdE11bHRpOiBTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIFNlbGVjdENhc2NhZGU6IFNlbGVjdENhc2NhZGVFbGVtZW50LFxuICBBc3luY1NlbGVjdDogQXN5bmNTZWxlY3RFbGVtZW50LFxuICBBc3luY011bHRpU2VsZWN0OiBBc3luY1NlbGVjdE11bHRpRWxlbWVudCxcbiAgQ2hlY2tib3hHcm91cCxcbiAgT1RQSW5wdXQ6IE9UUElucHV0RWxlbWVudFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQTRGTyxTQUFTLGNBQWMsT0FBcUM7QUFDakUsU0FDRSxPQUFPLFVBQVUsWUFDakIsVUFBVSxRQUNWLFdBQVcsU0FDWCxXQUFXLFNBQ1gsT0FBUSxNQUFxQixVQUFVLGFBQ3RDLE9BQVEsTUFBcUIsVUFBVSxZQUN0QyxPQUFRLE1BQXFCLFVBQVUsWUFDdkMsT0FBUSxNQUFxQixVQUFVO0FBRTdDO0FBWU8sU0FBUyxpQkFDZCxTQUNBLGFBQWEsU0FDYixhQUFhLFNBQ0M7QUFDZCxTQUFPLFFBQVEsSUFBSSxhQUFXO0FBQUEsSUFDNUIsT0FBTyxPQUFPLE9BQU8sVUFBVSxLQUFLLEVBQUU7QUFBQSxJQUN0QyxPQUFPLE9BQU8sVUFBVTtBQUFBLElBQ3hCLFVBQVUsUUFBUSxPQUFPLFFBQVE7QUFBQSxFQUNuQyxFQUFFO0FBQ0o7OztBQzdIQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sV0FBVztBQUNsQixPQUFPLEtBQUssZ0JBQWdCO0FBQzVCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxF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RUFBSyxNQUFNLElBQUssR0FBRyxXQUNsQiwwQkFBQUosTUFBQ0UsYUFBQSxFQUFXLEdBQUcsT0FBTyxHQUN4QjtBQUVKOzs7QUVySEEsSUFBTSxRQUFRO0FBQUEsRUFDWixNQUFNRztBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLFVBQVVDO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixZQUFZQztBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsTUFBTUM7QUFBQSxFQUNOLFFBQVFDO0FBQUEsRUFDUixhQUFhQztBQUFBLEVBQ2IsZUFBZUM7QUFBQSxFQUNmLGFBQWFDO0FBQUEsRUFDYixrQkFBa0JDO0FBQUEsRUFDbEIsZUFBQUM7QUFBQSxFQUNBLFVBQVVDO0FBQ1o7IiwKICAibmFtZXMiOiBbImlucHV0VmFsdWUiLCAiXyIsICJwcm9wcyIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQ2hlY2tib3hHcm91cCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlUmVmIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJDaXJjdWxhclByb2dyZXNzIiwgIkZyYWdtZW50IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiXyIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJ1c2VGb3JrUmVmIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIkdyaWQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiZGVib3VuY2UiLCAiUmVhY3QiLCAiRnJhZ21lbnQiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlUmVmIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIl8iLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJGb3JtSGVscGVyVGV4dCIsICJqc3giLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIk9UUElucHV0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJDaGVja2JveEdyb3VwIiwgIk9UUElucHV0RWxlbWVudCJdCn0K
|