@gnwebsoft/ui 3.0.8 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3OPVOWQK.js +140 -0
- package/dist/chunk-AEOF2TUF.cjs +2273 -0
- package/dist/chunk-ALHC7RLK.js +575 -0
- package/dist/chunk-BRRLB22L.js +72 -0
- package/dist/chunk-CHZU4PZB.js +2273 -0
- package/dist/chunk-EBRUE2WR.cjs +1 -1
- package/dist/chunk-HEHPKM4B.cjs +140 -0
- package/dist/chunk-K2EJ4YKO.cjs +72 -0
- package/dist/chunk-MVPLBJRK.cjs +1 -1
- package/dist/chunk-XY4U6A77.cjs +575 -0
- package/dist/components/index.cjs +1 -1
- package/dist/{enhanced-z-I7EHVS.d.cts → enhanced-CDTkKUlj.d.ts} +5 -5
- package/dist/{enhanced-z-I7EHVS.d.ts → enhanced-ZQoS03Cd.d.cts} +5 -5
- package/dist/events-BcHVCLBz.d.cts +77 -0
- package/dist/events-BcHVCLBz.d.ts +77 -0
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.d.cts +3 -2
- package/dist/hooks/index.d.ts +3 -2
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +67 -6
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +65 -4
- package/dist/types/index.cjs +31 -2
- package/dist/types/index.d.cts +588 -1
- package/dist/types/index.d.ts +588 -1
- package/dist/types/index.js +30 -1
- package/dist/utils/index.cjs +37 -3
- package/dist/utils/index.d.cts +329 -13
- package/dist/utils/index.d.ts +329 -13
- package/dist/utils/index.js +35 -1
- package/dist/wrappers/index.cjs +4 -4
- package/dist/wrappers/index.d.cts +11 -9
- package/dist/wrappers/index.d.ts +11 -9
- package/dist/wrappers/index.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-4H3AFH7A.js +0 -505
- package/dist/chunk-DE62KYFK.js +0 -122
- package/dist/chunk-DEPJRTVT.js +0 -1
- package/dist/chunk-FD57PCAC.cjs +0 -1
- package/dist/chunk-JCXHX2PZ.js +0 -2265
- package/dist/chunk-MW2UCDTI.cjs +0 -2265
- package/dist/chunk-R2YK4LTT.cjs +0 -122
- package/dist/chunk-ZC7FGYL2.cjs +0 -505
|
@@ -0,0 +1,2273 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkHEHPKM4Bcjs = require('./chunk-HEHPKM4B.cjs');
|
|
5
|
+
|
|
6
|
+
// src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _material = require('@mui/material');
|
|
14
|
+
var _lodash = require('lodash');
|
|
15
|
+
var _react = require('react'); var React7 = _interopRequireWildcard(_react);
|
|
16
|
+
var _reacthookform = require('react-hook-form');
|
|
17
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
18
|
+
var initialState = {
|
|
19
|
+
options: [],
|
|
20
|
+
selectedOptions: [],
|
|
21
|
+
inputValue: "",
|
|
22
|
+
loading: false,
|
|
23
|
+
initialLoaded: false
|
|
24
|
+
};
|
|
25
|
+
function componentReducer(state, action) {
|
|
26
|
+
switch (action.type) {
|
|
27
|
+
case "SET_OPTIONS":
|
|
28
|
+
return { ...state, options: action.payload, loading: false };
|
|
29
|
+
case "SET_SELECTED_OPTIONS":
|
|
30
|
+
return { ...state, selectedOptions: action.payload };
|
|
31
|
+
case "SET_INPUT_VALUE":
|
|
32
|
+
return { ...state, inputValue: action.payload };
|
|
33
|
+
case "SET_LOADING":
|
|
34
|
+
return { ...state, loading: action.payload };
|
|
35
|
+
case "SET_INITIAL_LOADED":
|
|
36
|
+
return { ...state, initialLoaded: action.payload };
|
|
37
|
+
case "RESET_OPTIONS":
|
|
38
|
+
return { ...state, options: state.selectedOptions };
|
|
39
|
+
default:
|
|
40
|
+
return state;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
var AsyncMultiSelect2Component = ({
|
|
44
|
+
name,
|
|
45
|
+
control,
|
|
46
|
+
placeholder,
|
|
47
|
+
initialValues,
|
|
48
|
+
label,
|
|
49
|
+
queryFn,
|
|
50
|
+
variant = "outlined",
|
|
51
|
+
sx,
|
|
52
|
+
disabled = false,
|
|
53
|
+
debounceMs = 400,
|
|
54
|
+
loadingText = "Loading...",
|
|
55
|
+
noOptionsText = "No options",
|
|
56
|
+
renderInput,
|
|
57
|
+
...rest
|
|
58
|
+
}) => {
|
|
59
|
+
const [state, dispatch] = _react.useReducer.call(void 0, componentReducer, initialState);
|
|
60
|
+
const theme = _material.useTheme.call(void 0, );
|
|
61
|
+
const {
|
|
62
|
+
field,
|
|
63
|
+
fieldState: { error }
|
|
64
|
+
} = _reacthookform.useController.call(void 0, {
|
|
65
|
+
name,
|
|
66
|
+
control
|
|
67
|
+
});
|
|
68
|
+
const debouncedFetch = _react.useMemo.call(void 0,
|
|
69
|
+
() => _lodash.debounce.call(void 0, async (payload) => {
|
|
70
|
+
try {
|
|
71
|
+
const results = await queryFn(payload);
|
|
72
|
+
const mergedOptions = [
|
|
73
|
+
...state.selectedOptions,
|
|
74
|
+
...results.filter(
|
|
75
|
+
(option) => !state.selectedOptions.some((selected) => selected.value === option.value)
|
|
76
|
+
)
|
|
77
|
+
];
|
|
78
|
+
dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
|
|
79
|
+
} catch (_error) {
|
|
80
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
81
|
+
}
|
|
82
|
+
}, debounceMs),
|
|
83
|
+
[queryFn, state.selectedOptions, debounceMs]
|
|
84
|
+
);
|
|
85
|
+
_react.useEffect.call(void 0, () => {
|
|
86
|
+
if (!_optionalChain([initialValues, 'optionalAccess', _2 => _2.length]) || state.initialLoaded) return;
|
|
87
|
+
dispatch({ type: "SET_LOADING", payload: true });
|
|
88
|
+
const payload = {
|
|
89
|
+
query: null,
|
|
90
|
+
initialValues
|
|
91
|
+
};
|
|
92
|
+
queryFn(payload).then((results) => {
|
|
93
|
+
if (results) {
|
|
94
|
+
dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
|
|
95
|
+
dispatch({ type: "SET_OPTIONS", payload: results });
|
|
96
|
+
dispatch({ type: "SET_INITIAL_LOADED", payload: true });
|
|
97
|
+
field.onChange(results.map((option) => option.value));
|
|
98
|
+
}
|
|
99
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
100
|
+
}).catch((_error) => {
|
|
101
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
102
|
+
});
|
|
103
|
+
}, [initialValues, state.initialLoaded, queryFn, field]);
|
|
104
|
+
_react.useEffect.call(void 0, () => {
|
|
105
|
+
if (!state.initialLoaded) return;
|
|
106
|
+
if (state.inputValue === "") {
|
|
107
|
+
dispatch({ type: "RESET_OPTIONS" });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
dispatch({ type: "SET_LOADING", payload: true });
|
|
111
|
+
const payload = {
|
|
112
|
+
query: state.inputValue,
|
|
113
|
+
initialValues: null
|
|
114
|
+
};
|
|
115
|
+
debouncedFetch(payload);
|
|
116
|
+
}, [state.inputValue, state.initialLoaded, debouncedFetch]);
|
|
117
|
+
const handleChange = _react.useCallback.call(void 0,
|
|
118
|
+
(event, newValue) => {
|
|
119
|
+
dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
|
|
120
|
+
field.onChange(newValue.map((option) => option.value));
|
|
121
|
+
},
|
|
122
|
+
[field]
|
|
123
|
+
);
|
|
124
|
+
const handleInputChange = _react.useCallback.call(void 0,
|
|
125
|
+
(event, newInputValue) => {
|
|
126
|
+
dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
|
|
127
|
+
},
|
|
128
|
+
[]
|
|
129
|
+
);
|
|
130
|
+
const isOptionEqualToValue = _react.useCallback.call(void 0,
|
|
131
|
+
(option, value) => option.value === value.value,
|
|
132
|
+
[]
|
|
133
|
+
);
|
|
134
|
+
const getOptionLabel = _react.useCallback.call(void 0, (option) => option.label, []);
|
|
135
|
+
const defaultRenderInput = _react.useCallback.call(void 0,
|
|
136
|
+
(params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
137
|
+
_material.TextField,
|
|
138
|
+
{
|
|
139
|
+
...params,
|
|
140
|
+
label,
|
|
141
|
+
placeholder,
|
|
142
|
+
variant,
|
|
143
|
+
error: !!error,
|
|
144
|
+
helperText: _optionalChain([error, 'optionalAccess', _3 => _3.message]),
|
|
145
|
+
slotProps: {
|
|
146
|
+
input: {
|
|
147
|
+
...params.InputProps,
|
|
148
|
+
endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
149
|
+
state.loading && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }),
|
|
150
|
+
params.InputProps.endAdornment
|
|
151
|
+
] })
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
sx: {
|
|
155
|
+
"& .MuiInputBase-input": {
|
|
156
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
157
|
+
},
|
|
158
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
159
|
+
...sx
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
[label, placeholder, variant, error, state.loading, disabled, theme.palette.action.disabledBackground, sx]
|
|
164
|
+
);
|
|
165
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
166
|
+
_material.Autocomplete,
|
|
167
|
+
{
|
|
168
|
+
multiple: true,
|
|
169
|
+
options: state.options,
|
|
170
|
+
value: state.selectedOptions,
|
|
171
|
+
loading: state.loading,
|
|
172
|
+
disabled,
|
|
173
|
+
isOptionEqualToValue,
|
|
174
|
+
getOptionLabel,
|
|
175
|
+
filterSelectedOptions: true,
|
|
176
|
+
onChange: handleChange,
|
|
177
|
+
onInputChange: handleInputChange,
|
|
178
|
+
loadingText,
|
|
179
|
+
noOptionsText,
|
|
180
|
+
renderInput: renderInput || defaultRenderInput,
|
|
181
|
+
...rest
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
var AsyncMultiSelect2 = ({
|
|
186
|
+
gridProps,
|
|
187
|
+
...props
|
|
188
|
+
}) => {
|
|
189
|
+
if (gridProps) {
|
|
190
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AsyncMultiSelect2Component, { ...props }) });
|
|
191
|
+
}
|
|
192
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AsyncMultiSelect2Component, { ...props });
|
|
193
|
+
};
|
|
194
|
+
AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
|
|
195
|
+
|
|
196
|
+
// src/wrappers/CheckboxElement/CheckboxElement.tsx
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
var Component = function CheckboxElement(props) {
|
|
211
|
+
const {
|
|
212
|
+
name,
|
|
213
|
+
control,
|
|
214
|
+
label,
|
|
215
|
+
labelProps,
|
|
216
|
+
helperText,
|
|
217
|
+
parseError,
|
|
218
|
+
transform,
|
|
219
|
+
disabled,
|
|
220
|
+
sx,
|
|
221
|
+
onChange: customOnChange,
|
|
222
|
+
...rest
|
|
223
|
+
} = props;
|
|
224
|
+
const theme = _material.useTheme.call(void 0, );
|
|
225
|
+
const {
|
|
226
|
+
field,
|
|
227
|
+
fieldState: { error }
|
|
228
|
+
} = _reacthookform.useController.call(void 0, {
|
|
229
|
+
name,
|
|
230
|
+
control,
|
|
231
|
+
disabled
|
|
232
|
+
});
|
|
233
|
+
const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
|
|
234
|
+
value: field.value,
|
|
235
|
+
onChange: field.onChange,
|
|
236
|
+
transform: {
|
|
237
|
+
input: typeof _optionalChain([transform, 'optionalAccess', _4 => _4.input]) === "function" ? transform.input : (value2) => !!value2,
|
|
238
|
+
output: typeof _optionalChain([transform, 'optionalAccess', _5 => _5.output]) === "function" ? (eventOrValue, _value) => {
|
|
239
|
+
const event = eventOrValue;
|
|
240
|
+
const checked = _value;
|
|
241
|
+
return transform.output(event, checked);
|
|
242
|
+
} : (eventOrValue, _value) => {
|
|
243
|
+
const checked = _value;
|
|
244
|
+
return checked;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
const handleChange = (event, checked) => {
|
|
249
|
+
onChange(event, checked);
|
|
250
|
+
if (typeof customOnChange === "function") {
|
|
251
|
+
customOnChange(event, checked);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
|
|
255
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, disabled, children: [
|
|
256
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormGroup, { row: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
257
|
+
_material.FormControlLabel,
|
|
258
|
+
{
|
|
259
|
+
label: label || "",
|
|
260
|
+
...labelProps,
|
|
261
|
+
disabled,
|
|
262
|
+
control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
263
|
+
_material.Checkbox,
|
|
264
|
+
{
|
|
265
|
+
...rest,
|
|
266
|
+
color: rest.color || "primary",
|
|
267
|
+
sx: [
|
|
268
|
+
...Array.isArray(sx) ? sx : [sx],
|
|
269
|
+
{
|
|
270
|
+
color: error ? theme.palette.error.main : disabled ? theme.palette.action.disabled : void 0,
|
|
271
|
+
"&.Mui-disabled": {
|
|
272
|
+
color: theme.palette.action.disabled
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
checked: value,
|
|
277
|
+
disabled,
|
|
278
|
+
onChange: handleChange,
|
|
279
|
+
ref: field.ref
|
|
280
|
+
}
|
|
281
|
+
)
|
|
282
|
+
}
|
|
283
|
+
) }),
|
|
284
|
+
(displayError || helperText) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { error: !!error, children: displayError || helperText })
|
|
285
|
+
] });
|
|
286
|
+
};
|
|
287
|
+
var CheckboxElement2 = ({
|
|
288
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
289
|
+
...props
|
|
290
|
+
}) => {
|
|
291
|
+
if (gridProps) {
|
|
292
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
293
|
+
_material.Grid,
|
|
294
|
+
{
|
|
295
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
296
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { ...props })
|
|
297
|
+
}
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { ...props });
|
|
301
|
+
};
|
|
302
|
+
CheckboxElement2.displayName = "CheckboxElement";
|
|
303
|
+
|
|
304
|
+
// src/wrappers/CheckboxGroup/CheckboxGroup.tsx
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
var Component2 = function CheckboxGroup(props) {
|
|
319
|
+
const { name, control, label, labelProps, inputRef, options, ...rest } = props;
|
|
320
|
+
const {
|
|
321
|
+
field,
|
|
322
|
+
fieldState: { error }
|
|
323
|
+
} = _reacthookform.useController.call(void 0, {
|
|
324
|
+
name,
|
|
325
|
+
control,
|
|
326
|
+
disabled: rest.disabled
|
|
327
|
+
});
|
|
328
|
+
const [selectedValues, setSelectedValues] = _react.useState.call(void 0,
|
|
329
|
+
options.filter((c) => _optionalChain([field, 'access', _6 => _6.value, 'optionalAccess', _7 => _7.includes, 'call', _8 => _8(c.Value)])).map((c) => c.Value) || []
|
|
330
|
+
);
|
|
331
|
+
_react.useEffect.call(void 0, () => {
|
|
332
|
+
field.onChange(selectedValues ? [...selectedValues] : []);
|
|
333
|
+
}, [selectedValues]);
|
|
334
|
+
const handleChange = (event) => {
|
|
335
|
+
const value = parseInt(event.target.value, 10);
|
|
336
|
+
if (event.target.checked) {
|
|
337
|
+
setSelectedValues([...selectedValues, value]);
|
|
338
|
+
} else {
|
|
339
|
+
setSelectedValues(selectedValues.filter((item) => item !== value));
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, children: [
|
|
343
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormGroup, { row: true, children: options.map((option) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
344
|
+
_material.FormControlLabel,
|
|
345
|
+
{
|
|
346
|
+
label: option.Label,
|
|
347
|
+
...labelProps,
|
|
348
|
+
control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
349
|
+
_material.Checkbox,
|
|
350
|
+
{
|
|
351
|
+
...rest,
|
|
352
|
+
color: rest.color || "primary",
|
|
353
|
+
sx: [
|
|
354
|
+
...Array.isArray(rest.sx) ? rest.sx : [rest.sx],
|
|
355
|
+
{
|
|
356
|
+
color: error ? "error.main" : void 0
|
|
357
|
+
}
|
|
358
|
+
],
|
|
359
|
+
value: option.Value,
|
|
360
|
+
checked: selectedValues.includes(option.Value),
|
|
361
|
+
onChange: handleChange
|
|
362
|
+
}
|
|
363
|
+
)
|
|
364
|
+
},
|
|
365
|
+
`${option.Value}`
|
|
366
|
+
)) }),
|
|
367
|
+
error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { error: !!error, children: error.message })
|
|
368
|
+
] });
|
|
369
|
+
};
|
|
370
|
+
var CheckboxGroup2 = ({
|
|
371
|
+
gridProps,
|
|
372
|
+
...props
|
|
373
|
+
}) => {
|
|
374
|
+
if (gridProps) {
|
|
375
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component2, { ...props }) });
|
|
376
|
+
}
|
|
377
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component2, { ...props });
|
|
378
|
+
};
|
|
379
|
+
CheckboxGroup2.displayName = "CheckboxGroup";
|
|
380
|
+
|
|
381
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
386
|
+
|
|
387
|
+
var _xdatepickers = require('@mui/x-date-pickers');
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
|
|
392
|
+
var _internals = require('@mui/x-date-pickers/internals');
|
|
393
|
+
|
|
394
|
+
function readDatePickerValueAsDate(adapter, value) {
|
|
395
|
+
if (value === null || value === void 0) {
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
if (typeof value === "string") {
|
|
399
|
+
if (value === "") {
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
const parsedDate = adapter.utils.date(value);
|
|
403
|
+
return parsedDate;
|
|
404
|
+
}
|
|
405
|
+
return value;
|
|
406
|
+
}
|
|
407
|
+
function useDatePickerValue(options) {
|
|
408
|
+
const { field, transform } = options;
|
|
409
|
+
const adapter = _internals.useLocalizationContext.call(void 0, );
|
|
410
|
+
const value = _react.useMemo.call(void 0, () => {
|
|
411
|
+
if (typeof _optionalChain([transform, 'optionalAccess', _9 => _9.input]) === "function") {
|
|
412
|
+
return transform.input(field.value);
|
|
413
|
+
}
|
|
414
|
+
return readDatePickerValueAsDate(adapter, field.value);
|
|
415
|
+
}, [field.value, _optionalChain([transform, 'optionalAccess', _10 => _10.input]), adapter]);
|
|
416
|
+
const onChange = _react.useCallback.call(void 0,
|
|
417
|
+
(newValue, context) => {
|
|
418
|
+
if (typeof _optionalChain([transform, 'optionalAccess', _11 => _11.output]) === "function") {
|
|
419
|
+
const transformedValue = transform.output(newValue, context);
|
|
420
|
+
field.onChange(transformedValue);
|
|
421
|
+
} else {
|
|
422
|
+
field.onChange(newValue);
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
[field.onChange, _optionalChain([transform, 'optionalAccess', _12 => _12.output])]
|
|
426
|
+
);
|
|
427
|
+
return {
|
|
428
|
+
value,
|
|
429
|
+
onChange
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
|
|
434
|
+
|
|
435
|
+
var DEFAULT_ERROR_MESSAGES = {
|
|
436
|
+
invalidDate: "Please enter a valid date",
|
|
437
|
+
minDate: "Date must be after the minimum allowed date",
|
|
438
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
439
|
+
disabledDate: "This date is not allowed",
|
|
440
|
+
required: "This field is required"
|
|
441
|
+
};
|
|
442
|
+
function useDatePickerValidation(options) {
|
|
443
|
+
const { fieldState, validation, parseError, value } = options;
|
|
444
|
+
const validationResult = _react.useMemo.call(void 0, () => {
|
|
445
|
+
const { error: fieldError, invalid } = fieldState;
|
|
446
|
+
let currentError = fieldError;
|
|
447
|
+
if (!fieldError && value && validation) {
|
|
448
|
+
const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
|
|
449
|
+
if (minDate && value < minDate) {
|
|
450
|
+
currentError = {
|
|
451
|
+
type: "minDate",
|
|
452
|
+
message: _optionalChain([errorMessages, 'optionalAccess', _13 => _13.minDate]) || DEFAULT_ERROR_MESSAGES.minDate
|
|
453
|
+
};
|
|
454
|
+
} else if (maxDate && value > maxDate) {
|
|
455
|
+
currentError = {
|
|
456
|
+
type: "maxDate",
|
|
457
|
+
message: _optionalChain([errorMessages, 'optionalAccess', _14 => _14.maxDate]) || DEFAULT_ERROR_MESSAGES.maxDate
|
|
458
|
+
};
|
|
459
|
+
} else if (shouldDisableDate && shouldDisableDate(value)) {
|
|
460
|
+
currentError = {
|
|
461
|
+
type: "disabledDate",
|
|
462
|
+
message: _optionalChain([errorMessages, 'optionalAccess', _15 => _15.disabledDate]) || DEFAULT_ERROR_MESSAGES.disabledDate
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const hasError = Boolean(currentError);
|
|
467
|
+
return {
|
|
468
|
+
hasError,
|
|
469
|
+
error: currentError,
|
|
470
|
+
invalid: invalid || hasError
|
|
471
|
+
};
|
|
472
|
+
}, [fieldState, validation, value]);
|
|
473
|
+
const errorMessage = _react.useMemo.call(void 0, () => {
|
|
474
|
+
if (!validationResult.error) {
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
if (parseError) {
|
|
478
|
+
return parseError(validationResult.error);
|
|
479
|
+
}
|
|
480
|
+
if (typeof validationResult.error === "string") {
|
|
481
|
+
return validationResult.error;
|
|
482
|
+
}
|
|
483
|
+
if ("message" in validationResult.error && validationResult.error.message) {
|
|
484
|
+
return validationResult.error.message;
|
|
485
|
+
}
|
|
486
|
+
if ("type" in validationResult.error) {
|
|
487
|
+
const errorType = validationResult.error.type;
|
|
488
|
+
switch (errorType) {
|
|
489
|
+
case "required":
|
|
490
|
+
return DEFAULT_ERROR_MESSAGES.required;
|
|
491
|
+
case "minDate":
|
|
492
|
+
return DEFAULT_ERROR_MESSAGES.minDate;
|
|
493
|
+
case "maxDate":
|
|
494
|
+
return DEFAULT_ERROR_MESSAGES.maxDate;
|
|
495
|
+
case "disabledDate":
|
|
496
|
+
return DEFAULT_ERROR_MESSAGES.disabledDate;
|
|
497
|
+
case "invalidDate":
|
|
498
|
+
default:
|
|
499
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
503
|
+
}, [validationResult.error, parseError]);
|
|
504
|
+
return {
|
|
505
|
+
...validationResult,
|
|
506
|
+
errorMessage
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
function useDatePickerStyles(options = {}) {
|
|
514
|
+
const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
|
|
515
|
+
const theme = _material.useTheme.call(void 0, );
|
|
516
|
+
const computedSx = _react.useMemo.call(void 0, () => {
|
|
517
|
+
const baseStyles = {
|
|
518
|
+
// Input field styling
|
|
519
|
+
"& .MuiOutlinedInput-root": {
|
|
520
|
+
backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
521
|
+
// Transition for smooth state changes
|
|
522
|
+
transition: theme.transitions.create([
|
|
523
|
+
"background-color",
|
|
524
|
+
"border-color",
|
|
525
|
+
"color"
|
|
526
|
+
], {
|
|
527
|
+
duration: theme.transitions.duration.short
|
|
528
|
+
}),
|
|
529
|
+
// Error state styling
|
|
530
|
+
...hasError && {
|
|
531
|
+
borderColor: theme.palette.error.main,
|
|
532
|
+
"&:hover": {
|
|
533
|
+
borderColor: theme.palette.error.main
|
|
534
|
+
},
|
|
535
|
+
"&.Mui-focused": {
|
|
536
|
+
borderColor: theme.palette.error.main,
|
|
537
|
+
boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
|
|
538
|
+
// 25 is 15% opacity in hex
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
// Loading state styling
|
|
542
|
+
...loading && {
|
|
543
|
+
opacity: 0.7,
|
|
544
|
+
pointerEvents: "none"
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
// Input element styling
|
|
548
|
+
"& .MuiInputBase-input": {
|
|
549
|
+
cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
|
|
550
|
+
// Read-only specific styling
|
|
551
|
+
...textReadOnly && !disabled && {
|
|
552
|
+
cursor: "pointer",
|
|
553
|
+
userSelect: "none",
|
|
554
|
+
caretColor: "transparent"
|
|
555
|
+
// Hide text cursor in read-only mode
|
|
556
|
+
},
|
|
557
|
+
// Loading state
|
|
558
|
+
...loading && {
|
|
559
|
+
cursor: "wait"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
// Required field asterisk styling
|
|
563
|
+
"& .MuiInputLabel-asterisk": {
|
|
564
|
+
color: theme.palette.error.main,
|
|
565
|
+
fontSize: "1.2em"
|
|
566
|
+
},
|
|
567
|
+
// Label styling with better contrast
|
|
568
|
+
"& .MuiInputLabel-root": {
|
|
569
|
+
color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
|
|
570
|
+
// Ensure proper contrast for disabled state
|
|
571
|
+
...disabled && {
|
|
572
|
+
color: theme.palette.text.disabled
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
// Helper text styling
|
|
576
|
+
"& .MuiFormHelperText-root": {
|
|
577
|
+
marginLeft: theme.spacing(1),
|
|
578
|
+
marginRight: theme.spacing(1),
|
|
579
|
+
// Error state
|
|
580
|
+
...hasError && {
|
|
581
|
+
color: theme.palette.error.main
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
// Calendar icon styling
|
|
585
|
+
"& .MuiInputAdornment-root": {
|
|
586
|
+
color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
|
|
587
|
+
},
|
|
588
|
+
// Focus ring for accessibility
|
|
589
|
+
"& .MuiOutlinedInput-root.Mui-focused": {
|
|
590
|
+
outline: `2px solid ${theme.palette.primary.main}50`,
|
|
591
|
+
// 50 is 31% opacity
|
|
592
|
+
outlineOffset: "2px"
|
|
593
|
+
},
|
|
594
|
+
// Enhanced contrast for dark themes
|
|
595
|
+
...theme.palette.mode === "dark" && {
|
|
596
|
+
"& .MuiOutlinedInput-root": {
|
|
597
|
+
borderWidth: 2
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
};
|
|
601
|
+
return customSx ? [baseStyles, customSx] : baseStyles;
|
|
602
|
+
}, [
|
|
603
|
+
theme,
|
|
604
|
+
disabled,
|
|
605
|
+
hasError,
|
|
606
|
+
loading,
|
|
607
|
+
textReadOnly,
|
|
608
|
+
customSx
|
|
609
|
+
]);
|
|
610
|
+
const className = _react.useMemo.call(void 0, () => {
|
|
611
|
+
const classes = [];
|
|
612
|
+
if (disabled) classes.push("DatePickerElement--disabled");
|
|
613
|
+
if (hasError) classes.push("DatePickerElement--error");
|
|
614
|
+
if (loading) classes.push("DatePickerElement--loading");
|
|
615
|
+
if (textReadOnly) classes.push("DatePickerElement--readOnly");
|
|
616
|
+
return classes.length > 0 ? classes.join(" ") : void 0;
|
|
617
|
+
}, [disabled, hasError, loading, textReadOnly]);
|
|
618
|
+
return {
|
|
619
|
+
sx: computedSx,
|
|
620
|
+
className
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
625
|
+
|
|
626
|
+
var DatePickerElementCore = _react.forwardRef.call(void 0, (props, ref) => {
|
|
627
|
+
const {
|
|
628
|
+
name,
|
|
629
|
+
required = false,
|
|
630
|
+
rules,
|
|
631
|
+
control,
|
|
632
|
+
parseError,
|
|
633
|
+
transform,
|
|
634
|
+
validation,
|
|
635
|
+
label,
|
|
636
|
+
placeholder,
|
|
637
|
+
textReadOnly = false,
|
|
638
|
+
helperText,
|
|
639
|
+
inputProps = {},
|
|
640
|
+
slotProps = {},
|
|
641
|
+
datePickerProps = {},
|
|
642
|
+
variant = "outlined",
|
|
643
|
+
sx: customSx,
|
|
644
|
+
loading = false,
|
|
645
|
+
LoadingComponent,
|
|
646
|
+
...restProps
|
|
647
|
+
} = props;
|
|
648
|
+
const {
|
|
649
|
+
disabled,
|
|
650
|
+
inputRef: externalInputRef,
|
|
651
|
+
onClose,
|
|
652
|
+
...restDatePickerProps
|
|
653
|
+
} = datePickerProps;
|
|
654
|
+
const {
|
|
655
|
+
field,
|
|
656
|
+
fieldState
|
|
657
|
+
} = _reacthookform.useController.call(void 0, {
|
|
658
|
+
name,
|
|
659
|
+
control,
|
|
660
|
+
rules,
|
|
661
|
+
defaultValue: null
|
|
662
|
+
// Let react-hook-form handle the default value typing
|
|
663
|
+
});
|
|
664
|
+
const { value, onChange: onValueChange } = useDatePickerValue({
|
|
665
|
+
field,
|
|
666
|
+
transform
|
|
667
|
+
});
|
|
668
|
+
const { hasError, errorMessage, invalid } = useDatePickerValidation({
|
|
669
|
+
fieldState,
|
|
670
|
+
validation,
|
|
671
|
+
parseError,
|
|
672
|
+
value
|
|
673
|
+
});
|
|
674
|
+
const { sx: computedSx, className } = useDatePickerStyles({
|
|
675
|
+
disabled,
|
|
676
|
+
hasError,
|
|
677
|
+
loading,
|
|
678
|
+
textReadOnly,
|
|
679
|
+
sx: customSx
|
|
680
|
+
});
|
|
681
|
+
const handleInputRef = _material.useForkRef.call(void 0, field.ref, externalInputRef);
|
|
682
|
+
const handleChange = _react.useCallback.call(void 0,
|
|
683
|
+
(newValue, context) => {
|
|
684
|
+
onValueChange(newValue, context);
|
|
685
|
+
},
|
|
686
|
+
[onValueChange]
|
|
687
|
+
);
|
|
688
|
+
const handleClose = _react.useCallback.call(void 0,
|
|
689
|
+
(...args) => {
|
|
690
|
+
field.onBlur();
|
|
691
|
+
if (onClose) {
|
|
692
|
+
onClose(...args);
|
|
693
|
+
}
|
|
694
|
+
},
|
|
695
|
+
[field.onBlur, onClose]
|
|
696
|
+
);
|
|
697
|
+
const handleTextFieldBlur = _react.useCallback.call(void 0,
|
|
698
|
+
(event) => {
|
|
699
|
+
field.onBlur();
|
|
700
|
+
if (typeof inputProps.onBlur === "function") {
|
|
701
|
+
inputProps.onBlur(event);
|
|
702
|
+
}
|
|
703
|
+
},
|
|
704
|
+
[field.onBlur, inputProps.onBlur]
|
|
705
|
+
);
|
|
706
|
+
const memoizedSlotProps = _react.useMemo.call(void 0, () => ({
|
|
707
|
+
...slotProps,
|
|
708
|
+
actionBar: {
|
|
709
|
+
actions: ["clear", "today", "cancel", "accept"],
|
|
710
|
+
...slotProps.actionBar
|
|
711
|
+
},
|
|
712
|
+
textField: {
|
|
713
|
+
...inputProps,
|
|
714
|
+
required,
|
|
715
|
+
placeholder,
|
|
716
|
+
fullWidth: true,
|
|
717
|
+
variant,
|
|
718
|
+
onBlur: handleTextFieldBlur,
|
|
719
|
+
error: hasError,
|
|
720
|
+
helperText: hasError ? errorMessage : helperText,
|
|
721
|
+
inputProps: {
|
|
722
|
+
readOnly: textReadOnly,
|
|
723
|
+
"aria-invalid": invalid,
|
|
724
|
+
"aria-describedby": hasError ? `${name}-error` : void 0,
|
|
725
|
+
...inputProps.inputProps
|
|
726
|
+
},
|
|
727
|
+
// Add loading indicator if provided
|
|
728
|
+
...loading && LoadingComponent && {
|
|
729
|
+
InputProps: {
|
|
730
|
+
endAdornment: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoadingComponent, {}),
|
|
731
|
+
...inputProps.InputProps
|
|
732
|
+
}
|
|
733
|
+
},
|
|
734
|
+
...slotProps.textField
|
|
735
|
+
}
|
|
736
|
+
}), [
|
|
737
|
+
slotProps,
|
|
738
|
+
inputProps,
|
|
739
|
+
required,
|
|
740
|
+
placeholder,
|
|
741
|
+
variant,
|
|
742
|
+
handleTextFieldBlur,
|
|
743
|
+
hasError,
|
|
744
|
+
errorMessage,
|
|
745
|
+
helperText,
|
|
746
|
+
textReadOnly,
|
|
747
|
+
invalid,
|
|
748
|
+
name,
|
|
749
|
+
loading,
|
|
750
|
+
LoadingComponent
|
|
751
|
+
]);
|
|
752
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
753
|
+
_xdatepickers.DatePicker,
|
|
754
|
+
{
|
|
755
|
+
...restProps,
|
|
756
|
+
...restDatePickerProps,
|
|
757
|
+
ref,
|
|
758
|
+
name,
|
|
759
|
+
value,
|
|
760
|
+
onChange: handleChange,
|
|
761
|
+
onClose: handleClose,
|
|
762
|
+
inputRef: handleInputRef,
|
|
763
|
+
label,
|
|
764
|
+
disabled,
|
|
765
|
+
sx: computedSx,
|
|
766
|
+
className,
|
|
767
|
+
slotProps: memoizedSlotProps,
|
|
768
|
+
"aria-invalid": invalid,
|
|
769
|
+
"aria-describedby": hasError ? `${name}-error` : void 0
|
|
770
|
+
}
|
|
771
|
+
);
|
|
772
|
+
});
|
|
773
|
+
DatePickerElementCore.displayName = "DatePickerElementCore";
|
|
774
|
+
|
|
775
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
776
|
+
|
|
777
|
+
var DatePickerElement = _react.forwardRef.call(void 0, (props, ref) => {
|
|
778
|
+
const {
|
|
779
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
780
|
+
...coreProps
|
|
781
|
+
} = props;
|
|
782
|
+
if (gridProps === false) {
|
|
783
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
784
|
+
DatePickerElementCore,
|
|
785
|
+
{
|
|
786
|
+
ref,
|
|
787
|
+
...coreProps
|
|
788
|
+
}
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
792
|
+
_material.Grid,
|
|
793
|
+
{
|
|
794
|
+
ref,
|
|
795
|
+
...gridProps,
|
|
796
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
797
|
+
DatePickerElementCore,
|
|
798
|
+
{
|
|
799
|
+
...coreProps
|
|
800
|
+
}
|
|
801
|
+
)
|
|
802
|
+
}
|
|
803
|
+
);
|
|
804
|
+
});
|
|
805
|
+
DatePickerElement.displayName = "DatePickerElement";
|
|
806
|
+
|
|
807
|
+
// src/wrappers/DatePickerElement/utils.ts
|
|
808
|
+
function isValidDate(value) {
|
|
809
|
+
if (value === null || value === void 0) {
|
|
810
|
+
return false;
|
|
811
|
+
}
|
|
812
|
+
if (value instanceof Date) {
|
|
813
|
+
return !isNaN(value.getTime());
|
|
814
|
+
}
|
|
815
|
+
if (typeof value === "object" && value !== null) {
|
|
816
|
+
if ("isValid" in value && typeof value.isValid === "function") {
|
|
817
|
+
return value.isValid();
|
|
818
|
+
}
|
|
819
|
+
if ("isValid" in value && typeof value.isValid === "boolean") {
|
|
820
|
+
return value.isValid;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
return false;
|
|
824
|
+
}
|
|
825
|
+
function isParsableDateString(value) {
|
|
826
|
+
if (typeof value !== "string" || value === "") {
|
|
827
|
+
return false;
|
|
828
|
+
}
|
|
829
|
+
const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
|
|
830
|
+
if (isoDateRegex.test(value)) {
|
|
831
|
+
return true;
|
|
832
|
+
}
|
|
833
|
+
const parsed = new Date(value);
|
|
834
|
+
return !isNaN(parsed.getTime());
|
|
835
|
+
}
|
|
836
|
+
function createDateInputTransform(adapter) {
|
|
837
|
+
return (value) => {
|
|
838
|
+
if (value === null || value === void 0) {
|
|
839
|
+
return null;
|
|
840
|
+
}
|
|
841
|
+
if (typeof value === "string") {
|
|
842
|
+
if (value === "") {
|
|
843
|
+
return null;
|
|
844
|
+
}
|
|
845
|
+
try {
|
|
846
|
+
const parsed = adapter.utils.date(value);
|
|
847
|
+
return isValidDate(parsed) ? parsed : null;
|
|
848
|
+
} catch (e2) {
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
if (isValidDate(value)) {
|
|
853
|
+
return value;
|
|
854
|
+
}
|
|
855
|
+
return null;
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
function createDateOutputTransform(format) {
|
|
859
|
+
return (value) => {
|
|
860
|
+
if (value === null || value === void 0) {
|
|
861
|
+
return null;
|
|
862
|
+
}
|
|
863
|
+
if (!isValidDate(value)) {
|
|
864
|
+
return null;
|
|
865
|
+
}
|
|
866
|
+
if (!format) {
|
|
867
|
+
return value;
|
|
868
|
+
}
|
|
869
|
+
try {
|
|
870
|
+
if (value instanceof Date) {
|
|
871
|
+
if (format === "iso") {
|
|
872
|
+
return value.toISOString();
|
|
873
|
+
}
|
|
874
|
+
if (format === "date-only") {
|
|
875
|
+
return value.toISOString().split("T")[0];
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
if (typeof value.format === "function") {
|
|
879
|
+
return value.format(format);
|
|
880
|
+
}
|
|
881
|
+
if (typeof value.format === "function") {
|
|
882
|
+
return value.format(format);
|
|
883
|
+
}
|
|
884
|
+
if (typeof value.toFormat === "function") {
|
|
885
|
+
return value.toFormat(format);
|
|
886
|
+
}
|
|
887
|
+
return value;
|
|
888
|
+
} catch (e3) {
|
|
889
|
+
return null;
|
|
890
|
+
}
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
function createDefaultDatePickerConfig() {
|
|
894
|
+
return {
|
|
895
|
+
// Default slot props for consistent behavior
|
|
896
|
+
slotProps: {
|
|
897
|
+
actionBar: {
|
|
898
|
+
actions: ["clear", "today", "cancel", "accept"]
|
|
899
|
+
},
|
|
900
|
+
textField: {
|
|
901
|
+
fullWidth: true,
|
|
902
|
+
variant: "outlined"
|
|
903
|
+
}
|
|
904
|
+
},
|
|
905
|
+
// Default grid props for layout consistency
|
|
906
|
+
gridProps: {
|
|
907
|
+
size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
|
|
908
|
+
},
|
|
909
|
+
// Default validation configuration
|
|
910
|
+
validation: {
|
|
911
|
+
errorMessages: {
|
|
912
|
+
invalidDate: "Please enter a valid date",
|
|
913
|
+
minDate: "Date must be after the minimum allowed date",
|
|
914
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
915
|
+
disabledDate: "This date is not allowed"
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
};
|
|
919
|
+
}
|
|
920
|
+
function extractErrorMessage(error) {
|
|
921
|
+
if (error === null || error === void 0) {
|
|
922
|
+
return "";
|
|
923
|
+
}
|
|
924
|
+
if (typeof error === "string") {
|
|
925
|
+
return error;
|
|
926
|
+
}
|
|
927
|
+
if (typeof error === "object" && error !== null) {
|
|
928
|
+
if ("message" in error && typeof error.message === "string") {
|
|
929
|
+
return error.message;
|
|
930
|
+
}
|
|
931
|
+
if ("type" in error && typeof error.type === "string") {
|
|
932
|
+
const errorType = error.type;
|
|
933
|
+
switch (errorType) {
|
|
934
|
+
case "invalidDate":
|
|
935
|
+
return "Please enter a valid date";
|
|
936
|
+
case "minDate":
|
|
937
|
+
return "Date is too early";
|
|
938
|
+
case "maxDate":
|
|
939
|
+
return "Date is too late";
|
|
940
|
+
case "disabledDate":
|
|
941
|
+
return "This date is not available";
|
|
942
|
+
default:
|
|
943
|
+
return "Invalid date selection";
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
return "Invalid input";
|
|
948
|
+
}
|
|
949
|
+
function createStableKey(config) {
|
|
950
|
+
try {
|
|
951
|
+
return JSON.stringify(config, (key, value) => {
|
|
952
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
953
|
+
const sorted = {};
|
|
954
|
+
Object.keys(value).sort().forEach((k) => {
|
|
955
|
+
sorted[k] = value[k];
|
|
956
|
+
});
|
|
957
|
+
return sorted;
|
|
958
|
+
}
|
|
959
|
+
return value;
|
|
960
|
+
});
|
|
961
|
+
} catch (e4) {
|
|
962
|
+
return Object.keys(config).sort().join("-");
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// src/wrappers/PasswordElement/PasswordElement.tsx
|
|
967
|
+
var _Visibility = require('@mui/icons-material/Visibility'); var _Visibility2 = _interopRequireDefault(_Visibility);
|
|
968
|
+
var _VisibilityOff = require('@mui/icons-material/VisibilityOff'); var _VisibilityOff2 = _interopRequireDefault(_VisibilityOff);
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
|
|
976
|
+
|
|
977
|
+
|
|
978
|
+
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
var Component3 = function PasswordEl(props) {
|
|
982
|
+
const {
|
|
983
|
+
type,
|
|
984
|
+
required,
|
|
985
|
+
iconColor,
|
|
986
|
+
renderIcon = (password2) => password2 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Visibility2.default, {}) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _VisibilityOff2.default, {}),
|
|
987
|
+
slotProps,
|
|
988
|
+
name,
|
|
989
|
+
control,
|
|
990
|
+
component: TextFieldComponent = _material.TextField,
|
|
991
|
+
inputRef,
|
|
992
|
+
onBlur,
|
|
993
|
+
...rest
|
|
994
|
+
} = props;
|
|
995
|
+
const [password, setPassword] = _react.useState.call(void 0, true);
|
|
996
|
+
const endAdornment = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.InputAdornment, { position: "end", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
997
|
+
_material.IconButton,
|
|
998
|
+
{
|
|
999
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
1000
|
+
onClick: () => setPassword(!password),
|
|
1001
|
+
tabIndex: -1,
|
|
1002
|
+
color: _nullishCoalesce(iconColor, () => ( "default")),
|
|
1003
|
+
children: renderIcon(password)
|
|
1004
|
+
}
|
|
1005
|
+
) });
|
|
1006
|
+
const {
|
|
1007
|
+
field,
|
|
1008
|
+
fieldState: { error }
|
|
1009
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1010
|
+
name,
|
|
1011
|
+
control
|
|
1012
|
+
});
|
|
1013
|
+
const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
|
|
1014
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1015
|
+
_material.TextField,
|
|
1016
|
+
{
|
|
1017
|
+
...rest,
|
|
1018
|
+
inputRef: handleInputRef,
|
|
1019
|
+
type: password ? "password" : "text",
|
|
1020
|
+
value: field.value,
|
|
1021
|
+
fullWidth: true,
|
|
1022
|
+
onChange: (event) => {
|
|
1023
|
+
field.onChange(event);
|
|
1024
|
+
if (typeof rest.onChange === "function") {
|
|
1025
|
+
rest.onChange(event);
|
|
1026
|
+
}
|
|
1027
|
+
},
|
|
1028
|
+
onBlur: (event) => {
|
|
1029
|
+
field.onBlur();
|
|
1030
|
+
if (typeof onBlur === "function") {
|
|
1031
|
+
onBlur(event);
|
|
1032
|
+
}
|
|
1033
|
+
},
|
|
1034
|
+
...typeof slotProps === "undefined" ? {
|
|
1035
|
+
InputProps: {
|
|
1036
|
+
endAdornment
|
|
1037
|
+
}
|
|
1038
|
+
} : {
|
|
1039
|
+
slotProps: {
|
|
1040
|
+
...slotProps,
|
|
1041
|
+
input: {
|
|
1042
|
+
endAdornment,
|
|
1043
|
+
..._optionalChain([slotProps, 'optionalAccess', _16 => _16.input])
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
},
|
|
1047
|
+
error: !!error,
|
|
1048
|
+
helperText: error ? error.message : ""
|
|
1049
|
+
}
|
|
1050
|
+
);
|
|
1051
|
+
};
|
|
1052
|
+
var PasswordElement = ({
|
|
1053
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1054
|
+
...props
|
|
1055
|
+
}) => {
|
|
1056
|
+
if (gridProps) {
|
|
1057
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1058
|
+
_material.Grid,
|
|
1059
|
+
{
|
|
1060
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1061
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component3, { ...props })
|
|
1062
|
+
}
|
|
1063
|
+
);
|
|
1064
|
+
}
|
|
1065
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component3, { ...props });
|
|
1066
|
+
};
|
|
1067
|
+
PasswordElement.displayName = "PasswordElement";
|
|
1068
|
+
var PasswordElement_default = PasswordElement;
|
|
1069
|
+
|
|
1070
|
+
// src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
|
|
1071
|
+
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
var Component4 = 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,
|
|
1097
|
+
control,
|
|
1098
|
+
type,
|
|
1099
|
+
labelProps,
|
|
1100
|
+
disabled,
|
|
1101
|
+
formLabelProps,
|
|
1102
|
+
radioProps,
|
|
1103
|
+
transform,
|
|
1104
|
+
...rest
|
|
1105
|
+
} = props;
|
|
1106
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1107
|
+
const {
|
|
1108
|
+
field,
|
|
1109
|
+
fieldState: { error }
|
|
1110
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1111
|
+
name,
|
|
1112
|
+
disabled,
|
|
1113
|
+
control
|
|
1114
|
+
});
|
|
1115
|
+
const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
|
|
1116
|
+
value: field.value,
|
|
1117
|
+
onChange: field.onChange,
|
|
1118
|
+
transform: {
|
|
1119
|
+
input: typeof _optionalChain([transform, 'optionalAccess', _17 => _17.input]) === "function" ? transform.input : (value2) => {
|
|
1120
|
+
return value2 || "";
|
|
1121
|
+
},
|
|
1122
|
+
output: typeof _optionalChain([transform, 'optionalAccess', _18 => _18.output]) === "function" ? _optionalChain([transform, 'optionalAccess', _19 => _19.output]) : (_event, value2) => {
|
|
1123
|
+
if (value2 && type === "number") {
|
|
1124
|
+
return Number(value2);
|
|
1125
|
+
}
|
|
1126
|
+
if (value2 && type === "boolean") {
|
|
1127
|
+
return Boolean(value2);
|
|
1128
|
+
}
|
|
1129
|
+
return value2;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
const onRadioChange = (event, radioValue) => {
|
|
1134
|
+
const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
|
|
1135
|
+
onChange(event, returnValue);
|
|
1136
|
+
if (typeof rest.onChange === "function") {
|
|
1137
|
+
rest.onChange(returnValue);
|
|
1138
|
+
}
|
|
1139
|
+
};
|
|
1140
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, children: [
|
|
1141
|
+
label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
|
|
1142
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.RadioGroup, { onChange: onRadioChange, name, row, value, children: [
|
|
1143
|
+
emptyOptionLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1144
|
+
_material.FormControlLabel,
|
|
1145
|
+
{
|
|
1146
|
+
...labelProps,
|
|
1147
|
+
control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1148
|
+
_material.Radio,
|
|
1149
|
+
{
|
|
1150
|
+
...radioProps,
|
|
1151
|
+
sx: {
|
|
1152
|
+
color: error ? theme.palette.error.main : void 0
|
|
1153
|
+
},
|
|
1154
|
+
checked: !value
|
|
1155
|
+
}
|
|
1156
|
+
),
|
|
1157
|
+
label: emptyOptionLabel,
|
|
1158
|
+
value: ""
|
|
1159
|
+
}
|
|
1160
|
+
),
|
|
1161
|
+
options.map((option) => {
|
|
1162
|
+
const optionKey = option[valueKey];
|
|
1163
|
+
const optionDisabled = option[disabledKey] || false;
|
|
1164
|
+
let val = returnObject ? _optionalChain([value, 'optionalAccess', _20 => _20[valueKey]]) : value;
|
|
1165
|
+
if (type === "number" && val !== void 0) {
|
|
1166
|
+
val = Number(val);
|
|
1167
|
+
} else if (type === "boolean" && val !== void 0) {
|
|
1168
|
+
val = Boolean(val);
|
|
1169
|
+
}
|
|
1170
|
+
const isChecked = val === optionKey;
|
|
1171
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1172
|
+
_material.FormControlLabel,
|
|
1173
|
+
{
|
|
1174
|
+
...labelProps,
|
|
1175
|
+
control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1176
|
+
_material.Radio,
|
|
1177
|
+
{
|
|
1178
|
+
...radioProps,
|
|
1179
|
+
sx: {
|
|
1180
|
+
color: error ? theme.palette.error.main : void 0
|
|
1181
|
+
},
|
|
1182
|
+
disabled: disabled || optionDisabled,
|
|
1183
|
+
checked: isChecked
|
|
1184
|
+
}
|
|
1185
|
+
),
|
|
1186
|
+
value: optionKey,
|
|
1187
|
+
label: option[labelKey]
|
|
1188
|
+
},
|
|
1189
|
+
String(optionKey)
|
|
1190
|
+
);
|
|
1191
|
+
})
|
|
1192
|
+
] }),
|
|
1193
|
+
error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { children: error.message })
|
|
1194
|
+
] });
|
|
1195
|
+
};
|
|
1196
|
+
var RadioButtonGroup2 = ({
|
|
1197
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1198
|
+
...props
|
|
1199
|
+
}) => {
|
|
1200
|
+
if (gridProps) {
|
|
1201
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1202
|
+
_material.Grid,
|
|
1203
|
+
{
|
|
1204
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1205
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component4, { ...props })
|
|
1206
|
+
}
|
|
1207
|
+
);
|
|
1208
|
+
}
|
|
1209
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component4, { ...props });
|
|
1210
|
+
};
|
|
1211
|
+
RadioButtonGroup2.displayName = "RadioButtonGroup";
|
|
1212
|
+
var RadioButtonGroup_default = RadioButtonGroup2;
|
|
1213
|
+
|
|
1214
|
+
// src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
var Component5 = function SelectCascadeElement(props) {
|
|
1227
|
+
const {
|
|
1228
|
+
labelKey = "Label",
|
|
1229
|
+
valueKey = "Value",
|
|
1230
|
+
name,
|
|
1231
|
+
onBlur,
|
|
1232
|
+
onChange,
|
|
1233
|
+
disabled,
|
|
1234
|
+
options,
|
|
1235
|
+
control,
|
|
1236
|
+
loading = false,
|
|
1237
|
+
placeholder,
|
|
1238
|
+
label,
|
|
1239
|
+
dependsOn,
|
|
1240
|
+
textFieldProps = {},
|
|
1241
|
+
variant,
|
|
1242
|
+
sx,
|
|
1243
|
+
isEdit = false,
|
|
1244
|
+
...rest
|
|
1245
|
+
} = props;
|
|
1246
|
+
const { required } = textFieldProps;
|
|
1247
|
+
const getOptionKey = _react.useCallback.call(void 0,
|
|
1248
|
+
(option) => {
|
|
1249
|
+
if (typeof option === "string" || typeof option === "number") return option;
|
|
1250
|
+
const key = option ? option[valueKey] : void 0;
|
|
1251
|
+
return key !== void 0 && key !== null ? String(key) : "";
|
|
1252
|
+
},
|
|
1253
|
+
[valueKey]
|
|
1254
|
+
);
|
|
1255
|
+
const getOptionLabel = _react.useCallback.call(void 0,
|
|
1256
|
+
(option) => {
|
|
1257
|
+
if (typeof option === "string") return option;
|
|
1258
|
+
return option ? String(option[labelKey]) : "";
|
|
1259
|
+
},
|
|
1260
|
+
[labelKey]
|
|
1261
|
+
);
|
|
1262
|
+
const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
|
|
1263
|
+
const {
|
|
1264
|
+
field,
|
|
1265
|
+
fieldState: { error }
|
|
1266
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1267
|
+
name,
|
|
1268
|
+
control
|
|
1269
|
+
});
|
|
1270
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1271
|
+
const { field: dependentField } = _reacthookform.useController.call(void 0, {
|
|
1272
|
+
name: dependsOn,
|
|
1273
|
+
control
|
|
1274
|
+
});
|
|
1275
|
+
const parentValueRef = _react.useRef.call(void 0, _nullishCoalesce(dependentField.value, () => ( null)));
|
|
1276
|
+
const [hasAutoSelected, setHasAutoSelected] = _react.useState.call(void 0, false);
|
|
1277
|
+
_react.useEffect.call(void 0, () => {
|
|
1278
|
+
if (!!dependentField.value && _optionalChain([parentValueRef, 'optionalAccess', _21 => _21.current]) !== dependentField.value || dependentField.value === null) {
|
|
1279
|
+
field.onChange(null);
|
|
1280
|
+
setHasAutoSelected(false);
|
|
1281
|
+
}
|
|
1282
|
+
}, [dependentField.value]);
|
|
1283
|
+
_react.useEffect.call(void 0, () => {
|
|
1284
|
+
if (isEdit && !disabled && options.length === 1 && field.value == null && !hasAutoSelected) {
|
|
1285
|
+
field.onChange(getOptionKey(options[0]));
|
|
1286
|
+
setHasAutoSelected(true);
|
|
1287
|
+
} else {
|
|
1288
|
+
if (options.length === 1 && field.value == null && !hasAutoSelected) {
|
|
1289
|
+
field.onChange(getOptionKey(options[0]));
|
|
1290
|
+
setHasAutoSelected(true);
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
}, [
|
|
1294
|
+
options,
|
|
1295
|
+
field.value,
|
|
1296
|
+
field.onChange,
|
|
1297
|
+
hasAutoSelected,
|
|
1298
|
+
isEdit,
|
|
1299
|
+
disabled,
|
|
1300
|
+
field,
|
|
1301
|
+
getOptionKey,
|
|
1302
|
+
dependentField.onChange
|
|
1303
|
+
]);
|
|
1304
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1305
|
+
_material.Autocomplete,
|
|
1306
|
+
{
|
|
1307
|
+
...rest,
|
|
1308
|
+
value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
|
|
1309
|
+
size: "small",
|
|
1310
|
+
loading,
|
|
1311
|
+
options,
|
|
1312
|
+
getOptionKey,
|
|
1313
|
+
getOptionLabel,
|
|
1314
|
+
isOptionEqualToValue,
|
|
1315
|
+
ref: field.ref,
|
|
1316
|
+
disabled: dependentField.value == null || disabled,
|
|
1317
|
+
onChange: (event, newValue, reason) => {
|
|
1318
|
+
field.onChange(newValue ? getOptionKey(newValue) : null);
|
|
1319
|
+
if (onChange && typeof onChange === "function") {
|
|
1320
|
+
onChange(event, newValue, reason);
|
|
1321
|
+
}
|
|
1322
|
+
},
|
|
1323
|
+
onBlur: (event) => {
|
|
1324
|
+
field.onBlur();
|
|
1325
|
+
if (typeof onBlur === "function") {
|
|
1326
|
+
onBlur(event);
|
|
1327
|
+
}
|
|
1328
|
+
},
|
|
1329
|
+
fullWidth: true,
|
|
1330
|
+
renderInput: (params) => (
|
|
1331
|
+
// @ts-ignore
|
|
1332
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1333
|
+
_material.TextField,
|
|
1334
|
+
{
|
|
1335
|
+
...params,
|
|
1336
|
+
fullWidth: true,
|
|
1337
|
+
error: !!error,
|
|
1338
|
+
required,
|
|
1339
|
+
helperText: error ? error.message : "",
|
|
1340
|
+
placeholder,
|
|
1341
|
+
label,
|
|
1342
|
+
variant: variant ? variant : "outlined",
|
|
1343
|
+
sx: {
|
|
1344
|
+
"& .MuiOutlinedInput-root": {
|
|
1345
|
+
bgcolor: disabled || dependentField.value == null ? theme.palette.action.disabledBackground : "transparent"
|
|
1346
|
+
},
|
|
1347
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1348
|
+
"& .MuiInputBase-input": {
|
|
1349
|
+
cursor: disabled || dependentField.value == null ? "not-allowed" : "default"
|
|
1350
|
+
},
|
|
1351
|
+
...sx
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
)
|
|
1355
|
+
)
|
|
1356
|
+
}
|
|
1357
|
+
);
|
|
1358
|
+
};
|
|
1359
|
+
var SelectCascadeElement2 = ({
|
|
1360
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1361
|
+
...props
|
|
1362
|
+
}) => {
|
|
1363
|
+
if (gridProps) {
|
|
1364
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component5, { ...props }) });
|
|
1365
|
+
}
|
|
1366
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component5, { ...props });
|
|
1367
|
+
};
|
|
1368
|
+
SelectCascadeElement2.displayName = "SelectCascadeElement";
|
|
1369
|
+
var SelectCascadeElement_default = SelectCascadeElement2;
|
|
1370
|
+
|
|
1371
|
+
// src/wrappers/SelectElement/SelectElement.tsx
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
var Component6 = function SelectElement(props) {
|
|
1383
|
+
const {
|
|
1384
|
+
name,
|
|
1385
|
+
control,
|
|
1386
|
+
onChange,
|
|
1387
|
+
isEdit,
|
|
1388
|
+
options,
|
|
1389
|
+
label,
|
|
1390
|
+
sx,
|
|
1391
|
+
variant,
|
|
1392
|
+
disabled,
|
|
1393
|
+
labelKey = "Label",
|
|
1394
|
+
valueKey = "Value",
|
|
1395
|
+
placeholder,
|
|
1396
|
+
textFieldProps = {},
|
|
1397
|
+
...rest
|
|
1398
|
+
} = props;
|
|
1399
|
+
const { required } = textFieldProps;
|
|
1400
|
+
const {
|
|
1401
|
+
field,
|
|
1402
|
+
fieldState: { error }
|
|
1403
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1404
|
+
name,
|
|
1405
|
+
control
|
|
1406
|
+
});
|
|
1407
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1408
|
+
const getOptionValue = _react.useCallback.call(void 0,
|
|
1409
|
+
(option) => {
|
|
1410
|
+
if (typeof option === "string") return option;
|
|
1411
|
+
return option ? option[valueKey] : null;
|
|
1412
|
+
},
|
|
1413
|
+
[valueKey]
|
|
1414
|
+
);
|
|
1415
|
+
const getOptionLabel = _react.useCallback.call(void 0,
|
|
1416
|
+
(option) => {
|
|
1417
|
+
if (typeof option === "string") return option;
|
|
1418
|
+
return option ? String(option[labelKey]) : "";
|
|
1419
|
+
},
|
|
1420
|
+
[labelKey]
|
|
1421
|
+
);
|
|
1422
|
+
const handleChange = (event, newValue, reason) => {
|
|
1423
|
+
const option = newValue;
|
|
1424
|
+
field.onChange(option ? getOptionValue(option) : null);
|
|
1425
|
+
_optionalChain([onChange, 'optionalCall', _22 => _22(event, newValue, reason)]);
|
|
1426
|
+
};
|
|
1427
|
+
_react.useEffect.call(void 0, () => {
|
|
1428
|
+
if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
|
|
1429
|
+
const defaultOption = options[0];
|
|
1430
|
+
const defaultValue = getOptionValue(defaultOption);
|
|
1431
|
+
field.onChange(defaultValue);
|
|
1432
|
+
}
|
|
1433
|
+
}, [isEdit, options]);
|
|
1434
|
+
const autocompleteValue = _react.useMemo.call(void 0,
|
|
1435
|
+
() => _nullishCoalesce(options.find((option) => getOptionValue(option) === field.value), () => ( null)),
|
|
1436
|
+
[field.value, options, getOptionValue]
|
|
1437
|
+
);
|
|
1438
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1439
|
+
_material.Autocomplete,
|
|
1440
|
+
{
|
|
1441
|
+
...rest,
|
|
1442
|
+
filterSelectedOptions: false,
|
|
1443
|
+
options,
|
|
1444
|
+
value: autocompleteValue,
|
|
1445
|
+
onChange: handleChange,
|
|
1446
|
+
disabled,
|
|
1447
|
+
getOptionLabel: (option) => getOptionLabel(option),
|
|
1448
|
+
ref: field.ref,
|
|
1449
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1450
|
+
renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1451
|
+
_material.TextField,
|
|
1452
|
+
{
|
|
1453
|
+
...params,
|
|
1454
|
+
fullWidth: true,
|
|
1455
|
+
required,
|
|
1456
|
+
error: !!error,
|
|
1457
|
+
helperText: error ? error.message : "",
|
|
1458
|
+
label,
|
|
1459
|
+
placeholder,
|
|
1460
|
+
variant: variant ? variant : "outlined",
|
|
1461
|
+
sx: {
|
|
1462
|
+
"& .MuiOutlinedInput-root": {
|
|
1463
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
|
|
1464
|
+
},
|
|
1465
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1466
|
+
"& .MuiInputBase-input": {
|
|
1467
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1468
|
+
},
|
|
1469
|
+
...sx
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
)
|
|
1473
|
+
}
|
|
1474
|
+
);
|
|
1475
|
+
};
|
|
1476
|
+
var SelectElement2 = ({
|
|
1477
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1478
|
+
...props
|
|
1479
|
+
}) => {
|
|
1480
|
+
if (gridProps) {
|
|
1481
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1482
|
+
_material.Grid,
|
|
1483
|
+
{
|
|
1484
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1485
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component6, { ...props })
|
|
1486
|
+
}
|
|
1487
|
+
);
|
|
1488
|
+
}
|
|
1489
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component6, { ...props });
|
|
1490
|
+
};
|
|
1491
|
+
SelectElement2.displayName = "SelectElement";
|
|
1492
|
+
var SelectElement_default = SelectElement2;
|
|
1493
|
+
|
|
1494
|
+
// src/wrappers/SelectMultiElement/SelectMultiElement.tsx
|
|
1495
|
+
var _CheckBox = require('@mui/icons-material/CheckBox'); var _CheckBox2 = _interopRequireDefault(_CheckBox);
|
|
1496
|
+
var _CheckBoxOutlineBlank = require('@mui/icons-material/CheckBoxOutlineBlank'); var _CheckBoxOutlineBlank2 = _interopRequireDefault(_CheckBoxOutlineBlank);
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
var Component7 = function SelectMultiElement(props) {
|
|
1502
|
+
const {
|
|
1503
|
+
name,
|
|
1504
|
+
control,
|
|
1505
|
+
onBlur,
|
|
1506
|
+
disabled,
|
|
1507
|
+
options,
|
|
1508
|
+
loading = false,
|
|
1509
|
+
placeholder,
|
|
1510
|
+
label,
|
|
1511
|
+
variant,
|
|
1512
|
+
sx,
|
|
1513
|
+
labelKey = "Label",
|
|
1514
|
+
valueKey = "Value",
|
|
1515
|
+
...rest
|
|
1516
|
+
} = props;
|
|
1517
|
+
const {
|
|
1518
|
+
field,
|
|
1519
|
+
fieldState: { error }
|
|
1520
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1521
|
+
name,
|
|
1522
|
+
control
|
|
1523
|
+
});
|
|
1524
|
+
const getOptionValue = (option) => {
|
|
1525
|
+
if (typeof option === "string") return option;
|
|
1526
|
+
return option ? option[valueKey] : null;
|
|
1527
|
+
};
|
|
1528
|
+
const getOptionLabel = (option) => {
|
|
1529
|
+
if (typeof option === "string") return option;
|
|
1530
|
+
return option ? option[labelKey] : "";
|
|
1531
|
+
};
|
|
1532
|
+
const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
|
|
1533
|
+
const handleChange = (_, selectedOptions, reason) => {
|
|
1534
|
+
if (reason === "clear") {
|
|
1535
|
+
field.onChange([]);
|
|
1536
|
+
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
1537
|
+
const newValues = selectedOptions.map((option) => getOptionValue(option));
|
|
1538
|
+
field.onChange(newValues);
|
|
1539
|
+
}
|
|
1540
|
+
};
|
|
1541
|
+
const icon = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CheckBoxOutlineBlank2.default, { fontSize: "small" });
|
|
1542
|
+
const checkedIcon = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CheckBox2.default, { fontSize: "small" });
|
|
1543
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1544
|
+
_material.Autocomplete,
|
|
1545
|
+
{
|
|
1546
|
+
multiple: true,
|
|
1547
|
+
value: selectedValue,
|
|
1548
|
+
loading,
|
|
1549
|
+
options,
|
|
1550
|
+
getOptionLabel,
|
|
1551
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1552
|
+
filterSelectedOptions: true,
|
|
1553
|
+
disableCloseOnSelect: true,
|
|
1554
|
+
ref: field.ref,
|
|
1555
|
+
disabled: _nullishCoalesce(disabled, () => ( field.disabled)),
|
|
1556
|
+
onChange: handleChange,
|
|
1557
|
+
onBlur: (event) => {
|
|
1558
|
+
field.onBlur();
|
|
1559
|
+
if (typeof onBlur === "function") {
|
|
1560
|
+
onBlur(event);
|
|
1561
|
+
}
|
|
1562
|
+
},
|
|
1563
|
+
fullWidth: true,
|
|
1564
|
+
renderOption: (props1, option, { selected }) => {
|
|
1565
|
+
const { key, ...optionProps } = props1;
|
|
1566
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "li", { ...optionProps, children: [
|
|
1567
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Checkbox, { icon, checkedIcon, checked: selected }),
|
|
1568
|
+
getOptionLabel(option)
|
|
1569
|
+
] }, key);
|
|
1570
|
+
},
|
|
1571
|
+
renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1572
|
+
_material.TextField,
|
|
1573
|
+
{
|
|
1574
|
+
...params,
|
|
1575
|
+
label,
|
|
1576
|
+
error: !!error,
|
|
1577
|
+
helperText: error ? error.message : "",
|
|
1578
|
+
placeholder,
|
|
1579
|
+
slotProps: {
|
|
1580
|
+
input: {
|
|
1581
|
+
...params.InputProps,
|
|
1582
|
+
endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _react.Fragment, { children: [
|
|
1583
|
+
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }) : null,
|
|
1584
|
+
params.InputProps.endAdornment
|
|
1585
|
+
] })
|
|
1586
|
+
}
|
|
1587
|
+
},
|
|
1588
|
+
variant: variant ? variant : "outlined",
|
|
1589
|
+
sx: {
|
|
1590
|
+
...sx
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
),
|
|
1594
|
+
...rest
|
|
1595
|
+
}
|
|
1596
|
+
);
|
|
1597
|
+
};
|
|
1598
|
+
var SelectMultiElement2 = ({
|
|
1599
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1600
|
+
...props
|
|
1601
|
+
}) => {
|
|
1602
|
+
if (gridProps) {
|
|
1603
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component7, { ...props }) });
|
|
1604
|
+
}
|
|
1605
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component7, { ...props });
|
|
1606
|
+
};
|
|
1607
|
+
SelectMultiElement2.displayName = "SelectMultiElement";
|
|
1608
|
+
var SelectMultiElement_default = SelectMultiElement2;
|
|
1609
|
+
|
|
1610
|
+
// src/wrappers/TextFieldElement/TextFieldElement.tsx
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
var Component8 = function TextFieldElement(props) {
|
|
1622
|
+
const {
|
|
1623
|
+
rules = {},
|
|
1624
|
+
parseError,
|
|
1625
|
+
name,
|
|
1626
|
+
control,
|
|
1627
|
+
component: TextFieldComponent = _material.TextField,
|
|
1628
|
+
gridProps,
|
|
1629
|
+
transform,
|
|
1630
|
+
label,
|
|
1631
|
+
placeholder,
|
|
1632
|
+
textFieldProps = {},
|
|
1633
|
+
variant,
|
|
1634
|
+
sx,
|
|
1635
|
+
...rest
|
|
1636
|
+
} = props;
|
|
1637
|
+
const {
|
|
1638
|
+
type,
|
|
1639
|
+
required,
|
|
1640
|
+
helperText,
|
|
1641
|
+
inputRef,
|
|
1642
|
+
onBlur,
|
|
1643
|
+
disabled,
|
|
1644
|
+
...restTextProps
|
|
1645
|
+
} = textFieldProps;
|
|
1646
|
+
const {
|
|
1647
|
+
field,
|
|
1648
|
+
fieldState: { error }
|
|
1649
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1650
|
+
name,
|
|
1651
|
+
control
|
|
1652
|
+
});
|
|
1653
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1654
|
+
const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
|
|
1655
|
+
value: field.value,
|
|
1656
|
+
onChange: field.onChange,
|
|
1657
|
+
transform: {
|
|
1658
|
+
input: typeof _optionalChain([transform, 'optionalAccess', _23 => _23.input]) === "function" ? transform.input : (value2) => {
|
|
1659
|
+
return _nullishCoalesce(value2, () => ( ""));
|
|
1660
|
+
},
|
|
1661
|
+
output: typeof _optionalChain([transform, 'optionalAccess', _24 => _24.output]) === "function" ? transform.output : (eventOrValue, value2) => {
|
|
1662
|
+
const extractedValue = value2 !== void 0 ? value2 : typeof eventOrValue === "object" && eventOrValue !== null && "target" in eventOrValue && typeof eventOrValue.target === "object" && eventOrValue.target !== null && "value" in eventOrValue.target ? eventOrValue.target.value : eventOrValue;
|
|
1663
|
+
if (type !== "number") {
|
|
1664
|
+
return extractedValue;
|
|
1665
|
+
}
|
|
1666
|
+
if (extractedValue === "") {
|
|
1667
|
+
return null;
|
|
1668
|
+
}
|
|
1669
|
+
if (extractedValue == null) {
|
|
1670
|
+
return extractedValue;
|
|
1671
|
+
}
|
|
1672
|
+
return Number(extractedValue);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
});
|
|
1676
|
+
const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
|
|
1677
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1678
|
+
TextFieldComponent,
|
|
1679
|
+
{
|
|
1680
|
+
...rest,
|
|
1681
|
+
...restTextProps,
|
|
1682
|
+
name: field.name,
|
|
1683
|
+
value,
|
|
1684
|
+
onChange: (event) => {
|
|
1685
|
+
field.onChange(event);
|
|
1686
|
+
if (typeof onChange === "function") {
|
|
1687
|
+
onChange(event);
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1690
|
+
onBlur: (event) => {
|
|
1691
|
+
field.onBlur();
|
|
1692
|
+
if (typeof onBlur === "function") {
|
|
1693
|
+
onBlur(event);
|
|
1694
|
+
}
|
|
1695
|
+
},
|
|
1696
|
+
disabled,
|
|
1697
|
+
label,
|
|
1698
|
+
placeholder,
|
|
1699
|
+
fullWidth: true,
|
|
1700
|
+
required,
|
|
1701
|
+
type,
|
|
1702
|
+
error: !!error,
|
|
1703
|
+
helperText: error ? error.message : helperText,
|
|
1704
|
+
inputRef: handleInputRef,
|
|
1705
|
+
variant: variant ? variant : "outlined",
|
|
1706
|
+
size: "small",
|
|
1707
|
+
sx: {
|
|
1708
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1709
|
+
"& .MuiInputBase-input": {
|
|
1710
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1711
|
+
},
|
|
1712
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
1713
|
+
...sx
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
);
|
|
1717
|
+
};
|
|
1718
|
+
var TextFieldElement2 = ({
|
|
1719
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1720
|
+
...props
|
|
1721
|
+
}) => {
|
|
1722
|
+
if (gridProps) {
|
|
1723
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1724
|
+
_material.Grid,
|
|
1725
|
+
{
|
|
1726
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1727
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component8, { ...props })
|
|
1728
|
+
}
|
|
1729
|
+
);
|
|
1730
|
+
}
|
|
1731
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component8, { ...props });
|
|
1732
|
+
};
|
|
1733
|
+
TextFieldElement2.displayName = "TextFieldElement";
|
|
1734
|
+
var TextFieldElement_default = TextFieldElement2;
|
|
1735
|
+
|
|
1736
|
+
// src/wrappers/TextFieldElement/EnhancedTextFieldElement.tsx
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
var Component9 = function EnhancedTextFieldElement(props) {
|
|
1748
|
+
const {
|
|
1749
|
+
rules = {},
|
|
1750
|
+
parseError,
|
|
1751
|
+
name,
|
|
1752
|
+
control,
|
|
1753
|
+
component: TextFieldComponent = _material.TextField,
|
|
1754
|
+
gridProps,
|
|
1755
|
+
transform,
|
|
1756
|
+
fieldType = "text",
|
|
1757
|
+
// Default to text type
|
|
1758
|
+
defaultValue,
|
|
1759
|
+
label,
|
|
1760
|
+
placeholder,
|
|
1761
|
+
textFieldProps = {},
|
|
1762
|
+
variant,
|
|
1763
|
+
sx,
|
|
1764
|
+
onChange: customOnChange,
|
|
1765
|
+
enableWarnings = process.env.NODE_ENV === "development",
|
|
1766
|
+
...rest
|
|
1767
|
+
} = props;
|
|
1768
|
+
const {
|
|
1769
|
+
type,
|
|
1770
|
+
required,
|
|
1771
|
+
helperText,
|
|
1772
|
+
inputRef,
|
|
1773
|
+
onBlur,
|
|
1774
|
+
disabled,
|
|
1775
|
+
...restTextProps
|
|
1776
|
+
} = textFieldProps;
|
|
1777
|
+
const {
|
|
1778
|
+
field,
|
|
1779
|
+
fieldState: { error }
|
|
1780
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1781
|
+
name,
|
|
1782
|
+
control,
|
|
1783
|
+
rules
|
|
1784
|
+
});
|
|
1785
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1786
|
+
const { value, onChange } = _chunkHEHPKM4Bcjs.useEnhancedTransform.call(void 0, {
|
|
1787
|
+
value: field.value,
|
|
1788
|
+
onChange: field.onChange,
|
|
1789
|
+
transform: transform ? {
|
|
1790
|
+
input: transform.input,
|
|
1791
|
+
output: transform.output
|
|
1792
|
+
} : void 0,
|
|
1793
|
+
fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
|
|
1794
|
+
// Auto-detect number type
|
|
1795
|
+
defaultValue,
|
|
1796
|
+
enableWarnings
|
|
1797
|
+
});
|
|
1798
|
+
const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
|
|
1799
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1800
|
+
TextFieldComponent,
|
|
1801
|
+
{
|
|
1802
|
+
...rest,
|
|
1803
|
+
...restTextProps,
|
|
1804
|
+
name: field.name,
|
|
1805
|
+
value,
|
|
1806
|
+
onChange: (event) => {
|
|
1807
|
+
onChange(event);
|
|
1808
|
+
if (typeof customOnChange === "function") {
|
|
1809
|
+
customOnChange(event);
|
|
1810
|
+
}
|
|
1811
|
+
},
|
|
1812
|
+
onBlur: (event) => {
|
|
1813
|
+
field.onBlur();
|
|
1814
|
+
if (typeof onBlur === "function") {
|
|
1815
|
+
onBlur(event);
|
|
1816
|
+
}
|
|
1817
|
+
},
|
|
1818
|
+
disabled,
|
|
1819
|
+
label,
|
|
1820
|
+
placeholder,
|
|
1821
|
+
fullWidth: true,
|
|
1822
|
+
required,
|
|
1823
|
+
type,
|
|
1824
|
+
error: !!error,
|
|
1825
|
+
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
1826
|
+
inputRef: handleInputRef,
|
|
1827
|
+
variant: variant ? variant : "outlined",
|
|
1828
|
+
size: "small",
|
|
1829
|
+
sx: {
|
|
1830
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1831
|
+
"& .MuiInputBase-input": {
|
|
1832
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1833
|
+
},
|
|
1834
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
1835
|
+
...sx
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
);
|
|
1839
|
+
};
|
|
1840
|
+
var EnhancedTextFieldElement2 = ({
|
|
1841
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1842
|
+
...props
|
|
1843
|
+
}) => {
|
|
1844
|
+
if (gridProps) {
|
|
1845
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1846
|
+
_material.Grid,
|
|
1847
|
+
{
|
|
1848
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1849
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component9, { ...props })
|
|
1850
|
+
}
|
|
1851
|
+
);
|
|
1852
|
+
}
|
|
1853
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component9, { ...props });
|
|
1854
|
+
};
|
|
1855
|
+
EnhancedTextFieldElement2.displayName = "EnhancedTextFieldElement";
|
|
1856
|
+
|
|
1857
|
+
// src/wrappers/TimePickerElement/TimePickerElement.tsx
|
|
1858
|
+
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
|
|
1864
|
+
function readValueAsDate(adapter, value) {
|
|
1865
|
+
if (typeof value === "string") {
|
|
1866
|
+
if (value === "") {
|
|
1867
|
+
return null;
|
|
1868
|
+
}
|
|
1869
|
+
return adapter.utils.date(value);
|
|
1870
|
+
}
|
|
1871
|
+
return value;
|
|
1872
|
+
}
|
|
1873
|
+
function useTransform2(options) {
|
|
1874
|
+
const value = typeof _optionalChain([options, 'access', _25 => _25.transform, 'optionalAccess', _26 => _26.input]) === "function" ? options.transform.input(options.value) : options.value;
|
|
1875
|
+
const onChange = _react.useCallback.call(void 0,
|
|
1876
|
+
(eventOrValue, value2) => {
|
|
1877
|
+
if (typeof _optionalChain([options, 'access', _27 => _27.transform, 'optionalAccess', _28 => _28.output]) === "function") {
|
|
1878
|
+
options.onChange(options.transform.output(eventOrValue, value2));
|
|
1879
|
+
} else {
|
|
1880
|
+
options.onChange(eventOrValue);
|
|
1881
|
+
}
|
|
1882
|
+
},
|
|
1883
|
+
[options]
|
|
1884
|
+
);
|
|
1885
|
+
return {
|
|
1886
|
+
value,
|
|
1887
|
+
onChange
|
|
1888
|
+
};
|
|
1889
|
+
}
|
|
1890
|
+
var Component10 = function TimePickerElement(props) {
|
|
1891
|
+
const {
|
|
1892
|
+
name,
|
|
1893
|
+
required,
|
|
1894
|
+
inputProps,
|
|
1895
|
+
control,
|
|
1896
|
+
textReadOnly,
|
|
1897
|
+
label,
|
|
1898
|
+
placeholder,
|
|
1899
|
+
slotProps,
|
|
1900
|
+
timePickerProps = {},
|
|
1901
|
+
transform,
|
|
1902
|
+
sx,
|
|
1903
|
+
...rest
|
|
1904
|
+
} = props;
|
|
1905
|
+
const adapter = _internals.useLocalizationContext.call(void 0, );
|
|
1906
|
+
const theme = _material.useTheme.call(void 0, );
|
|
1907
|
+
const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
|
|
1908
|
+
const {
|
|
1909
|
+
field,
|
|
1910
|
+
fieldState: { error }
|
|
1911
|
+
} = _reacthookform.useController.call(void 0, {
|
|
1912
|
+
name,
|
|
1913
|
+
control,
|
|
1914
|
+
defaultValue: null
|
|
1915
|
+
});
|
|
1916
|
+
const { value, onChange } = useTransform2({
|
|
1917
|
+
value: field.value,
|
|
1918
|
+
onChange: field.onChange,
|
|
1919
|
+
transform: {
|
|
1920
|
+
input: typeof _optionalChain([transform, 'optionalAccess', _29 => _29.input]) === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
|
|
1921
|
+
output: (eventOrValue, value2) => {
|
|
1922
|
+
const actualValue = value2 !== void 0 ? value2 : eventOrValue;
|
|
1923
|
+
if (actualValue === null) return null;
|
|
1924
|
+
return actualValue;
|
|
1925
|
+
}
|
|
1926
|
+
}
|
|
1927
|
+
});
|
|
1928
|
+
const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
|
|
1929
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1930
|
+
_xdatepickers.TimePicker,
|
|
1931
|
+
{
|
|
1932
|
+
...rest,
|
|
1933
|
+
...restTimePickerProps,
|
|
1934
|
+
...field,
|
|
1935
|
+
value,
|
|
1936
|
+
label,
|
|
1937
|
+
disabled,
|
|
1938
|
+
...timePickerProps,
|
|
1939
|
+
inputRef: handleInputRef,
|
|
1940
|
+
onClose: (...args) => {
|
|
1941
|
+
field.onBlur();
|
|
1942
|
+
if (onClose) {
|
|
1943
|
+
onClose(...args);
|
|
1944
|
+
}
|
|
1945
|
+
},
|
|
1946
|
+
onChange: (newValue, context) => {
|
|
1947
|
+
onChange(newValue, context);
|
|
1948
|
+
if (typeof timePickerProps.onChange === "function") {
|
|
1949
|
+
timePickerProps.onChange(newValue, context);
|
|
1950
|
+
}
|
|
1951
|
+
},
|
|
1952
|
+
sx: {
|
|
1953
|
+
"& .MuiOutlinedInput-root": {
|
|
1954
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
|
|
1955
|
+
},
|
|
1956
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1957
|
+
"& .MuiInputBase-input": {
|
|
1958
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1959
|
+
},
|
|
1960
|
+
...sx
|
|
1961
|
+
},
|
|
1962
|
+
slotProps: {
|
|
1963
|
+
...slotProps,
|
|
1964
|
+
actionBar: {
|
|
1965
|
+
actions: ["clear", "cancel", "accept"]
|
|
1966
|
+
},
|
|
1967
|
+
textField: {
|
|
1968
|
+
...inputProps,
|
|
1969
|
+
required,
|
|
1970
|
+
placeholder,
|
|
1971
|
+
fullWidth: true,
|
|
1972
|
+
onBlur: (event) => {
|
|
1973
|
+
field.onBlur();
|
|
1974
|
+
if (typeof _optionalChain([inputProps, 'optionalAccess', _30 => _30.onBlur]) === "function") {
|
|
1975
|
+
inputProps.onBlur(event);
|
|
1976
|
+
}
|
|
1977
|
+
},
|
|
1978
|
+
error: !!error,
|
|
1979
|
+
helperText: error ? error.message : _optionalChain([inputProps, 'optionalAccess', _31 => _31.helperText]) || rest.helperText,
|
|
1980
|
+
inputProps: {
|
|
1981
|
+
readOnly: !!textReadOnly,
|
|
1982
|
+
..._optionalChain([inputProps, 'optionalAccess', _32 => _32.inputProps])
|
|
1983
|
+
}
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
);
|
|
1988
|
+
};
|
|
1989
|
+
var TimePickerElement2 = ({
|
|
1990
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1991
|
+
...props
|
|
1992
|
+
}) => {
|
|
1993
|
+
if (gridProps) {
|
|
1994
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1995
|
+
_material.Grid,
|
|
1996
|
+
{
|
|
1997
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1998
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component10, { ...props })
|
|
1999
|
+
}
|
|
2000
|
+
);
|
|
2001
|
+
}
|
|
2002
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component10, { ...props });
|
|
2003
|
+
};
|
|
2004
|
+
TimePickerElement2.displayName = "TimePickerElement";
|
|
2005
|
+
var TimePickerElement_default = TimePickerElement2;
|
|
2006
|
+
|
|
2007
|
+
// src/wrappers/AsyncSelect/index.tsx
|
|
2008
|
+
|
|
2009
|
+
var _utils = require('@mui/material/utils');
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
|
|
2021
|
+
var Component11 = function AsyncSelectElement(props) {
|
|
2022
|
+
const {
|
|
2023
|
+
name,
|
|
2024
|
+
disabled,
|
|
2025
|
+
control,
|
|
2026
|
+
placeholder,
|
|
2027
|
+
initialValue,
|
|
2028
|
+
label,
|
|
2029
|
+
queryFn,
|
|
2030
|
+
variant,
|
|
2031
|
+
labelKey = "Label",
|
|
2032
|
+
valueKey = "Value",
|
|
2033
|
+
sx,
|
|
2034
|
+
...rest
|
|
2035
|
+
} = props;
|
|
2036
|
+
const {
|
|
2037
|
+
field,
|
|
2038
|
+
fieldState: { error }
|
|
2039
|
+
} = _reacthookform.useController.call(void 0, {
|
|
2040
|
+
name,
|
|
2041
|
+
control
|
|
2042
|
+
});
|
|
2043
|
+
const theme = _material.useTheme.call(void 0, );
|
|
2044
|
+
const [loading, setLoading] = _react.useState.call(void 0, false);
|
|
2045
|
+
const [selectedOption, setSelectedOption] = _react.useState.call(void 0, null);
|
|
2046
|
+
const [inputValue, setInputValue] = _react.useState.call(void 0, "");
|
|
2047
|
+
const inputValue2 = _react.useMemo.call(void 0, () => inputValue, [inputValue]);
|
|
2048
|
+
const setInputValue2 = _react.useCallback.call(void 0,
|
|
2049
|
+
(newValue) => setInputValue(newValue),
|
|
2050
|
+
[]
|
|
2051
|
+
);
|
|
2052
|
+
const [options, setOptions] = _react.useState.call(void 0, []);
|
|
2053
|
+
const initialValueLoaded = _react.useRef.call(void 0,
|
|
2054
|
+
!initialValue ? true : !(initialValue != null)
|
|
2055
|
+
);
|
|
2056
|
+
const fieldValue = _react.useRef.call(void 0, field.value);
|
|
2057
|
+
const fetchData = _react.useMemo.call(void 0,
|
|
2058
|
+
() => _utils.debounce.call(void 0,
|
|
2059
|
+
(payload, callback) => {
|
|
2060
|
+
queryFn(payload).then((c) => callback(c));
|
|
2061
|
+
},
|
|
2062
|
+
400
|
|
2063
|
+
),
|
|
2064
|
+
[queryFn]
|
|
2065
|
+
);
|
|
2066
|
+
const fillOptions = _react.useCallback.call(void 0, (results) => {
|
|
2067
|
+
let newOptions = [];
|
|
2068
|
+
if (selectedOption) {
|
|
2069
|
+
newOptions = [selectedOption];
|
|
2070
|
+
}
|
|
2071
|
+
if (results) {
|
|
2072
|
+
newOptions = [...newOptions, ...results];
|
|
2073
|
+
}
|
|
2074
|
+
setOptions(newOptions);
|
|
2075
|
+
setLoading(false);
|
|
2076
|
+
}, [selectedOption]);
|
|
2077
|
+
_react.useEffect.call(void 0, () => {
|
|
2078
|
+
if (initialValueLoaded.current) return void 0;
|
|
2079
|
+
let active = true;
|
|
2080
|
+
const payload = {
|
|
2081
|
+
query: null,
|
|
2082
|
+
initialValue
|
|
2083
|
+
};
|
|
2084
|
+
setLoading(true);
|
|
2085
|
+
fetchData(payload, (results) => {
|
|
2086
|
+
if (active) {
|
|
2087
|
+
if (!!results && results.length > 0) {
|
|
2088
|
+
fillOptions(_optionalChain([results, 'optionalAccess', _33 => _33.filter, 'call', _34 => _34((c) => c[valueKey] == initialValue)]));
|
|
2089
|
+
setSelectedOption(results[0]);
|
|
2090
|
+
field.onChange(results[0][valueKey]);
|
|
2091
|
+
fieldValue.current = results[0][valueKey];
|
|
2092
|
+
}
|
|
2093
|
+
initialValueLoaded.current = true;
|
|
2094
|
+
setLoading(false);
|
|
2095
|
+
}
|
|
2096
|
+
});
|
|
2097
|
+
return () => {
|
|
2098
|
+
active = false;
|
|
2099
|
+
};
|
|
2100
|
+
}, [initialValue, fetchData, field, fillOptions, valueKey]);
|
|
2101
|
+
React7.useEffect(() => {
|
|
2102
|
+
let active = true;
|
|
2103
|
+
if (inputValue2 === "" || initialValueLoaded.current === false) {
|
|
2104
|
+
setOptions(selectedOption ? [selectedOption] : []);
|
|
2105
|
+
setLoading(false);
|
|
2106
|
+
return void 0;
|
|
2107
|
+
}
|
|
2108
|
+
if (fieldValue.current) {
|
|
2109
|
+
if (field.value === fieldValue.current) {
|
|
2110
|
+
return void 0;
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
setLoading(true);
|
|
2114
|
+
const payload = {
|
|
2115
|
+
query: inputValue2,
|
|
2116
|
+
initialValue: null
|
|
2117
|
+
};
|
|
2118
|
+
fetchData(payload, (results) => {
|
|
2119
|
+
if (active) {
|
|
2120
|
+
fillOptions(results);
|
|
2121
|
+
}
|
|
2122
|
+
});
|
|
2123
|
+
return () => {
|
|
2124
|
+
active = false;
|
|
2125
|
+
};
|
|
2126
|
+
}, [initialValue, inputValue2, fetchData, field.value, fillOptions, selectedOption]);
|
|
2127
|
+
const selectRef = _react.useRef.call(void 0, null);
|
|
2128
|
+
const handleChange = (_, newSelectedOption, reason) => {
|
|
2129
|
+
if (reason === "clear") {
|
|
2130
|
+
setSelectedOption(null);
|
|
2131
|
+
field.onChange(null);
|
|
2132
|
+
setLoading(false);
|
|
2133
|
+
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
2134
|
+
if (newSelectedOption) {
|
|
2135
|
+
setSelectedOption(newSelectedOption);
|
|
2136
|
+
field.onChange(newSelectedOption[valueKey]);
|
|
2137
|
+
fieldValue.current = newSelectedOption[valueKey];
|
|
2138
|
+
setLoading(false);
|
|
2139
|
+
}
|
|
2140
|
+
}
|
|
2141
|
+
setOptions([]);
|
|
2142
|
+
setLoading(false);
|
|
2143
|
+
};
|
|
2144
|
+
_react.useEffect.call(void 0, () => {
|
|
2145
|
+
if (!field.value) {
|
|
2146
|
+
setInputValue("");
|
|
2147
|
+
setSelectedOption(null);
|
|
2148
|
+
setLoading(false);
|
|
2149
|
+
}
|
|
2150
|
+
}, [field.value]);
|
|
2151
|
+
const getOptionValue = (option) => {
|
|
2152
|
+
return option ? String(option[valueKey]) : "";
|
|
2153
|
+
};
|
|
2154
|
+
const getOptionLabel = (option) => {
|
|
2155
|
+
return option ? String(option[labelKey]) : "";
|
|
2156
|
+
};
|
|
2157
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2158
|
+
_material.Autocomplete,
|
|
2159
|
+
{
|
|
2160
|
+
...rest,
|
|
2161
|
+
ref: selectRef,
|
|
2162
|
+
fullWidth: true,
|
|
2163
|
+
loading,
|
|
2164
|
+
getOptionLabel,
|
|
2165
|
+
getOptionKey: getOptionValue,
|
|
2166
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
2167
|
+
autoComplete: true,
|
|
2168
|
+
disabled,
|
|
2169
|
+
includeInputInList: true,
|
|
2170
|
+
options,
|
|
2171
|
+
filterOptions: (x) => x,
|
|
2172
|
+
value: selectedOption,
|
|
2173
|
+
filterSelectedOptions: true,
|
|
2174
|
+
onChange: handleChange,
|
|
2175
|
+
onInputChange: (_, newInputValue) => {
|
|
2176
|
+
setInputValue2(newInputValue);
|
|
2177
|
+
},
|
|
2178
|
+
noOptionsText: "Type Something...",
|
|
2179
|
+
renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2180
|
+
_material.TextField,
|
|
2181
|
+
{
|
|
2182
|
+
...params,
|
|
2183
|
+
label,
|
|
2184
|
+
error: !!error,
|
|
2185
|
+
helperText: error ? error.message : "",
|
|
2186
|
+
placeholder,
|
|
2187
|
+
slotProps: {
|
|
2188
|
+
input: {
|
|
2189
|
+
...params.InputProps,
|
|
2190
|
+
endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _react.Fragment, { children: [
|
|
2191
|
+
loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }) : null,
|
|
2192
|
+
params.InputProps.endAdornment
|
|
2193
|
+
] })
|
|
2194
|
+
}
|
|
2195
|
+
},
|
|
2196
|
+
variant: variant ? variant : "outlined",
|
|
2197
|
+
sx: {
|
|
2198
|
+
"& .MuiInputBase-input": {
|
|
2199
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
2200
|
+
},
|
|
2201
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
2202
|
+
...sx
|
|
2203
|
+
}
|
|
2204
|
+
}
|
|
2205
|
+
),
|
|
2206
|
+
renderOption: (renderProps, option) => {
|
|
2207
|
+
const { key, ...optionProps } = renderProps;
|
|
2208
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { ...optionProps, children: option[labelKey] }, key);
|
|
2209
|
+
}
|
|
2210
|
+
}
|
|
2211
|
+
);
|
|
2212
|
+
};
|
|
2213
|
+
var AsyncSelectElement2 = ({
|
|
2214
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
2215
|
+
...props
|
|
2216
|
+
}) => {
|
|
2217
|
+
if (gridProps) {
|
|
2218
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2219
|
+
_material.Grid,
|
|
2220
|
+
{
|
|
2221
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
2222
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component11, { ...props })
|
|
2223
|
+
}
|
|
2224
|
+
);
|
|
2225
|
+
}
|
|
2226
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component11, { ...props });
|
|
2227
|
+
};
|
|
2228
|
+
AsyncSelectElement2.displayName = "AsyncSelectElement";
|
|
2229
|
+
|
|
2230
|
+
// src/wrappers/Field/index.ts
|
|
2231
|
+
var Field = {
|
|
2232
|
+
Text: TextFieldElement_default,
|
|
2233
|
+
Checkbox: CheckboxElement2,
|
|
2234
|
+
Date: DatePickerElement,
|
|
2235
|
+
RadioGroup: RadioButtonGroup_default,
|
|
2236
|
+
Password: PasswordElement_default,
|
|
2237
|
+
Time: TimePickerElement_default,
|
|
2238
|
+
Select: SelectElement_default,
|
|
2239
|
+
SelectMulti: SelectMultiElement_default,
|
|
2240
|
+
SelectCascade: SelectCascadeElement_default,
|
|
2241
|
+
AsyncSelect: AsyncSelectElement2,
|
|
2242
|
+
AsyncMultiSelect: AsyncMultiSelect2,
|
|
2243
|
+
CheckboxGroup: CheckboxGroup2
|
|
2244
|
+
};
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
|
|
2256
|
+
|
|
2257
|
+
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
|
|
2264
|
+
|
|
2265
|
+
|
|
2266
|
+
|
|
2267
|
+
|
|
2268
|
+
|
|
2269
|
+
|
|
2270
|
+
|
|
2271
|
+
|
|
2272
|
+
exports.AsyncMultiSelect2 = AsyncMultiSelect2; exports.CheckboxElement = CheckboxElement2; exports.CheckboxGroup = CheckboxGroup2; exports.readDatePickerValueAsDate = readDatePickerValueAsDate; exports.useDatePickerValue = useDatePickerValue; exports.useDatePickerValidation = useDatePickerValidation; exports.useDatePickerStyles = useDatePickerStyles; exports.DatePickerElementCore = DatePickerElementCore; exports.DatePickerElement = DatePickerElement; exports.isValidDate = isValidDate; exports.isParsableDateString = isParsableDateString; exports.createDateInputTransform = createDateInputTransform; exports.createDateOutputTransform = createDateOutputTransform; exports.createDefaultDatePickerConfig = createDefaultDatePickerConfig; exports.extractErrorMessage = extractErrorMessage; exports.createStableKey = createStableKey; exports.PasswordElement_default = PasswordElement_default; exports.RadioButtonGroup_default = RadioButtonGroup_default; exports.SelectCascadeElement_default = SelectCascadeElement_default; exports.SelectElement_default = SelectElement_default; exports.SelectMultiElement_default = SelectMultiElement_default; exports.TextFieldElement_default = TextFieldElement_default; exports.EnhancedTextFieldElement = EnhancedTextFieldElement2; exports.TimePickerElement_default = TimePickerElement_default; exports.Field = Field;
|
|
2273
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvbGlicy9HTldlYlNvZnQuVUkvcGFja2FnZXMvdWkvZGlzdC9jaHVuay1BRU9GMlRVRi5janMiLCIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdDIvQXN5bmNNdWx0aVNlbGVjdDIudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94RWxlbWVudC9DaGVja2JveEVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50Q29yZS50c3giLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJWYWxpZGF0aW9uLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJTdHlsZXMudHMiLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCIuLi9zcmMvd3JhcHBlcnMvUGFzc3dvcmRFbGVtZW50L1Bhc3N3b3JkRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvUmFkaW9CdXR0b25Hcm91cC9SYWRpb0J1dHRvbkdyb3VwLnRzeCIsIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0RWxlbWVudC9TZWxlY3RFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9TZWxlY3RNdWx0aUVsZW1lbnQvU2VsZWN0TXVsdGlFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL1RleHRGaWVsZEVsZW1lbnQvRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0ZpZWxkL2luZGV4LnRzIl0sIm5hbWVzIjpbInVzZVRoZW1lIiwidXNlQ29udHJvbGxlciIsInZhbHVlIiwianN4cyIsImpzeCIsIkNoZWNrYm94RWxlbWVudCIsIkdyaWQiLCJDb21wb25lbnQiLCJ1c2VFZmZlY3QiLCJGb3JtQ29udHJvbCIsIkZvcm1Hcm91cCIsIkZvcm1Db250cm9sTGFiZWwiLCJDaGVja2JveCIsIkNoZWNrYm94R3JvdXAiLCJUZXh0RmllbGQiLCJSYWRpb0J1dHRvbkdyb3VwIiwiQXV0b2NvbXBsZXRlIiwiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCJTZWxlY3RFbGVtZW50IiwiU2VsZWN0TXVsdGlFbGVtZW50IiwiVGV4dEZpZWxkRWxlbWVudCIsIkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCIsIlRpbWVQaWNrZXJFbGVtZW50IiwiQXN5bmNTZWxlY3RFbGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNFO0FBQ0E7QUFDRix3REFBNkI7QUFDN0I7QUFDQTtBQ0xBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBLHlDQUNLO0FBQ1AsZ0NBQXlCO0FBQ3pCLDRFQUFtRTtBQUNuRSxnREFBOEI7QUFvTGhCLCtDQUFBO0FBL0pkLElBQU0sYUFBQSxFQUErQjtBQUFBLEVBQ25DLE9BQUEsRUFBUyxDQUFDLENBQUE7QUFBQSxFQUNWLGVBQUEsRUFBaUIsQ0FBQyxDQUFBO0FBQUEsRUFDbEIsVUFBQSxFQUFZLEVBQUE7QUFBQSxFQUNaLE9BQUEsRUFBUyxLQUFBO0FB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QTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUdKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUdKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFWixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFBYztBQUNmLEVBQUE7QUFHRCxFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDRCxFQUFBO0FBR0QsRUFBQTtBQUNFLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRCxFQUFBO0FBR0QsRUFBQTtBQUNFLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0QsRUFBQTtBQUdELEVBQUE7QUFHQSxFQUFBO0FBQ0csSUFBQTtBQUNDLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0UsSUFBQTtBQUVFLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0csSUFBQTtBQUNDLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0ssSUFBQTtBQUNILElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQVksUUFBQTtBQUNBLFFBQUE7QUFDTSxRQUFBO0FBQ2lDLFFBQUE7QUFFbkQsTUFBQTtBQUFBO0FBRUEsTUFBQTtBQUFtQyxRQUFBO0FBQ3JCLFVBQUE7QUFDc0IsVUFBQTtBQUNsQixRQUFBO0FBRWxCLE1BQUE7QUFDQSxNQUFBO0FBQ0YsSUFBQTtBQUNFLEVBQUE7QUFDRixJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBQ0csSUFBQTtBQUFBLElBQUE7QUFFRSxNQUFBO0FBQ0EsTUFBQTtBQUdELE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUdBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFHQSxNQUFBO0FBR0EsTUFBQTtBQUNBLE1BQUE7QUFBK0MsSUFBQTtBQUNqRCxFQUFBO0FBRUg7QUFHRDtBTCtmTztBQUNBO0FJeG1CRDtBQXBCQTtBQVlKLEVBQUE7QUFDRSxJQUFBO0FBQ0csSUFBQTtBQUNELEVBQUE7QUFHQSxFQUFBO0FBQ0YsSUFBQTtBQUNHLE1BQUE7QUFBQSxNQUFBO0FBQUEsUUFBQTtBQUNDLFFBQUE7QUFDSSxNQUFBO0FBQ04sSUFBQTtBQUVKLEVBQUE7QUFHQSxFQUFBO0FBQ0dLLElBQUFBO0FBQUEsSUFBQTtBQUNDLE1BQUE7QUFDQyxNQUFBO0FBRUQsTUFBQTtBQUFBLFFBQUE7QUFBQyxRQUFBO0FBQUEsVUFBQTtBQUNLLFFBQUE7QUFDTixNQUFBO0FBQUEsSUFBQTtBQUNGLEVBQUE7QUFFSDtBQUdEO0FKa25CTztBQUNBO0FTcnhCQTtBQUNELEVBQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUdJLEVBQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUdJLEVBQUE7QUFFRixJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFHQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFDRixFQUFBO0FBRUEsRUFBQTtBQUNGO0FBT087QUFDRCxFQUFBO0FBQ0YsSUFBQTtBQUNGLEVBQUE7QUFHQSxFQUFBO0FBRUksRUFBQTtBQUNGLElBQUE7QUFDRixFQUFBO0FBR0EsRUFBQTtBQUVBLEVBQUE7QUFDRjtBQVVPO0FBS0wsRUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFFQSxNQUFBO0FBQ0UsUUFBQTtBQUVBLFFBQUE7QUFDRixNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUNFLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUNGLEVBQUE7QUFDRjtBQVVPO0FBS0wsRUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUdBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFFRSxNQUFBO0FBQ0UsUUFBQTtBQUNFLFVBQUE7QUFBeUIsUUFBQTtBQUczQixRQUFBO0FBQ0UsVUFBQTtBQUF1QyxRQUFBO0FBRTNDLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0YsSUFBQTtBQUNFLE1BQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUNGO0FBT087QUFDTCxFQUFBO0FBQU87QUFFTCxJQUFBO0FBQ0UsTUFBQTtBQUFXLFFBQUE7QUFFWCxNQUFBO0FBQ0EsTUFBQTtBQUFXLFFBQUE7QUFDRSxRQUFBO0FBRWIsTUFBQTtBQUNGLElBQUE7QUFBQTtBQUdBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUFBO0FBR0EsSUFBQTtBQUNFLE1BQUE7QUFB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QUNGLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRixFQUFBO0FBRUEsRUFBQTtBQUNGO0FBRU87QUFPTCxFQUFBO0FBS0EsRUFBQTtBQUVJLElBQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRSxRQUFBO0FBQ0YsTUFBQTtBQUNGLElBQUE7QUFDQyxJQUFBO0FBQ0gsRUFBQTtBQUVBLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNGLEVBQUE7QUFDRjtBQStDTWQ7QUFLSixFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBRUEsRUFBQTtBQUdBLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFTixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0UsTUFBQTtBQUlBLE1BQUE7QUFFRSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDRixNQUFBO0FBQ0YsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBRUEsRUFBQTtBQUNHLElBQUE7QUFBQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0QsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0MsTUFBQTtBQUNELE1BQUE7QUFDQSxNQUFBO0FBQ0UsUUFBQTtBQUNBLFFBQUE7QUFDRSxVQUFBO0FBQWUsUUFBQTtBQUVuQixNQUFBO0FBQ0EsTUFBQTtBQUNFLFFBQUE7QUFDQSxRQUFBO0FBQ0UsVUFBQTtBQUEwQyxRQUFBO0FBRTlDLE1BQUE7QUFDQSxNQUFBO0FBQUksUUFBQTtBQUMwQixVQUFBO0FBR3RCLFFBQUE7QUFDTixRQUFBO0FBQzRDLFFBQUE7QUFDbkIsVUFBQTtBQUNZLFFBQUE7QUFDckMsUUFBQTtBQUVGLE1BQUE7QUFDQSxNQUFBO0FBQVcsUUFBQTtBQUNOLFFBQUE7QUFDUSxVQUFBO0FBQzRCLFFBQUE7QUFDdkMsUUFBQTtBQUNXLFVBQUE7QUFDTixVQUFBO0FBQ0gsVUFBQTtBQUNBLFVBQUE7QUFDVyxVQUFBO0FBRVQsWUFBQTtBQUNBLFlBQUE7QUFDRSxjQUFBO0FBQXVCLFlBQUE7QUFDekIsVUFBQTtBQUNGLFVBQUE7QUFDUyxVQUFBO0FBRzBCLFVBQUE7QUFDdkIsWUFBQTtBQUNFLFlBQUE7QUFDRyxVQUFBO0FBQ2pCLFFBQUE7QUFFSixNQUFBO0FBQUEsSUFBQTtBQUNGLEVBQUE7QUFFSjtBQUVhcUI7QUFLWCxFQUFBO0FBQ0csRUFBQTtBQUMwRTtBQUN6RSxFQUFBO0FBQ0YsSUFBQTtBQUNHaEIsTUFBQUE7QUFBQSxNQUFBO0FBQUEsUUFBQTtBQUNzRSxRQUFBO0FBRS9DLE1BQUE7QUFDeEIsSUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBQ0Y7QUFFQWdCO0FBRU87QWpCOHNEQTtBQUNBO0FrQnQ5RFA7QUFFQTtBQUNBO0FBQ0E7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSztBQUNQO0FBOE5nQjtBQXhOVmY7QUFPSixFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUVKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFTixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0QsRUFBQTtBQUVELEVBQUE7QUFFQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNHLElBQUE7QUFDQSxJQUFBO0FBQ0gsRUFBQTtBQUNBLEVBQUE7QUFFQSxFQUFBO0FBQ0csSUFBQTtBQUNILEVBQUE7QUFFQSxFQUFBO0FBRUEsRUFBQTtBQUNFLElBQUE7QUFHTSxNQUFBO0FBR0EsUUFBQTtBQUNGLE1BQUE7QUFDQSxNQUFBO0FBQ0YsSUFBQTtBQUNELElBQUE7QUFDSCxFQUFBO0FBRUEsRUFBQTtBQUNFLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0EsSUFBQTtBQUNFLEVBQUE7QUFFSk8sRUFBQUE7QUFDRSxJQUFBO0FBRUEsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBRUEsSUFBQTtBQUNFLE1BQUE7QUFDRSxRQUFBO0FBQ0UsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUF3QyxRQUFBO0FBRzFDLFFBQUE7QUFDQSxRQUFBO0FBQ0YsTUFBQTtBQUNELElBQUE7QUFFRCxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFDRSxFQUFBO0FBRUUsRUFBQTtBQUNKLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFFQSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNFLFFBQUE7QUFDRixNQUFBO0FBQ0QsSUFBQTtBQUVELElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUNFLEVBQUE7QUFFSixFQUFBO0FBRUEsRUFBQTtBQUtFLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRixJQUFBO0FBQ0UsTUFBQTtBQUNFLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDRixNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDQSxJQUFBO0FBQ0YsRUFBQTtBQUVBQSxFQUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRixJQUFBO0FBQ0UsRUFBQTtBQUVKLEVBQUE7QUFDRSxJQUFBO0FBQ0YsRUFBQTtBQUVBLEVBQUE7QUFDRSxJQUFBO0FBQ0YsRUFBQTtBQUVBLEVBQUE7QUFDR1EsSUFBQUE7QUFBQSxJQUFBO0FBQ0UsTUFBQTtBQUNELE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUdBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNFLFFBQUE7QUFDRixNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRSxRQUFBO0FBQUMsUUFBQTtBQUFBLFVBQUE7QUFDSyxVQUFBO0FBQ0osVUFBQTtBQUNTLFVBQUE7QUFDMkIsVUFBQTtBQUNwQyxVQUFBO0FBQ1csWUFBQTtBQUNGLGNBQUE7QUFDSyxjQUFBO0FBR0wsZ0JBQUE7QUFFRyxnQkFBQTtBQUNlLGNBQUE7QUFDckIsWUFBQTtBQUVKLFVBQUE7QUFDRixVQUFBO0FBQzZCLFVBQUE7QUFDekIsWUFBQTtBQUN1QixjQUFBO0FBQ1ksWUFBQTtBQUNyQyxZQUFBO0FBR0ksWUFBQTtBQUNELFVBQUE7QUFDTCxRQUFBO0FBQ0YsTUFBQTtBQUVGLE1BQUE7QUFDRSxRQUFBO0FBRUEsUUFBQTtBQUtGLE1BQUE7QUFBQSxJQUFBO0FBQ0YsRUFBQTtBQUVKO0FBRU1PO0FBT0osRUFBQTtBQUNHLEVBQUE7QUFPcUI7QUFDcEIsRUFBQTtBQUNGLElBQUE7QUFDR2pCLE1BQUFBO0FBQUEsTUFBQTtBQUFBLFFBQUE7QUFDc0UsUUFBQTtBQUVLLE1BQUE7QUFDNUUsSUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBQ0Y7QUFFQWlCO0FsQjI0RE87QUFDQTtBbUJ4cUVEO0FBQ0osRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0Y7QW5CMHFFTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIvYnVpbGRzL2xpYnMvR05XZWJTb2Z0LlVJL3BhY2thZ2VzL3VpL2Rpc3QvY2h1bmstQUVPRjJUVUYuY2pzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWR1Y2VyLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHMsIEFzeW5jU2VsZWN0MlBheWxvYWQsIE9wdGlvbjJJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIENvbXBvbmVudFN0YXRlIHtcbiAgb3B0aW9uczogT3B0aW9uMkl0ZW1bXTtcbiAgc2VsZWN0ZWRPcHRpb25zOiBPcHRpb24ySXRlbVtdO1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIGluaXRpYWxMb2FkZWQ6IGJvb2xlYW47XG59XG5cbnR5cGUgQ29tcG9uZW50QWN0aW9uID1cbiAgfCB7IHR5cGU6IFwiU0VUX09QVElPTlNcIjsgcGF5bG9hZDogT3B0aW9uMkl0ZW1bXSB9XG4gIHwgeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCI7IHBheWxvYWQ6IE9wdGlvbjJJdGVtW10gfVxuICB8IHsgdHlwZTogXCJTRVRfSU5QVVRfVkFMVUVcIjsgcGF5bG9hZDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiU0VUX0xPQURJTkdcIjsgcGF5bG9hZDogYm9vbGVhbiB9XG4gIHwgeyB0eXBlOiBcIlNFVF9JTklUSUFMX0xPQURFRFwiOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiUkVTRVRfT1BUSU9OU1wiIH07XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogQ29tcG9uZW50U3RhdGUgPSB7XG4gIG9wdGlvbnM6IFtdLFxuICBzZWxlY3RlZE9wdGlvbnM6IFtdLFxuICBpbnB1dFZhbHVlOiBcIlwiLFxuICBsb2FkaW5nOiBmYWxzZSxcbiAgaW5pdGlhbExvYWRlZDogZmFsc2UsXG59O1xuXG5mdW5jdGlvbiBjb21wb25lbnRSZWR1Y2VyKHN0YXRlOiBDb21wb25lbnRTdGF0ZSwgYWN0aW9uOiBDb21wb25lbnRBY3Rpb24pOiBDb21wb25lbnRTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFwiU0VUX09QVElPTlNcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBvcHRpb25zOiBhY3Rpb24ucGF5bG9hZCwgbG9hZGluZzogZmFsc2UgfTtcbiAgICBjYXNlIFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBzZWxlY3RlZE9wdGlvbnM6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlNFVF9JTlBVVF9WQUxVRVwiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGlucHV0VmFsdWU6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlNFVF9MT0FESU5HXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgbG9hZGluZzogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0lOSVRJQUxfTE9BREVEXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5pdGlhbExvYWRlZDogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiUkVTRVRfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIG9wdGlvbnM6IHN0YXRlLnNlbGVjdGVkT3B0aW9ucyB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuY29uc3QgQXN5bmNNdWx0aVNlbGVjdDJDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPih7XG4gIG5hbWUsXG4gIGNvbnRyb2wsXG4gIHBsYWNlaG9sZGVyLFxuICBpbml0aWFsVmFsdWVzLFxuICBsYWJlbCxcbiAgcXVlcnlGbixcbiAgdmFyaWFudCA9IFwib3V0bGluZWRcIixcbiAgc3gsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGRlYm91bmNlTXMgPSA0MDAsXG4gIGxvYWRpbmdUZXh0ID0gXCJMb2FkaW5nLi4uXCIsXG4gIG5vT3B0aW9uc1RleHQgPSBcIk5vIG9wdGlvbnNcIixcbiAgcmVuZGVySW5wdXQsXG4gIC4uLnJlc3Rcbn06IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgY29uc3QgW3N0YXRlLCBkaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKGNvbXBvbmVudFJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBkZWJvdW5jZWRGZXRjaCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKGFzeW5jIChwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5Rm4ocGF5bG9hZCk7XG5cbiAgICAgICAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIHdpdGggc2VhcmNoIHJlc3VsdHMsIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gW1xuICAgICAgICAgICAgLi4uc3RhdGUuc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgLi4ucmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChvcHRpb24pID0+ICFzdGF0ZS5zZWxlY3RlZE9wdGlvbnMuc29tZSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLnZhbHVlID09PSBvcHRpb24udmFsdWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX09QVElPTlNcIiwgcGF5bG9hZDogbWVyZ2VkT3B0aW9ucyB9KTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBkZWJvdW5jZU1zKSxcbiAgICBbcXVlcnlGbiwgc3RhdGUuc2VsZWN0ZWRPcHRpb25zLCBkZWJvdW5jZU1zXVxuICApO1xuXG4gIC8vIExvYWQgaW5pdGlhbCB2YWx1ZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWluaXRpYWxWYWx1ZXM/Lmxlbmd0aCB8fCBzdGF0ZS5pbml0aWFsTG9hZGVkKSByZXR1cm47XG5cbiAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgfTtcblxuICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCIsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiLCBwYXlsb2FkOiByZXN1bHRzIH0pO1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0lOSVRJQUxfTE9BREVEXCIsIHBheWxvYWQ6IHRydWUgfSk7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdHMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkpO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgfSkuY2F0Y2goKF9lcnJvcikgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9LCBbaW5pdGlhbFZhbHVlcywgc3RhdGUuaW5pdGlhbExvYWRlZCwgcXVlcnlGbiwgZmllbGRdKTtcblxuICAvLyBIYW5kbGUgc2VhcmNoIGlucHV0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGlmIChzdGF0ZS5pbnB1dFZhbHVlID09PSBcIlwiKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiUkVTRVRfT1BUSU9OU1wiIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IHN0YXRlLmlucHV0VmFsdWUsXG4gICAgICBpbml0aWFsVmFsdWVzOiBudWxsLFxuICAgIH07XG5cbiAgICBkZWJvdW5jZWRGZXRjaChwYXlsb2FkKTtcbiAgfSwgW3N0YXRlLmlucHV0VmFsdWUsIHN0YXRlLmluaXRpYWxMb2FkZWQsIGRlYm91bmNlZEZldGNoXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3VmFsdWU6IE9wdGlvbjJJdGVtW10pID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiLCBwYXlsb2FkOiBuZXdWYWx1ZSB9KTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpKTtcbiAgICB9LFxuICAgIFtmaWVsZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuU3ludGhldGljRXZlbnQsIG5ld0lucHV0VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9JTlBVVF9WQUxVRVwiLCBwYXlsb2FkOiBuZXdJbnB1dFZhbHVlIH0pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IE9wdGlvbjJJdGVtLCB2YWx1ZTogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUudmFsdWUsXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKChvcHRpb246IE9wdGlvbjJJdGVtKSA9PiBvcHRpb24ubGFiZWwsIFtdKTtcblxuICBjb25zdCBkZWZhdWx0UmVuZGVySW5wdXQgPSB1c2VDYWxsYmFjayhcbiAgICAocGFyYW1zOiBQYXJhbWV0ZXJzPFJlcXVpcmVkPEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM+W1wicmVuZGVySW5wdXRcIl0+WzBdKSA9PiAoXG4gICAgICA8VGV4dEZpZWxkXG4gICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICB2YXJpYW50PXt2YXJpYW50fVxuICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgaGVscGVyVGV4dD17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtzdGF0ZS5sb2FkaW5nICYmIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPn1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIC4uLnN4LFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICApLFxuICAgIFtsYWJlbCwgcGxhY2Vob2xkZXIsIHZhcmlhbnQsIGVycm9yLCBzdGF0ZS5sb2FkaW5nLCBkaXNhYmxlZCwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLCBzeF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICBvcHRpb25zPXtzdGF0ZS5vcHRpb25zfVxuICAgICAgdmFsdWU9e3N0YXRlLnNlbGVjdGVkT3B0aW9uc31cbiAgICAgIGxvYWRpbmc9e3N0YXRlLmxvYWRpbmd9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgIGxvYWRpbmdUZXh0PXtsb2FkaW5nVGV4dH1cbiAgICAgIG5vT3B0aW9uc1RleHQ9e25vT3B0aW9uc1RleHR9XG4gICAgICByZW5kZXJJbnB1dD17cmVuZGVySW5wdXQgfHwgZGVmYXVsdFJlbmRlcklucHV0fVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jTXVsdGlTZWxlY3QyID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz5cbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBBc3luY011bHRpU2VsZWN0MlByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8QXN5bmNNdWx0aVNlbGVjdDJDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cbkFzeW5jTXVsdGlTZWxlY3QyLmRpc3BsYXlOYW1lID0gXCJBc3luY011bHRpU2VsZWN0MlwiO1xuXG5leHBvcnQgeyBBc3luY011bHRpU2VsZWN0MiB9O1xuIiwiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZVxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihcbiAgcHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG4gICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0ub3V0cHV0IShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG4gICAgICAgICAgICAgIHJldHVybiBjaGVja2VkIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgY2hlY2tlZDogYm9vbGVhbikgPT4ge1xuICAgIG9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8IFwiXCJ9XG4gICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCBcInByaW1hcnlcIn1cbiAgICAgICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzeCkgPyBzeCA6IFtzeF0pLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpblxuICAgICAgICAgICAgICAgICAgICA6IGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgXCImLk11aS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4gey4uLnByb3BzfSAvPjtcbn07XG5cbkNoZWNrYm94RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiQ2hlY2tib3hFbGVtZW50XCI7XG5cbmV4cG9ydCB7IENoZWNrYm94RWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5leHBvcnQgdHlwZSBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgbnVtYmVyW10gPSBudW1iZXJbXVxuPiA9IE9taXQ8Q2hlY2tib3hQcm9wcywgXCJuYW1lXCI+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWw/OiBGb3JtQ29udHJvbExhYmVsUHJvcHNbXCJsYWJlbFwiXTtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCBcImxhYmVsXCIgfCBcImNvbnRyb2xcIj47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgb3B0aW9uczogQXJyYXk8eyBWYWx1ZTogbnVtYmVyOyBMYWJlbDogc3RyaW5nIH0+O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hHcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+KHByb3BzOiBDaGVja2JveEdyb3VwUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7IG5hbWUsIGNvbnRyb2wsIGxhYmVsLCBsYWJlbFByb3BzLCBpbnB1dFJlZiwgb3B0aW9ucywgLi4ucmVzdCB9ID1cbiAgICBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkOiByZXN0LmRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCBbc2VsZWN0ZWRWYWx1ZXMsIHNldFNlbGVjdGVkVmFsdWVzXSA9IHVzZVN0YXRlPG51bWJlcltdPihcbiAgICBvcHRpb25zLmZpbHRlcigoYykgPT4gZmllbGQudmFsdWU/LmluY2x1ZGVzKGMuVmFsdWUpKS5tYXAoKGMpID0+IGMuVmFsdWUpIHx8XG4gICAgW11cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGZpZWxkLm9uQ2hhbmdlKHNlbGVjdGVkVmFsdWVzID8gWy4uLnNlbGVjdGVkVmFsdWVzXSA6IFtdKTtcbiAgfSwgW3NlbGVjdGVkVmFsdWVzXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKFsuLi5zZWxlY3RlZFZhbHVlcywgdmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMoc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB2YWx1ZSkpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAga2V5PXtgJHtvcHRpb24uVmFsdWV9YH1cbiAgICAgICAgICAgIGxhYmVsPXtvcHRpb24uTGFiZWx9XG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCBcInByaW1hcnlcIn1cbiAgICAgICAgICAgICAgICBzeD17W1xuICAgICAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkocmVzdC5zeCkgPyByZXN0LnN4IDogW3Jlc3Quc3hdKSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gXCJlcnJvci5tYWluXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbi5WYWx1ZX1cbiAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyhvcHRpb24uVmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IENoZWNrYm94R3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgbnVtYmVyW10gPSBudW1iZXJbXVxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuQ2hlY2tib3hHcm91cC5kaXNwbGF5TmFtZSA9IFwiQ2hlY2tib3hHcm91cFwiO1xuXG5leHBvcnQgeyBDaGVja2JveEdyb3VwIH07XG5cbiIsImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIPCfjq8gKipUeXBlIFNhZmV0eSoqOiBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzIGFuZCBkYXRlIHZhbHVlc1xuICogLSDwn5SnICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0g8J+OqCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSDimb8gKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSDwn5qAICoqUGVyZm9ybWFuY2UqKjogT3B0aW1pemVkIHdpdGggbWVtb2l6YXRpb24gYW5kIGVmZmljaWVudCByZS1yZW5kZXJpbmdcbiAqIC0g8J+TsSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0g8J+boe+4jyAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIPCflIQgKipUcmFuc2Zvcm1hdGlvbioqOiBGbGV4aWJsZSB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIPCfk5ogKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsImltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgRGF0ZVBpY2tlciB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGggfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7XG4gIHVzZURhdGVQaWNrZXJWYWx1ZSxcbiAgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24sXG4gIHVzZURhdGVQaWNrZXJTdHlsZXMsXG59IGZyb20gXCIuL2hvb2tzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUaGUgY29yZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aG91dCBHcmlkIHdyYXBwZXIuXG4gKlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0LCBwZXJmb3JtYW50IGRhdGUgcGlja2VyIGNvbXBvbmVudCB0aGF0IGludGVncmF0ZXMgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0gd2hpbGUgcHJvdmlkaW5nIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0IGFuZFxuICogYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlc1xuICogLSBBdXRvbWF0aWMgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gVGhlbWUtYXdhcmUgc3R5bGluZyB3aXRoIGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgd2l0aCBwcm9wZXIgbWVtb2l6YXRpb25cbiAqIC0gRm9yd2FyZCByZWYgc3VwcG9ydCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICByZXF1aXJlZFxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJTdGFydCBEYXRlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH19XG4gKiAgIHZhbGlkYXRpb249e3tcbiAqICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInXG4gKiAgICAgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnRDb3JlID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUsIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbikgPT4ge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgIHJ1bGVzLFxuICAgIGNvbnRyb2wsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgdmFsaWRhdGlvbixcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0UmVhZE9ubHkgPSBmYWxzZSxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICBzbG90UHJvcHMgPSB7fSxcbiAgICBkYXRlUGlja2VyUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50ID0gXCJvdXRsaW5lZFwiLFxuICAgIHN4OiBjdXN0b21TeCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICAuLi5yZXN0UHJvcHNcbiAgfSA9IHByb3BzO1xuXG4gIC8vIEV4dHJhY3QgRGF0ZVBpY2tlci1zcGVjaWZpYyBwcm9wc1xuICBjb25zdCB7XG4gICAgZGlzYWJsZWQsXG4gICAgaW5wdXRSZWY6IGV4dGVybmFsSW5wdXRSZWYsXG4gICAgb25DbG9zZSxcbiAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gIH0gPSBkYXRlUGlja2VyUHJvcHM7XG5cbiAgLy8gU2V0IHVwIGZvcm0gY29udHJvbGxlclxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBydWxlcyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgYW55LCAvLyBMZXQgcmVhY3QtaG9vay1mb3JtIGhhbmRsZSB0aGUgZGVmYXVsdCB2YWx1ZSB0eXBpbmdcbiAgfSk7XG5cbiAgLy8gVmFsdWUgdHJhbnNmb3JtYXRpb24gaG9va1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZTogb25WYWx1ZUNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAgICBmaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gIH0pO1xuXG4gIC8vIFZhbGlkYXRpb24gaG9va1xuICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAgICBmaWVsZFN0YXRlLFxuICAgIHZhbGlkYXRpb24sXG4gICAgcGFyc2VFcnJvcixcbiAgICB2YWx1ZSxcbiAgfSk7XG5cbiAgLy8gU3R5bGluZyBob29rXG4gIGNvbnN0IHsgc3g6IGNvbXB1dGVkU3gsIGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgc3g6IGN1c3RvbVN4LFxuICB9KTtcblxuICAvLyBNZXJnZSBpbnB1dCByZWZzXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGV4dGVybmFsSW5wdXRSZWYpO1xuXG4gIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICB9LFxuICAgIFtvblZhbHVlQ2hhbmdlXVxuICApO1xuXG4gIC8vIE1lbW9pemVkIGNsb3NlIGhhbmRsZXJcbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjayhcbiAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAvLyBUcmlnZ2VyIGZvcm0gZmllbGQgYmx1ciBmb3IgdmFsaWRhdGlvblxuICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZC5vbkJsdXIsIG9uQ2xvc2VdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgYmx1ciBoYW5kbGVyIGZvciB0ZXh0IGZpZWxkXG4gIGNvbnN0IGhhbmRsZVRleHRGaWVsZEJsdXIgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQmx1ciBpZiBwcm92aWRlZFxuICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICApO1xuXG4gIC8vIE1lbW9pemVkIHNsb3QgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnNsb3RQcm9wcyxcbiAgICBhY3Rpb25CYXI6IHtcbiAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwidG9kYXlcIiwgXCJjYW5jZWxcIiwgXCJhY2NlcHRcIl0gYXMgQXJyYXk8XCJhY2NlcHRcIiB8IFwiY2FuY2VsXCIgfCBcImNsZWFyXCIgfCBcIm5leHRcIiB8IFwibmV4dE9yQWNjZXB0XCIgfCBcInRvZGF5XCI+LFxuICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICB9LFxuICAgIHRleHRGaWVsZDoge1xuICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICB2YXJpYW50LFxuICAgICAgb25CbHVyOiBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgaGVscGVyVGV4dDogaGFzRXJyb3IgPyBlcnJvck1lc3NhZ2UgOiBoZWxwZXJUZXh0LFxuICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiBpbnZhbGlkLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogaGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWQsXG4gICAgICAgIC4uLmlucHV0UHJvcHMuaW5wdXRQcm9wcyxcbiAgICAgIH0sXG4gICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgaWYgcHJvdmlkZWRcbiAgICAgIC4uLihsb2FkaW5nICYmIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC4uLnNsb3RQcm9wcy50ZXh0RmllbGQsXG4gICAgfSxcbiAgfSksIFtcbiAgICBzbG90UHJvcHMsXG4gICAgaW5wdXRQcm9wcyxcbiAgICByZXF1aXJlZCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB2YXJpYW50LFxuICAgIGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgaGFzRXJyb3IsXG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIGhlbHBlclRleHQsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGludmFsaWQsXG4gICAgbmFtZSxcbiAgICBsb2FkaW5nLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gIF0pO1xuXG4gIHJldHVybiAoXG4gICAgPERhdGVQaWNrZXJcbiAgICAgIC8vIFNwcmVhZCByZXN0IHByb3BzIGZpcnN0IHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW5cbiAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICB7Li4ucmVzdERhdGVQaWNrZXJQcm9wc31cblxuICAgICAgLy8gQ29yZSBwcm9wc1xuICAgICAgcmVmPXtyZWZ9XG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuXG4gICAgICAvLyBVSSBwcm9wc1xuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgc3g9e2NvbXB1dGVkU3h9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cblxuICAgICAgLy8gU2xvdCBwcm9wc1xuICAgICAgc2xvdFByb3BzPXttZW1vaXplZFNsb3RQcm9wc31cblxuICAgICAgLy8gQWNjZXNzaWJpbGl0eSBwcm9wc1xuICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgYXJpYS1kZXNjcmliZWRieT17aGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWR9XG4gICAgLz5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBkZWJ1Z2dpbmdcbkRhdGVQaWNrZXJFbGVtZW50Q29yZS5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudENvcmU7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gIH0sIFtmaWVsZC52YWx1ZSwgdHJhbnNmb3JtPy5pbnB1dCwgYWRhcHRlcl0pO1xuXG4gIC8vIENyZWF0ZSBhIHN0YWJsZSBjaGFuZ2UgaGFuZGxlclxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtLm91dHB1dChuZXdWYWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UodHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBzdG9yZSB0aGUgZGF0ZSBhcy1pc1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsImltcG9ydCB0eXBlIHsgU3hQcm9wcywgVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBhIHZhbGlkYXRpb24gZXJyb3IgKi9cbiAgaGFzRXJyb3I/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGxvYWRpbmcgc3RhdGUgKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB0ZXh0IGlucHV0IGlzIHJlYWQtb25seSAqL1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIHN0eWxlcyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzICovXG4gIHN4PzogU3hQcm9wczxUaGVtZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgLyoqIENvbXB1dGVkIHN0eWxlcyBmb3IgdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudCAqL1xuICBzeDogU3hQcm9wczxUaGVtZT47XG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBzdHlsaW5nICovXG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyB0aGVtZS1hd2FyZSBkYXRlIHBpY2tlciBzdHlsZXMgd2l0aCBjb25zaXN0ZW50IGRlc2lnbiBzeXN0ZW0gaW50ZWdyYXRpb25cbiAqIFxuICogVGhpcyBob29rIHByb3ZpZGVzIG9wdGltaXplZCwgbWVtb2l6ZWQgc3R5bGVzIGZvciBkYXRlIHBpY2tlciBjb21wb25lbnRzIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHQgdG8gdGhlIGN1cnJlbnQgTVVJIHRoZW1lIGFuZCBjb21wb25lbnQgc3RhdGUgKGRpc2FibGVkLCBlcnJvciwgbG9hZGluZywgZXRjLikuXG4gKiBJdCBlbnN1cmVzIGNvbnNpc3RlbnQgc3R5bGluZyBhY3Jvc3MgYWxsIGRhdGUgcGlja2VyIGluc3RhbmNlcyB3aGlsZSBhbGxvd2luZyBjdXN0b21pemF0aW9uLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIGxvYWRpbmc6IGlzTG9hZGluZ1xuICogfSk7XG4gKiBcbiAqIHJldHVybiA8RGF0ZVBpY2tlciBzeD17c3h9IC4uLiAvPjtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIHN4OiB7XG4gKiAgICAgJyYgLk11aUlucHV0TGFiZWwtcm9vdCc6IHtcbiAqICAgICAgIGNvbG9yOiAncHJpbWFyeS5tYWluJ1xuICogICAgIH1cbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHBhcmFtIG9wdGlvbnMgLSBTdHlsZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIENvbXB1dGVkIHN0eWxlcyBhbmQgY2xhc3MgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJTdHlsZXMoXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zID0ge31cbik6IFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICBjb25zdCB7IGRpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5LCBzeDogY3VzdG9tU3ggfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICAvLyBNZW1vaXplIGNvbXB1dGVkIHN0eWxlcyBmb3IgcGVyZm9ybWFuY2VcbiAgY29uc3QgY29tcHV0ZWRTeCA9IHVzZU1lbW8oKCk6IFN4UHJvcHM8VGhlbWU+ID0+IHtcbiAgICBjb25zdCBiYXNlU3R5bGVzOiBTeFByb3BzPFRoZW1lPiA9IHtcbiAgICAgIC8vIElucHV0IGZpZWxkIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCBcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFRyYW5zaXRpb24gZm9yIHNtb290aCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbXG4gICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InLFxuICAgICAgICAgICdib3JkZXItY29sb3InLFxuICAgICAgICAgICdjb2xvcidcbiAgICAgICAgXSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydCxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gRXJyb3Igc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYuTXVpLWZvY3VzZWQnOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgMnB4ICR7dGhlbWUucGFsZXR0ZS5lcnJvci5tYWlufTI1YCwgLy8gMjUgaXMgMTUlIG9wYWNpdHkgaW4gaGV4XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjcsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIElucHV0IGVsZW1lbnQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICBjdXJzb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gXCJub3QtYWxsb3dlZFwiIFxuICAgICAgICAgIDogdGV4dFJlYWRPbmx5IFxuICAgICAgICAgICAgPyBcInBvaW50ZXJcIiBcbiAgICAgICAgICAgIDogXCJ0ZXh0XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBSZWFkLW9ubHkgc3BlY2lmaWMgc3R5bGluZ1xuICAgICAgICAuLi4odGV4dFJlYWRPbmx5ICYmICFkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50XCIsIC8vIEhpZGUgdGV4dCBjdXJzb3IgaW4gcmVhZC1vbmx5IG1vZGVcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZVxuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcIndhaXRcIixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBSZXF1aXJlZCBmaWVsZCBhc3RlcmlzayBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgZm9udFNpemU6IFwiMS4yZW1cIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIExhYmVsIHN0eWxpbmcgd2l0aCBiZXR0ZXIgY29udHJhc3RcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGhhc0Vycm9yIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSBwcm9wZXIgY29udHJhc3QgZm9yIGRpc2FibGVkIHN0YXRlXG4gICAgICAgIC4uLihkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5kaXNhYmxlZCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBIZWxwZXIgdGV4dCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUZvcm1IZWxwZXJUZXh0LXJvb3RcIjoge1xuICAgICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVycm9yIHN0YXRlXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBDYWxlbmRhciBpY29uIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRBZG9ybm1lbnQtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkIFxuICAgICAgICAgIDogaGFzRXJyb3IgXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS5hY3Rpb24uYWN0aXZlLFxuICAgICAgfSxcblxuICAgICAgLy8gRm9jdXMgcmluZyBmb3IgYWNjZXNzaWJpbGl0eVxuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWZvY3VzZWRcIjoge1xuICAgICAgICBvdXRsaW5lOiBgMnB4IHNvbGlkICR7dGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW59NTBgLCAvLyA1MCBpcyAzMSUgb3BhY2l0eVxuICAgICAgICBvdXRsaW5lT2Zmc2V0OiBcIjJweFwiLFxuICAgICAgfSxcblxuICAgICAgLy8gRW5oYW5jZWQgY29udHJhc3QgZm9yIGRhcmsgdGhlbWVzXG4gICAgICAuLi4odGhlbWUucGFsZXR0ZS5tb2RlID09PSAnZGFyaycgJiYge1xuICAgICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBjdXN0b20gc3R5bGVzXG4gICAgcmV0dXJuIGN1c3RvbVN4ID8gW2Jhc2VTdHlsZXMsIGN1c3RvbVN4XSBhcyBTeFByb3BzPFRoZW1lPiA6IGJhc2VTdHlsZXM7XG4gIH0sIFtcbiAgICB0aGVtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBjdXN0b21TeCxcbiAgXSk7XG5cbiAgLy8gR2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgZXh0ZXJuYWwgc3R5bGluZyBob29rc1xuICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIGlmIChkaXNhYmxlZCkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZGlzYWJsZWQnKTtcbiAgICBpZiAoaGFzRXJyb3IpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWVycm9yJyk7XG4gICAgaWYgKGxvYWRpbmcpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWxvYWRpbmcnKTtcbiAgICBpZiAodGV4dFJlYWRPbmx5KSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1yZWFkT25seScpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmxlbmd0aCA+IDAgPyBjbGFzc2VzLmpvaW4oJyAnKSA6IHVuZGVmaW5lZDtcbiAgfSwgW2Rpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5XSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzeDogY29tcHV0ZWRTeCxcbiAgICBjbGFzc05hbWUsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJTdHlsZXM7IiwiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5XCI7XG5pbXBvcnQgVmlzaWJpbGl0eU9mZiBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEljb25CdXR0b25Qcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFBhc3N3b3JkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcInBhc3N3b3JkXCIgfCBcInVzZXIuY3VycmVudFBhc3N3b3JkXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIENvbG9yIG9mIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uIGJ1dHRvblxuICAgKiBAZGVmYXVsdFZhbHVlIFwiZGVmYXVsdFwiXG4gICAqL1xuICBpY29uQ29sb3I/OiBJY29uQnV0dG9uUHJvcHNbXCJjb2xvclwiXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59O1xuXG50eXBlIFBhc3N3b3JkRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IChwYXNzd29yZCkgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBlbmRBZG9ybm1lbnQgPSAoXG4gICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPXtcImVuZFwifT5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIG9uTW91c2VEb3duPXsoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmQoIXBhc3N3b3JkKX1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICBjb2xvcj17aWNvbkNvbG9yID8/IFwiZGVmYXVsdFwifVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gXCJwYXNzd29yZFwiIDogXCJ0ZXh0XCJ9XG4gICAgICB2YWx1ZT17ZmllbGQudmFsdWV9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbnlvbmUgdXNpbmcgdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAvLyBiZWNhdXNlIG5vdyB3ZSBhcmUgcGFzc2luZyBldmVudCBpbnN0ZWFkIG9mIGV2ZW50LnRhcmdldC52YWx1ZSBvciArZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXN0Lm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHsuLi4odHlwZW9mIHNsb3RQcm9wcyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHtcbiAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1tcInNsb3RQcm9wc1wiXSxcbiAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBwYXNzd29yZCBUZXh0RmllbGQgd2l0aCBzaG93L2hpZGUgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgcGFzc3dvcmQgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIGEgYnVpbHQtaW4gdmlzaWJpbGl0eSB0b2dnbGUgYnV0dG9uLiBUaGUgcGFzc3dvcmRcbiAqIGNhbiBiZSBzaG93biBvciBoaWRkZW4gYnkgY2xpY2tpbmcgdGhlIGV5ZSBpY29uIGluIHRoZSBpbnB1dCdzIGVuZCBhZG9ybm1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIFBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSB2aXNpYmlsaXR5IGljb25zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnLFxuICogICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogOCwgbWVzc2FnZTogJ01pbmltdW0gOCBjaGFyYWN0ZXJzJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGljb24gY29sb3I6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiQ29uZmlybSBQYXNzd29yZFwiXG4gKiAgIGljb25Db2xvcj1cInByaW1hcnlcIlxuICogICBwbGFjZWhvbGRlcj1cIlJlLWVudGVyIHlvdXIgcGFzc3dvcmRcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld1Bhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJOZXcgUGFzc3dvcmRcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcmVuZGVySWNvbj17KGhpZGRlbikgPT4gaGlkZGVuID8gPEN1c3RvbUhpZGVJY29uIC8+IDogPEN1c3RvbVNob3dJY29uIC8+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5QYXNzd29yZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlBhc3N3b3JkRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBQYXNzd29yZEVsZW1lbnQ7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIFJhZGlvR3JvdXBQcm9wcyxcbiAgUmFkaW9Qcm9wcyxcbiAgR3JpZFByb3BzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgUmFkaW8sXG4gIFJhZGlvR3JvdXAsXG4gIHVzZVRoZW1lLFxuICBHcmlkXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXJcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtXCI7XG5cbi8vIFR5cGUgZm9yIHByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyByYWRpbyBidXR0b24gdmFsdWVzXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gQ29uc3RyYWludCB0byBlbnN1cmUgb3B0aW9uIG9iamVjdHMgaGF2ZSB0aGUgcmVxdWlyZWQga2V5c1xudHlwZSBPcHRpb25PYmplY3Q8XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmdcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gJlxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiaWRcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwibGFiZWxcIixcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiZGlzYWJsZWRcIlxuPiB7XG4gIG9wdGlvbnM6IFRPcHRpb25bXTtcbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcbiAgbmFtZTogVE5hbWU7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICBsYWJlbD86IHN0cmluZztcbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbiAgdHlwZT86IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCI7XG4gIGVtcHR5T3B0aW9uTGFiZWw/OiBzdHJpbmc7XG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICByZXR1cm5PYmplY3Q/OiBib29sZWFuO1xuICByb3c/OiBib29sZWFuO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsIFwibGFiZWxcIiB8IFwiY29udHJvbFwiIHwgXCJ2YWx1ZVwiPjtcbiAgZm9ybUxhYmVsUHJvcHM/OiBPbWl0PEZvcm1MYWJlbFByb3BzLCBcInJlcXVpcmVkXCIgfCBcImVycm9yXCI+O1xuICByYWRpb1Byb3BzPzogUmFkaW9Qcm9wcztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE9wdGlvbltUVmFsdWVLZXldO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogaW1wb3J0KFwiLi4vLi4vdHlwZXMvZXZlbnRzXCIpLkV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4ocHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5Pikge1xuICBjb25zdCB7XG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBuYW1lLFxuICAgIGxhYmVsS2V5ID0gXCJsYWJlbFwiIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9IFwiaWRcIiBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSBcImRpc2FibGVkXCIgYXMgVERpc2FibGVkS2V5LFxuICAgIHJlcXVpcmVkLFxuICAgIGVtcHR5T3B0aW9uTGFiZWwsXG4gICAgcmV0dXJuT2JqZWN0LFxuICAgIHJvdyxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHx8IChcIlwiIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1tcIm9uQ2hhbmdlXCJdID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKChvcHRpb24pID0+IG9wdGlvblt2YWx1ZUtleV0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVLZXldO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbkRpc2FibGVkID0gb3B0aW9uW2Rpc2FibGVkS2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICBsZXQgdmFsOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCB1bmRlZmluZWQgPSByZXR1cm5PYmplY3RcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIFRPcHRpb24pPy5bdmFsdWVLZXldXG4gICAgICAgICAgICA6IHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSBcIm51bWJlclwiICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIodmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImJvb2xlYW5cIiAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9uRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uS2V5fVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+IHsuLi5wcm9wc30gLz47XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gXCJSYWRpb0J1dHRvbkdyb3VwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFJhZGlvQnV0dG9uR3JvdXA7XG4iLCJpbXBvcnQge1xuICBHcmlkLFxuICB1c2VUaGVtZSxcbiAgVGV4dEZpZWxkLFxuICB0eXBlIFN4UHJvcHMsXG4gIEF1dG9jb21wbGV0ZSxcbiAgdHlwZSBHcmlkUHJvcHMsXG4gIHR5cGUgQ2hpcFR5cGVNYXAsXG4gIHR5cGUgVGV4dEZpZWxkUHJvcHMsXG4gIHR5cGUgVGV4dEZpZWxkVmFyaWFudHMsXG4gIHR5cGUgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb250cm9sLFxuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbiAgdHlwZSBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnIHwgJ2dldE9wdGlvbkxhYmVsJyB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzeD86IFN4UHJvcHM7XG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIGxhYmVsS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG59O1xuXG50eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50Q29tcG9uZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oXG4gIHByb3BzOiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnLFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zLFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgc3gsXG4gICAgaXNFZGl0ID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3QgZ2V0T3B0aW9uS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpIHJldHVybiBvcHRpb247XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXkgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlS2V5XVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleSBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmPFRPcHRpb24+KGRlcGVuZGVudEZpZWxkLnZhbHVlID8/IG51bGwpO1xuICBjb25zdCBbaGFzQXV0b1NlbGVjdGVkLCBzZXRIYXNBdXRvU2VsZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgKCEhZGVwZW5kZW50RmllbGQudmFsdWUgJiYgcGFyZW50VmFsdWVSZWY/LmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IG51bGxcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtkZXBlbmRlbnRGaWVsZC52YWx1ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzRWRpdCAmJiAhZGlzYWJsZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgICAgIHNldEhhc0F1dG9TZWxlY3RlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGZpZWxkLnZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGhhc0F1dG9TZWxlY3RlZCxcbiAgICBpc0VkaXQsXG4gICAgZGlzYWJsZWQsXG4gICAgZmllbGQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGRlcGVuZGVudEZpZWxkLm9uQ2hhbmdlLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiAoZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGZpZWxkLnZhbHVlID8gb3B0aW9uIDogbnVsbCkpXG4gICAgICAgICAgLmZpbmQoQm9vbGVhbikgfHwgbnVsbFxuICAgICAgfVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsIHx8IGRpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSA/IGdldE9wdGlvbktleShuZXdWYWx1ZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdCc6IHtcbiAgICAgICAgICAgICAgYmdjb2xvcjpcbiAgICAgICAgICAgICAgICBkaXNhYmxlZCB8fCBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrJzogeyBjb2xvcjogJ3JlZCcgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dEJhc2UtaW5wdXQnOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgfHwgZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCA/ICdub3QtYWxsb3dlZCcgOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RDYXNjYWRlRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdENhc2NhZGVFbGVtZW50O1xuIiwiaW1wb3J0IHsgR3JpZCwgdXNlVGhlbWUsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgU3hQcm9wcyxcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlVmFsdWUsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbiAgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmcsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICB1c2VNZW1vLFxuICB0eXBlIEpTWCxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgdHlwZSBTeW50aGV0aWNFdmVudCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnRyb2wsXG4gIHVzZUNvbnRyb2xsZXIsXG4gIHR5cGUgRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkVmFsdWVzLFxuICB0eXBlIFVzZUNvbnRyb2xsZXJQcm9wcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgU2VsZWN0RWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwW1wiZGVmYXVsdENvbXBvbmVudFwiXVxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgXCJuYW1lXCJcbiAgfCBcInJlbmRlcklucHV0XCJcbiAgfCBcImlzT3B0aW9uRXF1YWxUb1ZhbHVlXCJcbiAgfCBcImdldE9wdGlvbkxhYmVsXCJcbiAgfCBcImRpc2FibGVkXCJcbj4gJiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZmllbGRcbiAgICogQGV4YW1wbGUgeyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYW4gb3B0aW9uJyB9XG4gICAqL1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJjYXRlZ29yeVwiIHwgXCJ1c2VyLmRlcGFydG1lbnRcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIHNlbGVjdCBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkNob29zZSBhbiBvcHRpb24uLi5cIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkNhdGVnb3J5XCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gZWRpdCBtb2RlIChhZmZlY3RzIGF1dG8tc2VsZWN0aW9uIGJlaGF2aW9yKVxuICAgKiBXaGVuIGZhbHNlIGFuZCBvbmx5IG9uZSBvcHRpb24gZXhpc3RzLCB0aGF0IG9wdGlvbiBpcyBhdXRvLXNlbGVjdGVkXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGluIG9wdGlvbiBvYmplY3RzIHRvIHVzZSBhcyBkaXNwbGF5IGxhYmVsXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJMYWJlbFwiXG4gICAqIEBleGFtcGxlIFwibmFtZVwiIHwgXCJ0aXRsZVwiXG4gICAqL1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGluIG9wdGlvbiBvYmplY3RzIHRvIHVzZSBhcyB0aGUgdmFsdWVcbiAgICogQGRlZmF1bHRWYWx1ZSBcIlZhbHVlXCJcbiAgICogQGV4YW1wbGUgXCJpZFwiIHwgXCJjb2RlXCJcbiAgICovXG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0RWxlbWVudDxcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBpc0VkaXQsXG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBzeCxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsS2V5ID0gXCJMYWJlbFwiLFxuICAgIHZhbHVlS2V5ID0gXCJWYWx1ZVwiLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwic3RyaW5nXCIpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDsgLy8gUmV0dXJuIG51bGwgZm9yIGNvbnNpc3RlbmN5XG4gICAgfSxcbiAgICBbdmFsdWVLZXldXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxLZXldKSA6IFwiXCI7XG4gICAgfSxcbiAgICBbbGFiZWxLZXldXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIGV2ZW50OiBTeW50aGV0aWNFdmVudCxcbiAgICBuZXdWYWx1ZTogQXV0b2NvbXBsZXRlVmFsdWU8VE9wdGlvbiwgTXVsdGlwbGUsIERpc2FibGVDbGVhcmFibGUsIEZyZWVTb2xvPixcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBuZXdWYWx1ZSBhcyBUT3B0aW9uIHwgbnVsbDtcblxuICAgIGZpZWxkLm9uQ2hhbmdlKG9wdGlvbiA/IGdldE9wdGlvblZhbHVlKG9wdGlvbikgOiBudWxsKTtcbiAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgZmllbGQudmFsdWUgPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9uID0gb3B0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGdldE9wdGlvblZhbHVlKGRlZmF1bHRPcHRpb24pO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgfSwgW2lzRWRpdCwgb3B0aW9uc10pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGZpZWxkLnZhbHVlKSA/PyBudWxsLFxuICAgIFtmaWVsZC52YWx1ZSwgb3B0aW9ucywgZ2V0T3B0aW9uVmFsdWVdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9ucz17ZmFsc2V9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e1xuICAgICAgICBhdXRvY29tcGxldGVWYWx1ZSBhcyBBdXRvY29tcGxldGVWYWx1ZTxcbiAgICAgICAgICBUT3B0aW9uLFxuICAgICAgICAgIE11bHRpcGxlLFxuICAgICAgICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgICAgICAgRnJlZVNvbG9cbiAgICAgICAgPlxuICAgICAgfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXsoXG4gICAgICAgIG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPlxuICAgICAgKSA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9eyhwYXJhbXMpID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5zeCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEF1dG9jb21wbGV0ZSBjb21wb25lbnQgZm9yIHNlbGVjdGluZyBmcm9tIHByZWRlZmluZWQgb3B0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgc2VsZWN0L2F1dG9jb21wbGV0ZSBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtLCBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKiBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLiBJdCBzdXBwb3J0cyBib3RoIHNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvY29tcGxldGUgd2l0aCBmaWx0ZXJpbmdcbiAqIC0gU2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gc3VwcG9ydFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgb3B0aW9uIGRpc3BsYXkgKGxhYmVsS2V5L3ZhbHVlS2V5KVxuICogLSBBdXRvLXNlbGVjdGlvbiB3aGVuIG9ubHkgb25lIG9wdGlvbiBleGlzdHNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjYXRlZ29yeVwiXG4gKiAgIGxhYmVsPVwiQ2F0ZWdvcnlcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBMYWJlbDogJ1RlY2hub2xvZ3knLCBWYWx1ZTogJ3RlY2gnIH0sXG4gKiAgICAgeyBMYWJlbDogJ0ZpbmFuY2UnLCBWYWx1ZTogJ2ZpbmFuY2UnIH1cbiAqICAgXX1cbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnknIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGtleXM6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VySWRcIlxuICogICBsYWJlbD1cIkFzc2lnbiB0byBVc2VyXCJcbiAqICAgb3B0aW9ucz17dXNlcnN9XG4gKiAgIGxhYmVsS2V5PVwiZnVsbE5hbWVcIlxuICogICB2YWx1ZUtleT1cImlkXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJDaG9vc2UgYSB1c2VyLi4uXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTXVsdGlwbGUgc2VsZWN0aW9uOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGFnc1wiXG4gKiAgIGxhYmVsPVwiVGFnc1wiXG4gKiAgIG9wdGlvbnM9e2F2YWlsYWJsZVRhZ3N9XG4gKiAgIG11bHRpcGxlXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDggfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2VsZWN0RWxlbWVudCA9IDxcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblNlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlNlbGVjdEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0RWxlbWVudDtcbiIsImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBDaGVja2JveCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUsIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBQYXRoLCBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBVc2VDb250cm9sbGVyUHJvcHMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gQmFzZUF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgc3g/OiBTeFByb3BzO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbn07XG5cbnR5cGUgU2VsZWN0TXVsdGlFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPihwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbj4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcsXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW2xhYmVsS2V5XSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gZmllbGQuZGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHByb3BzMTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxDaGVja2JveCBpY29uPXtpY29ufSBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259IGNoZWNrZWQ9e3NlbGVjdGVkfSAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdE11bHRpRWxlbWVudDtcbiIsImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBTeFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUHJvcHNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIG1pbkxlbmd0aDogeyB2YWx1ZTogMywgbWVzc2FnZTogJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyB9IH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogaW1wb3J0KFwiLi4vLi4vdHlwZXMvZXZlbnRzXCIpLkV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsIFwibmFtZVwiPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xufVxuXG50eXBlIFRleHRGaWVsZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihcbiAgcHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBydWxlcyA9IHt9LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIGdyaWRQcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAoXCJcIiBhcyBUVmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IHZhbHVlIGZyb20gZXZlbnQgb3IgdXNlIGRpcmVjdCB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkIFxuICAgICAgICAgICAgICA/IHZhbHVlIFxuICAgICAgICAgICAgICA6ICh0eXBlb2YgZXZlbnRPclZhbHVlID09PSAnb2JqZWN0JyAmJiBldmVudE9yVmFsdWUgIT09IG51bGwgJiYgJ3RhcmdldCcgaW4gZXZlbnRPclZhbHVlICYmIHR5cGVvZiBldmVudE9yVmFsdWUudGFyZ2V0ID09PSAnb2JqZWN0JyAmJiBldmVudE9yVmFsdWUudGFyZ2V0ICE9PSBudWxsICYmICd2YWx1ZScgaW4gZXZlbnRPclZhbHVlLnRhcmdldClcbiAgICAgICAgICAgICAgICA/IChldmVudE9yVmFsdWUudGFyZ2V0IGFzIHsgdmFsdWU6IHVua25vd24gfSkudmFsdWVcbiAgICAgICAgICAgICAgICA6IGV2ZW50T3JWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHR5cGUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZFZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZFZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihleHRyYWN0ZWRWYWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHVzaW5nIHRyYW5zZm9ybS5vdXRwdXRcbiAgICAgICAgLy8gYmVjYXVzZSBub3cgd2UgYXJlIHBhc3NpbmcgZXZlbnQgaW5zdGVhZCBvZiBldmVudC50YXJnZXQudmFsdWUgb3IgK2V2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogaGVscGVyVGV4dH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHN4PXt7XG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgVGV4dEZpZWxkIHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gTnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJmaXJzdE5hbWVcIlxuICogICBsYWJlbD1cIkZpcnN0IE5hbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0ZpcnN0IG5hbWUgaXMgcmVxdWlyZWQnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgdHlwZT1cImVtYWlsXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBOdW1iZXIgaW5wdXQgd2l0aCB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgdGV4dEZpZWxkUHJvcHM9e3sgdHlwZTogJ251bWJlcicgfX1cbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWU/LnRvU3RyaW5nKCkgfHwgJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRleHRGaWVsZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlRleHRGaWVsZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dEZpZWxkRWxlbWVudDtcbiIsImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBTeFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUHJvcHNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtLCB0eXBlIEZpZWxkVHlwZSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWRcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIG1pbkxlbmd0aDogeyB2YWx1ZTogMywgbWVzc2FnZTogJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyB9IH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZpZWxkVHlwZSBmb3IgY29tbW9uIHBhdHRlcm5zIG9yIGN1c3RvbSB0cmFuc2Zvcm1zIGZvciBjb21wbGV4IGNhc2VzXG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IGltcG9ydChcIi4uLy4uL3R5cGVzL2V2ZW50c1wiKS5FdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgVGV4dEZpZWxkXG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gb25DaGFuZ2UgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdHJhbnNmb3JtYXRpb25cbiAgICovXG4gIG9uQ2hhbmdlPzogKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG50eXBlIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4oXG4gIHByb3BzOiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+KHByb3BzOiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBydWxlcyA9IHt9LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIGdyaWRQcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBydWxlcyxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtID8ge1xuICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybSA/ICh0eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogZmllbGRUeXBlKSA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgZW5hYmxlV2FybmluZ3MsXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0fVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiBcIm91dGxpbmVkXCJ9XG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgfSxcbiAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAuLi5zeCxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQW4gZW5oYW5jZWQgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogVGhpcyBlbmhhbmNlZCB2ZXJzaW9uIHByb3ZpZGVzIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3JpZ2luYWwgVGV4dEZpZWxkRWxlbWVudFxuICogcGx1cyBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcgKG51bWJlciwgdGV4dCwgZXRjLilcbiAqIC0gQmV0dGVyIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGFuZCB0eXBlIHNhZmV0eVxuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICogLSBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIGN1c3RvbSBwYXJzZUVycm9yIHN1cHBvcnRcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0IChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gRW5oYW5jZWQgVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbiAoYmFja3dhcmQgY29tcGF0aWJsZSk6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAg4pqg77iPIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5FbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQ7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdHlwZSBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxuICBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgVXNlVHJhbnNmb3JtT3B0aW9ucywgVXNlVHJhbnNmb3JtUmV0dXJuIH0gZnJvbSBcIkAvaG9va3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KFxuICBvcHRpb25zOiBVc2VUcmFuc2Zvcm1PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybS5pbnB1dChvcHRpb25zLnZhbHVlKVxuICAgICAgOiBvcHRpb25zLnZhbHVlO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShvcHRpb25zLnRyYW5zZm9ybS5vdXRwdXQoZXZlbnRPclZhbHVlLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShldmVudE9yVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVBpY2tlckVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2Vcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogVGV4dEZpZWxkUHJvcHM7XG4gIGhlbHBlclRleHQ/OiBUZXh0RmllbGRQcm9wc1tcImhlbHBlclRleHRcIl07XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidGV4dEZpZWxkXCJcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidmFsdWVcIiB8IFwic2xvdFByb3BzXCJcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBzeD86IFN4UHJvcHM7XG59XG5cbnR5cGUgVGltZVBpY2tlckVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KFxuICBwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgc3gsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IChuZXdWYWx1ZSkgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogKGV2ZW50T3JWYWx1ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gTVVJIERhdGVQaWNrZXIgcGFzc2VzICh2YWx1ZSwgY29udGV4dCksIHNvIHdlIGNoZWNrIHRoZSBzZWNvbmQgcGFyYW1cbiAgICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBldmVudE9yVmFsdWU7XG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICByZXR1cm4gYWN0dWFsVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHsuLi5maWVsZH1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHsuLi50aW1lUGlja2VyUHJvcHN9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwiY2FuY2VsXCIsIFwiYWNjZXB0XCJdLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICBvbkJsdXI6IChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBpbnB1dFByb3BzLm9uQmx1cihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICBoZWxwZXJUZXh0OiBlcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IGlucHV0UHJvcHM/LmhlbHBlclRleHQgfHwgcmVzdC5oZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiAhIXRleHRSZWFkT25seSxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lUGlja2VyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRpbWVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJUaW1lUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBUaW1lUGlja2VyRWxlbWVudDtcbiIsImltcG9ydCB7IEF1dG9jb21wbGV0ZSwgQ2lyY3VsYXJQcm9ncmVzcywgR3JpZCwgVGV4dEZpZWxkLCB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbiB9IGZyb20gXCJAbXVpL21hdGVyaWFsL0F1dG9jb21wbGV0ZVwiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQG11aS9tYXRlcmlhbC91dGlsc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyLCB0eXBlIEZpZWxkUGF0aCwgdHlwZSBGaWVsZFZhbHVlcyB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdFBheWxvYWQgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQXN5bmNTZWxlY3RFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IFwiVmFsdWVcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJMYWJlbFwiLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT5cbj4ocHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGluaXRpYWxWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBxdWVyeUZuLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxLZXkgPSBcIkxhYmVsXCIgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gXCJWYWx1ZVwiIGFzIFRWYWx1ZUtleSxcbiAgICBzeCxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFRPcHRpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlucHV0VmFsdWUyOiBzdHJpbmcgPSB1c2VNZW1vKCgpID0+IGlucHV0VmFsdWUsIFtpbnB1dFZhbHVlXSk7XG4gIGNvbnN0IHNldElucHV0VmFsdWUyID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHNldElucHV0VmFsdWUobmV3VmFsdWUpLFxuICAgIFtdXG4gICk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZUxvYWRlZCA9IHVzZVJlZjxib29sZWFuPihcbiAgICAhaW5pdGlhbFZhbHVlID8gdHJ1ZSA6ICEoaW5pdGlhbFZhbHVlICE9IG51bGwpXG4gICk7XG5cbiAgY29uc3QgZmllbGRWYWx1ZSA9IHVzZVJlZjxUT3B0aW9uW1RWYWx1ZUtleV0gfCBudWxsPihmaWVsZC52YWx1ZSk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbigoYykgPT4gY2FsbGJhY2soYykpO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgY29uc3QgZmlsbE9wdGlvbnMgPSB1c2VDYWxsYmFjaygocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgIGxldCBuZXdPcHRpb25zOiByZWFkb25seSBUT3B0aW9uW10gPSBbXTtcblxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgbmV3T3B0aW9ucyA9IFtzZWxlY3RlZE9wdGlvbl07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgIG5ld09wdGlvbnMgPSBbLi4ubmV3T3B0aW9ucywgLi4ucmVzdWx0c107XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfSwgW3NlbGVjdGVkT3B0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5pdGlhbFZhbHVlTG9hZGVkLmN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgaW5pdGlhbFZhbHVlLFxuICAgIH07XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGlmICghIXJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cz8uZmlsdGVyKChjKSA9PiBjW3ZhbHVlS2V5XSA9PSBpbml0aWFsVmFsdWUpKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihyZXN1bHRzWzBdKTtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHRzWzBdW3ZhbHVlS2V5XSk7XG4gICAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gcmVzdWx0c1swXVt2YWx1ZUtleV07XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWUsIGZldGNoRGF0YSwgZmllbGQsIGZpbGxPcHRpb25zLCB2YWx1ZUtleV0pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBpZiAoaW5wdXRWYWx1ZTIgPT09IFwiXCIgfHwgaW5pdGlhbFZhbHVlTG9hZGVkLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBzZXRPcHRpb25zKHNlbGVjdGVkT3B0aW9uID8gW3NlbGVjdGVkT3B0aW9uXSA6IFtdKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gZmllbGRWYWx1ZS5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBpbnB1dFZhbHVlMixcbiAgICAgIGluaXRpYWxWYWx1ZTogbnVsbCxcbiAgICB9O1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWUsIGlucHV0VmFsdWUyLCBmZXRjaERhdGEsIGZpZWxkLnZhbHVlLCBmaWxsT3B0aW9ucywgc2VsZWN0ZWRPcHRpb25dKTtcblxuICBjb25zdCBzZWxlY3RSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1NlbGVjdGVkT3B0aW9uOiBUT3B0aW9uIHwgbnVsbCxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSBcImNsZWFyXCIpIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gXCJzZWxlY3RPcHRpb25cIiB8fCByZWFzb24gPT09IFwicmVtb3ZlT3B0aW9uXCIpIHtcbiAgICAgIGlmIChuZXdTZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlS2V5XSk7XG4gICAgICAgIGZpZWxkVmFsdWUuY3VycmVudCA9IG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlS2V5XTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpZWxkLnZhbHVlKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKFwiXCIpO1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtmaWVsZC52YWx1ZV0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVLZXldKSA6IFwiXCI7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleV0pIDogXCJcIjtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgcmVmPXtzZWxlY3RSZWZ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvblZhbHVlfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGF1dG9Db21wbGV0ZVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaW5jbHVkZUlucHV0SW5MaXN0XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZmlsdGVyT3B0aW9ucz17KHgpID0+IHh9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4ge1xuICAgICAgICBzZXRJbnB1dFZhbHVlMihuZXdJbnB1dFZhbHVlKTtcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9eyhwYXJhbXMpID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocmVuZGVyUHJvcHMsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHJlbmRlclByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAge29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBcIlZhbHVlXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IFwiTGFiZWxcIixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+XG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPjtcbn07XG5cbkFzeW5jU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiQXN5bmNTZWxlY3RFbGVtZW50XCI7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwiaW1wb3J0IHsgQXN5bmNNdWx0aVNlbGVjdDIgfSBmcm9tIFwiLi4vQXN5bmNNdWx0aVNlbGVjdDJcIjtcbmltcG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9IGZyb20gXCIuLi9Bc3luY1NlbGVjdFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSBcIi4uL0NoZWNrYm94RWxlbWVudFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cCB9IGZyb20gXCIuLi9DaGVja2JveEdyb3VwXCI7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gXCIuLi9EYXRlUGlja2VyRWxlbWVudFwiO1xuaW1wb3J0IHsgUGFzc3dvcmRFbGVtZW50IH0gZnJvbSBcIi4uL1Bhc3N3b3JkRWxlbWVudFwiO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9IGZyb20gXCIuLi9SYWRpb0J1dHRvbkdyb3VwXCI7XG5pbXBvcnQgeyBTZWxlY3RDYXNjYWRlRWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RDYXNjYWRlRWxlbWVudFwiO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RFbGVtZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0TXVsdGlFbGVtZW50XCI7XG5pbXBvcnQgeyBUZXh0RmllbGRFbGVtZW50IH0gZnJvbSBcIi4uL1RleHRGaWVsZEVsZW1lbnRcIjtcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSBcIi4uL1RpbWVQaWNrZXJFbGVtZW50XCI7XG5cbmNvbnN0IEZpZWxkID0ge1xuICBUZXh0OiBUZXh0RmllbGRFbGVtZW50LFxuICBDaGVja2JveDogQ2hlY2tib3hFbGVtZW50LFxuICBEYXRlOiBEYXRlUGlja2VyRWxlbWVudCxcbiAgUmFkaW9Hcm91cDogUmFkaW9CdXR0b25Hcm91cCxcbiAgUGFzc3dvcmQ6IFBhc3N3b3JkRWxlbWVudCxcbiAgVGltZTogVGltZVBpY2tlckVsZW1lbnQsXG4gIFNlbGVjdDogU2VsZWN0RWxlbWVudCxcbiAgU2VsZWN0TXVsdGk6IFNlbGVjdE11bHRpRWxlbWVudCxcbiAgU2VsZWN0Q2FzY2FkZTogU2VsZWN0Q2FzY2FkZUVsZW1lbnQsXG4gIEFzeW5jU2VsZWN0OiBBc3luY1NlbGVjdEVsZW1lbnQsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jTXVsdGlTZWxlY3QyLFxuICBDaGVja2JveEdyb3VwLFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdfQ==
|