@gnwebsoft/ui 3.0.2 → 3.0.6

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.
@@ -1,2025 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-DE62KYFK.js";
5
-
6
- // src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
7
- import {
8
- Autocomplete,
9
- CircularProgress,
10
- Grid,
11
- TextField,
12
- useTheme
13
- } from "@mui/material";
14
- import { debounce } from "lodash";
15
- import { useCallback, useEffect, useReducer, useMemo } from "react";
16
- import { useController } from "react-hook-form";
17
- import { Fragment, jsx, jsxs } from "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] = useReducer(componentReducer, initialState);
60
- const theme = useTheme();
61
- const {
62
- field,
63
- fieldState: { error }
64
- } = useController({
65
- name,
66
- control
67
- });
68
- const debouncedFetch = useMemo(
69
- () => debounce(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
- useEffect(() => {
86
- if (!initialValues?.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
- useEffect(() => {
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 = useCallback(
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 = useCallback(
125
- (event, newInputValue) => {
126
- dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
127
- },
128
- []
129
- );
130
- const isOptionEqualToValue = useCallback(
131
- (option, value) => option.value === value.value,
132
- []
133
- );
134
- const getOptionLabel = useCallback((option) => option.label, []);
135
- const defaultRenderInput = useCallback(
136
- (params) => /* @__PURE__ */ jsx(
137
- TextField,
138
- {
139
- ...params,
140
- label,
141
- placeholder,
142
- variant,
143
- error: !!error,
144
- helperText: error?.message,
145
- slotProps: {
146
- input: {
147
- ...params.InputProps,
148
- endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
149
- state.loading && /* @__PURE__ */ jsx(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__ */ jsx(
166
- 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__ */ jsx(Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props }) });
191
- }
192
- return /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props });
193
- };
194
- AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
195
-
196
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
197
- import {
198
- Checkbox,
199
- FormControl,
200
- FormControlLabel,
201
- FormGroup,
202
- FormHelperText,
203
- Grid as Grid2,
204
- useTheme as useTheme2
205
- } from "@mui/material";
206
- import {
207
- useController as useController2
208
- } from "react-hook-form";
209
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
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 = useTheme2();
225
- const {
226
- field,
227
- fieldState: { error }
228
- } = useController2({
229
- name,
230
- control,
231
- disabled
232
- });
233
- const { value, onChange } = useTransform({
234
- value: field.value,
235
- onChange: field.onChange,
236
- transform: {
237
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
238
- output: typeof transform?.output === "function" ? transform.output : (checked) => checked
239
- }
240
- });
241
- const handleChange = (event, checked) => {
242
- onChange(event, checked);
243
- if (typeof customOnChange === "function") {
244
- customOnChange(event, checked);
245
- }
246
- };
247
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
248
- return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
249
- /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
250
- FormControlLabel,
251
- {
252
- label: label || "",
253
- ...labelProps,
254
- disabled,
255
- control: /* @__PURE__ */ jsx2(
256
- Checkbox,
257
- {
258
- ...rest,
259
- color: rest.color || "primary",
260
- sx: [
261
- ...Array.isArray(sx) ? sx : [sx],
262
- {
263
- color: error ? theme.palette.error.main : disabled ? theme.palette.action.disabled : void 0,
264
- "&.Mui-disabled": {
265
- color: theme.palette.action.disabled
266
- }
267
- }
268
- ],
269
- checked: value,
270
- disabled,
271
- onChange: handleChange,
272
- ref: field.ref
273
- }
274
- )
275
- }
276
- ) }),
277
- (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
278
- ] });
279
- };
280
- var CheckboxElement2 = ({
281
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
282
- ...props
283
- }) => {
284
- if (gridProps) {
285
- return /* @__PURE__ */ jsx2(
286
- Grid2,
287
- {
288
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
289
- children: /* @__PURE__ */ jsx2(Component, { ...props })
290
- }
291
- );
292
- }
293
- return /* @__PURE__ */ jsx2(Component, { ...props });
294
- };
295
- CheckboxElement2.displayName = "CheckboxElement";
296
-
297
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
298
- import {
299
- Checkbox as Checkbox2,
300
- FormControl as FormControl2,
301
- FormControlLabel as FormControlLabel2,
302
- FormGroup as FormGroup2,
303
- FormHelperText as FormHelperText2,
304
- Grid as Grid3
305
- } from "@mui/material";
306
- import { useEffect as useEffect2, useState } from "react";
307
- import {
308
- useController as useController3
309
- } from "react-hook-form";
310
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
311
- var Component2 = function CheckboxGroup(props) {
312
- const { name, control, label, labelProps, inputRef, options, ...rest } = props;
313
- const {
314
- field,
315
- fieldState: { error }
316
- } = useController3({
317
- name,
318
- control,
319
- disabled: rest.disabled
320
- });
321
- const [selectedValues, setSelectedValues] = useState(
322
- options.filter((c) => field.value?.includes(c.Value)).map((c) => c.Value) || []
323
- );
324
- useEffect2(() => {
325
- field.onChange(selectedValues ? [...selectedValues] : []);
326
- }, [selectedValues]);
327
- const handleChange = (event) => {
328
- const value = parseInt(event.target.value, 10);
329
- if (event.target.checked) {
330
- setSelectedValues([...selectedValues, value]);
331
- } else {
332
- setSelectedValues(selectedValues.filter((item) => item !== value));
333
- }
334
- };
335
- return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
336
- /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx3(
337
- FormControlLabel2,
338
- {
339
- label: option.Label,
340
- ...labelProps,
341
- control: /* @__PURE__ */ jsx3(
342
- Checkbox2,
343
- {
344
- ...rest,
345
- color: rest.color || "primary",
346
- sx: [
347
- ...Array.isArray(rest.sx) ? rest.sx : [rest.sx],
348
- {
349
- color: error ? "error.main" : void 0
350
- }
351
- ],
352
- value: option.Value,
353
- checked: selectedValues.includes(option.Value),
354
- onChange: handleChange
355
- }
356
- )
357
- },
358
- `${option.Value}`
359
- )) }),
360
- error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
361
- ] });
362
- };
363
- var CheckboxGroup2 = ({
364
- gridProps,
365
- ...props
366
- }) => {
367
- if (gridProps) {
368
- return /* @__PURE__ */ jsx3(Grid3, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
369
- }
370
- return /* @__PURE__ */ jsx3(Component2, { ...props });
371
- };
372
- CheckboxGroup2.displayName = "CheckboxGroup";
373
-
374
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
375
- import { Grid as Grid4 } from "@mui/material";
376
- import { forwardRef as forwardRef2 } from "react";
377
-
378
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
379
- import { useForkRef } from "@mui/material";
380
- import { DatePicker } from "@mui/x-date-pickers";
381
- import { forwardRef, useCallback as useCallback3, useMemo as useMemo5 } from "react";
382
- import { useController as useController4 } from "react-hook-form";
383
-
384
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
385
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
386
- import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
387
- function readDatePickerValueAsDate(adapter, value) {
388
- if (value === null || value === void 0) {
389
- return null;
390
- }
391
- if (typeof value === "string") {
392
- if (value === "") {
393
- return null;
394
- }
395
- const parsedDate = adapter.utils.date(value);
396
- return parsedDate;
397
- }
398
- return value;
399
- }
400
- function useDatePickerValue(options) {
401
- const { field, transform } = options;
402
- const adapter = useLocalizationContext();
403
- const value = useMemo2(() => {
404
- if (typeof transform?.input === "function") {
405
- return transform.input(field.value);
406
- }
407
- return readDatePickerValueAsDate(adapter, field.value);
408
- }, [field.value, transform?.input, adapter]);
409
- const onChange = useCallback2(
410
- (newValue, context) => {
411
- if (typeof transform?.output === "function") {
412
- const transformedValue = transform.output(newValue, context);
413
- field.onChange(transformedValue);
414
- } else {
415
- field.onChange(newValue);
416
- }
417
- },
418
- [field.onChange, transform?.output]
419
- );
420
- return {
421
- value,
422
- onChange
423
- };
424
- }
425
-
426
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
427
- import { useMemo as useMemo3 } from "react";
428
- var DEFAULT_ERROR_MESSAGES = {
429
- invalidDate: "Please enter a valid date",
430
- minDate: "Date must be after the minimum allowed date",
431
- maxDate: "Date must be before the maximum allowed date",
432
- disabledDate: "This date is not allowed",
433
- required: "This field is required"
434
- };
435
- function useDatePickerValidation(options) {
436
- const { fieldState, validation, parseError, value } = options;
437
- const validationResult = useMemo3(() => {
438
- const { error: fieldError, invalid } = fieldState;
439
- let currentError = fieldError;
440
- if (!fieldError && value && validation) {
441
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
442
- if (minDate && value < minDate) {
443
- currentError = {
444
- type: "minDate",
445
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
446
- };
447
- } else if (maxDate && value > maxDate) {
448
- currentError = {
449
- type: "maxDate",
450
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
451
- };
452
- } else if (shouldDisableDate && shouldDisableDate(value)) {
453
- currentError = {
454
- type: "disabledDate",
455
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
456
- };
457
- }
458
- }
459
- const hasError = Boolean(currentError);
460
- return {
461
- hasError,
462
- error: currentError,
463
- invalid: invalid || hasError
464
- };
465
- }, [fieldState, validation, value]);
466
- const errorMessage = useMemo3(() => {
467
- if (!validationResult.error) {
468
- return null;
469
- }
470
- if (parseError) {
471
- return parseError(validationResult.error);
472
- }
473
- if (typeof validationResult.error === "string") {
474
- return validationResult.error;
475
- }
476
- if ("message" in validationResult.error && validationResult.error.message) {
477
- return validationResult.error.message;
478
- }
479
- if ("type" in validationResult.error) {
480
- const errorType = validationResult.error.type;
481
- switch (errorType) {
482
- case "required":
483
- return DEFAULT_ERROR_MESSAGES.required;
484
- case "minDate":
485
- return DEFAULT_ERROR_MESSAGES.minDate;
486
- case "maxDate":
487
- return DEFAULT_ERROR_MESSAGES.maxDate;
488
- case "disabledDate":
489
- return DEFAULT_ERROR_MESSAGES.disabledDate;
490
- case "invalidDate":
491
- default:
492
- return DEFAULT_ERROR_MESSAGES.invalidDate;
493
- }
494
- }
495
- return DEFAULT_ERROR_MESSAGES.invalidDate;
496
- }, [validationResult.error, parseError]);
497
- return {
498
- ...validationResult,
499
- errorMessage
500
- };
501
- }
502
-
503
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
504
- import { useTheme as useTheme3 } from "@mui/material";
505
- import { useMemo as useMemo4 } from "react";
506
- function useDatePickerStyles(options = {}) {
507
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
508
- const theme = useTheme3();
509
- const computedSx = useMemo4(() => {
510
- const baseStyles = {
511
- // Input field styling
512
- "& .MuiOutlinedInput-root": {
513
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
514
- // Transition for smooth state changes
515
- transition: theme.transitions.create([
516
- "background-color",
517
- "border-color",
518
- "color"
519
- ], {
520
- duration: theme.transitions.duration.short
521
- }),
522
- // Error state styling
523
- ...hasError && {
524
- borderColor: theme.palette.error.main,
525
- "&:hover": {
526
- borderColor: theme.palette.error.main
527
- },
528
- "&.Mui-focused": {
529
- borderColor: theme.palette.error.main,
530
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
531
- // 25 is 15% opacity in hex
532
- }
533
- },
534
- // Loading state styling
535
- ...loading && {
536
- opacity: 0.7,
537
- pointerEvents: "none"
538
- }
539
- },
540
- // Input element styling
541
- "& .MuiInputBase-input": {
542
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
543
- // Read-only specific styling
544
- ...textReadOnly && !disabled && {
545
- cursor: "pointer",
546
- userSelect: "none",
547
- caretColor: "transparent"
548
- // Hide text cursor in read-only mode
549
- },
550
- // Loading state
551
- ...loading && {
552
- cursor: "wait"
553
- }
554
- },
555
- // Required field asterisk styling
556
- "& .MuiInputLabel-asterisk": {
557
- color: theme.palette.error.main,
558
- fontSize: "1.2em"
559
- },
560
- // Label styling with better contrast
561
- "& .MuiInputLabel-root": {
562
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
563
- // Ensure proper contrast for disabled state
564
- ...disabled && {
565
- color: theme.palette.text.disabled
566
- }
567
- },
568
- // Helper text styling
569
- "& .MuiFormHelperText-root": {
570
- marginLeft: theme.spacing(1),
571
- marginRight: theme.spacing(1),
572
- // Error state
573
- ...hasError && {
574
- color: theme.palette.error.main
575
- }
576
- },
577
- // Calendar icon styling
578
- "& .MuiInputAdornment-root": {
579
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
580
- },
581
- // Focus ring for accessibility
582
- "& .MuiOutlinedInput-root.Mui-focused": {
583
- outline: `2px solid ${theme.palette.primary.main}50`,
584
- // 50 is 31% opacity
585
- outlineOffset: "2px"
586
- },
587
- // Enhanced contrast for dark themes
588
- ...theme.palette.mode === "dark" && {
589
- "& .MuiOutlinedInput-root": {
590
- borderWidth: 2
591
- }
592
- }
593
- };
594
- return customSx ? [baseStyles, customSx] : baseStyles;
595
- }, [
596
- theme,
597
- disabled,
598
- hasError,
599
- loading,
600
- textReadOnly,
601
- customSx
602
- ]);
603
- const className = useMemo4(() => {
604
- const classes = [];
605
- if (disabled) classes.push("DatePickerElement--disabled");
606
- if (hasError) classes.push("DatePickerElement--error");
607
- if (loading) classes.push("DatePickerElement--loading");
608
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
609
- return classes.length > 0 ? classes.join(" ") : void 0;
610
- }, [disabled, hasError, loading, textReadOnly]);
611
- return {
612
- sx: computedSx,
613
- className
614
- };
615
- }
616
-
617
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
618
- import { jsx as jsx4 } from "react/jsx-runtime";
619
- var DatePickerElementCore = forwardRef((props, ref) => {
620
- const {
621
- name,
622
- required = false,
623
- rules,
624
- control,
625
- parseError,
626
- transform,
627
- validation,
628
- label,
629
- placeholder,
630
- textReadOnly = false,
631
- helperText,
632
- inputProps = {},
633
- slotProps = {},
634
- datePickerProps = {},
635
- variant = "outlined",
636
- sx: customSx,
637
- loading = false,
638
- LoadingComponent,
639
- ...restProps
640
- } = props;
641
- const {
642
- disabled,
643
- inputRef: externalInputRef,
644
- onClose,
645
- ...restDatePickerProps
646
- } = datePickerProps;
647
- const {
648
- field,
649
- fieldState
650
- } = useController4({
651
- name,
652
- control,
653
- rules,
654
- defaultValue: null
655
- // Let react-hook-form handle the default value typing
656
- });
657
- const { value, onChange: onValueChange } = useDatePickerValue({
658
- field,
659
- transform
660
- });
661
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
662
- fieldState,
663
- validation,
664
- parseError,
665
- value
666
- });
667
- const { sx: computedSx, className } = useDatePickerStyles({
668
- disabled,
669
- hasError,
670
- loading,
671
- textReadOnly,
672
- sx: customSx
673
- });
674
- const handleInputRef = useForkRef(field.ref, externalInputRef);
675
- const handleChange = useCallback3(
676
- (newValue, context) => {
677
- onValueChange(newValue, context);
678
- },
679
- [onValueChange]
680
- );
681
- const handleClose = useCallback3(
682
- (...args) => {
683
- field.onBlur();
684
- if (onClose) {
685
- onClose(...args);
686
- }
687
- },
688
- [field.onBlur, onClose]
689
- );
690
- const handleTextFieldBlur = useCallback3(
691
- (event) => {
692
- field.onBlur();
693
- if (typeof inputProps.onBlur === "function") {
694
- inputProps.onBlur(event);
695
- }
696
- },
697
- [field.onBlur, inputProps.onBlur]
698
- );
699
- const memoizedSlotProps = useMemo5(() => ({
700
- ...slotProps,
701
- actionBar: {
702
- actions: ["clear", "today", "cancel", "accept"],
703
- ...slotProps.actionBar
704
- },
705
- textField: {
706
- ...inputProps,
707
- required,
708
- placeholder,
709
- fullWidth: true,
710
- variant,
711
- onBlur: handleTextFieldBlur,
712
- error: hasError,
713
- helperText: hasError ? errorMessage : helperText,
714
- inputProps: {
715
- readOnly: textReadOnly,
716
- "aria-invalid": invalid,
717
- "aria-describedby": hasError ? `${name}-error` : void 0,
718
- ...inputProps.inputProps
719
- },
720
- // Add loading indicator if provided
721
- ...loading && LoadingComponent && {
722
- InputProps: {
723
- endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
724
- ...inputProps.InputProps
725
- }
726
- },
727
- ...slotProps.textField
728
- }
729
- }), [
730
- slotProps,
731
- inputProps,
732
- required,
733
- placeholder,
734
- variant,
735
- handleTextFieldBlur,
736
- hasError,
737
- errorMessage,
738
- helperText,
739
- textReadOnly,
740
- invalid,
741
- name,
742
- loading,
743
- LoadingComponent
744
- ]);
745
- return /* @__PURE__ */ jsx4(
746
- DatePicker,
747
- {
748
- ...restProps,
749
- ...restDatePickerProps,
750
- ref,
751
- name,
752
- value,
753
- onChange: handleChange,
754
- onClose: handleClose,
755
- inputRef: handleInputRef,
756
- label,
757
- disabled,
758
- sx: computedSx,
759
- className,
760
- slotProps: memoizedSlotProps,
761
- "aria-invalid": invalid,
762
- "aria-describedby": hasError ? `${name}-error` : void 0
763
- }
764
- );
765
- });
766
- DatePickerElementCore.displayName = "DatePickerElementCore";
767
-
768
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
769
- import { jsx as jsx5 } from "react/jsx-runtime";
770
- var DatePickerElement = forwardRef2((props, ref) => {
771
- const {
772
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
773
- ...coreProps
774
- } = props;
775
- if (gridProps === false) {
776
- return /* @__PURE__ */ jsx5(
777
- DatePickerElementCore,
778
- {
779
- ref,
780
- ...coreProps
781
- }
782
- );
783
- }
784
- return /* @__PURE__ */ jsx5(
785
- Grid4,
786
- {
787
- ref,
788
- ...gridProps,
789
- children: /* @__PURE__ */ jsx5(
790
- DatePickerElementCore,
791
- {
792
- ...coreProps
793
- }
794
- )
795
- }
796
- );
797
- });
798
- DatePickerElement.displayName = "DatePickerElement";
799
-
800
- // src/wrappers/DatePickerElement/utils.ts
801
- function isValidDate(value) {
802
- if (value === null || value === void 0) {
803
- return false;
804
- }
805
- if (value instanceof Date) {
806
- return !isNaN(value.getTime());
807
- }
808
- if (typeof value === "object" && value !== null) {
809
- if ("isValid" in value && typeof value.isValid === "function") {
810
- return value.isValid();
811
- }
812
- if ("isValid" in value && typeof value.isValid === "boolean") {
813
- return value.isValid;
814
- }
815
- }
816
- return false;
817
- }
818
- function isParsableDateString(value) {
819
- if (typeof value !== "string" || value === "") {
820
- return false;
821
- }
822
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
823
- if (isoDateRegex.test(value)) {
824
- return true;
825
- }
826
- const parsed = new Date(value);
827
- return !isNaN(parsed.getTime());
828
- }
829
- function createDateInputTransform(adapter) {
830
- return (value) => {
831
- if (value === null || value === void 0) {
832
- return null;
833
- }
834
- if (typeof value === "string") {
835
- if (value === "") {
836
- return null;
837
- }
838
- try {
839
- const parsed = adapter.utils.date(value);
840
- return isValidDate(parsed) ? parsed : null;
841
- } catch {
842
- return null;
843
- }
844
- }
845
- if (isValidDate(value)) {
846
- return value;
847
- }
848
- return null;
849
- };
850
- }
851
- function createDateOutputTransform(format) {
852
- return (value) => {
853
- if (value === null || value === void 0) {
854
- return null;
855
- }
856
- if (!isValidDate(value)) {
857
- return null;
858
- }
859
- if (!format) {
860
- return value;
861
- }
862
- try {
863
- if (value instanceof Date) {
864
- if (format === "iso") {
865
- return value.toISOString();
866
- }
867
- if (format === "date-only") {
868
- return value.toISOString().split("T")[0];
869
- }
870
- }
871
- if (typeof value.format === "function") {
872
- return value.format(format);
873
- }
874
- if (typeof value.format === "function") {
875
- return value.format(format);
876
- }
877
- if (typeof value.toFormat === "function") {
878
- return value.toFormat(format);
879
- }
880
- return value;
881
- } catch {
882
- return null;
883
- }
884
- };
885
- }
886
- function createDefaultDatePickerConfig() {
887
- return {
888
- // Default slot props for consistent behavior
889
- slotProps: {
890
- actionBar: {
891
- actions: ["clear", "today", "cancel", "accept"]
892
- },
893
- textField: {
894
- fullWidth: true,
895
- variant: "outlined"
896
- }
897
- },
898
- // Default grid props for layout consistency
899
- gridProps: {
900
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
901
- },
902
- // Default validation configuration
903
- validation: {
904
- errorMessages: {
905
- invalidDate: "Please enter a valid date",
906
- minDate: "Date must be after the minimum allowed date",
907
- maxDate: "Date must be before the maximum allowed date",
908
- disabledDate: "This date is not allowed"
909
- }
910
- }
911
- };
912
- }
913
- function extractErrorMessage(error) {
914
- if (error === null || error === void 0) {
915
- return "";
916
- }
917
- if (typeof error === "string") {
918
- return error;
919
- }
920
- if (typeof error === "object" && error !== null) {
921
- if ("message" in error && typeof error.message === "string") {
922
- return error.message;
923
- }
924
- if ("type" in error && typeof error.type === "string") {
925
- const errorType = error.type;
926
- switch (errorType) {
927
- case "invalidDate":
928
- return "Please enter a valid date";
929
- case "minDate":
930
- return "Date is too early";
931
- case "maxDate":
932
- return "Date is too late";
933
- case "disabledDate":
934
- return "This date is not available";
935
- default:
936
- return "Invalid date selection";
937
- }
938
- }
939
- }
940
- return "Invalid input";
941
- }
942
- function createStableKey(config) {
943
- try {
944
- return JSON.stringify(config, (key, value) => {
945
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
946
- const sorted = {};
947
- Object.keys(value).sort().forEach((k) => {
948
- sorted[k] = value[k];
949
- });
950
- return sorted;
951
- }
952
- return value;
953
- });
954
- } catch {
955
- return Object.keys(config).sort().join("-");
956
- }
957
- }
958
-
959
- // src/wrappers/PasswordElement/PasswordElement.tsx
960
- import Visibility from "@mui/icons-material/Visibility";
961
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
962
- import {
963
- IconButton,
964
- InputAdornment,
965
- TextField as TextField2,
966
- useForkRef as useForkRef2,
967
- Grid as Grid5
968
- } from "@mui/material";
969
- import { useState as useState2 } from "react";
970
- import {
971
- useController as useController5
972
- } from "react-hook-form";
973
- import { jsx as jsx6 } from "react/jsx-runtime";
974
- var Component3 = function PasswordEl(props) {
975
- const {
976
- type,
977
- required,
978
- iconColor,
979
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
980
- slotProps,
981
- name,
982
- control,
983
- component: TextFieldComponent = TextField2,
984
- inputRef,
985
- onBlur,
986
- ...rest
987
- } = props;
988
- const [password, setPassword] = useState2(true);
989
- const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
990
- IconButton,
991
- {
992
- onMouseDown: (e) => e.preventDefault(),
993
- onClick: () => setPassword(!password),
994
- tabIndex: -1,
995
- color: iconColor ?? "default",
996
- children: renderIcon(password)
997
- }
998
- ) });
999
- const {
1000
- field,
1001
- fieldState: { error }
1002
- } = useController5({
1003
- name,
1004
- control
1005
- });
1006
- const handleInputRef = useForkRef2(field.ref, inputRef);
1007
- return /* @__PURE__ */ jsx6(
1008
- TextField2,
1009
- {
1010
- ...rest,
1011
- inputRef: handleInputRef,
1012
- type: password ? "password" : "text",
1013
- value: field.value,
1014
- fullWidth: true,
1015
- onChange: (event) => {
1016
- field.onChange(event);
1017
- if (typeof rest.onChange === "function") {
1018
- rest.onChange(event);
1019
- }
1020
- },
1021
- onBlur: (event) => {
1022
- field.onBlur();
1023
- if (typeof onBlur === "function") {
1024
- onBlur(event);
1025
- }
1026
- },
1027
- ...typeof slotProps === "undefined" ? {
1028
- InputProps: {
1029
- endAdornment
1030
- }
1031
- } : {
1032
- slotProps: {
1033
- ...slotProps,
1034
- input: {
1035
- endAdornment,
1036
- ...slotProps?.input
1037
- }
1038
- }
1039
- },
1040
- error: !!error,
1041
- helperText: error ? error.message : ""
1042
- }
1043
- );
1044
- };
1045
- var PasswordElement = ({
1046
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1047
- ...props
1048
- }) => {
1049
- if (gridProps) {
1050
- return /* @__PURE__ */ jsx6(
1051
- Grid5,
1052
- {
1053
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1054
- children: /* @__PURE__ */ jsx6(Component3, { ...props })
1055
- }
1056
- );
1057
- }
1058
- return /* @__PURE__ */ jsx6(Component3, { ...props });
1059
- };
1060
- PasswordElement.displayName = "PasswordElement";
1061
- var PasswordElement_default = PasswordElement;
1062
-
1063
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1064
- import {
1065
- FormControl as FormControl3,
1066
- FormControlLabel as FormControlLabel3,
1067
- FormHelperText as FormHelperText3,
1068
- FormLabel,
1069
- Radio,
1070
- RadioGroup,
1071
- useTheme as useTheme4,
1072
- Grid as Grid6
1073
- } from "@mui/material";
1074
- import {
1075
- useController as useController6
1076
- } from "react-hook-form";
1077
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1078
- var Component4 = function RadioButtonGroup(props) {
1079
- const {
1080
- options,
1081
- label,
1082
- name,
1083
- labelKey = "label",
1084
- valueKey = "id",
1085
- disabledKey = "disabled",
1086
- required,
1087
- emptyOptionLabel,
1088
- returnObject,
1089
- row,
1090
- control,
1091
- type,
1092
- labelProps,
1093
- disabled,
1094
- formLabelProps,
1095
- radioProps,
1096
- transform,
1097
- ...rest
1098
- } = props;
1099
- const theme = useTheme4();
1100
- const {
1101
- field,
1102
- fieldState: { error }
1103
- } = useController6({
1104
- name,
1105
- disabled,
1106
- control
1107
- });
1108
- const { value, onChange } = useTransform({
1109
- value: field.value,
1110
- onChange: field.onChange,
1111
- transform: {
1112
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1113
- return value2 || "";
1114
- },
1115
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1116
- if (value2 && type === "number") {
1117
- return Number(value2);
1118
- }
1119
- if (value2 && type === "boolean") {
1120
- return Boolean(value2);
1121
- }
1122
- return value2;
1123
- }
1124
- }
1125
- });
1126
- const onRadioChange = (event, radioValue) => {
1127
- const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1128
- onChange(event, returnValue);
1129
- if (typeof rest.onChange === "function") {
1130
- rest.onChange(returnValue);
1131
- }
1132
- };
1133
- return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1134
- label && /* @__PURE__ */ jsx7(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
1135
- /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1136
- emptyOptionLabel && /* @__PURE__ */ jsx7(
1137
- FormControlLabel3,
1138
- {
1139
- ...labelProps,
1140
- control: /* @__PURE__ */ jsx7(
1141
- Radio,
1142
- {
1143
- ...radioProps,
1144
- sx: {
1145
- color: error ? theme.palette.error.main : void 0
1146
- },
1147
- checked: !value
1148
- }
1149
- ),
1150
- label: emptyOptionLabel,
1151
- value: ""
1152
- }
1153
- ),
1154
- options.map((option) => {
1155
- const optionKey = option[valueKey];
1156
- const optionDisabled = option[disabledKey] || false;
1157
- let val = returnObject ? value?.[valueKey] : value;
1158
- if (type === "number" && val !== void 0) {
1159
- val = Number(val);
1160
- } else if (type === "boolean" && val !== void 0) {
1161
- val = Boolean(val);
1162
- }
1163
- const isChecked = val === optionKey;
1164
- return /* @__PURE__ */ jsx7(
1165
- FormControlLabel3,
1166
- {
1167
- ...labelProps,
1168
- control: /* @__PURE__ */ jsx7(
1169
- Radio,
1170
- {
1171
- ...radioProps,
1172
- sx: {
1173
- color: error ? theme.palette.error.main : void 0
1174
- },
1175
- disabled: disabled || optionDisabled,
1176
- checked: isChecked
1177
- }
1178
- ),
1179
- value: optionKey,
1180
- label: option[labelKey]
1181
- },
1182
- String(optionKey)
1183
- );
1184
- })
1185
- ] }),
1186
- error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1187
- ] });
1188
- };
1189
- var RadioButtonGroup2 = ({
1190
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1191
- ...props
1192
- }) => {
1193
- if (gridProps) {
1194
- return /* @__PURE__ */ jsx7(
1195
- Grid6,
1196
- {
1197
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1198
- children: /* @__PURE__ */ jsx7(Component4, { ...props })
1199
- }
1200
- );
1201
- }
1202
- return /* @__PURE__ */ jsx7(Component4, { ...props });
1203
- };
1204
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1205
- var RadioButtonGroup_default = RadioButtonGroup2;
1206
-
1207
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1208
- import {
1209
- Grid as Grid7,
1210
- useTheme as useTheme5,
1211
- TextField as TextField3,
1212
- Autocomplete as Autocomplete2
1213
- } from "@mui/material";
1214
- import { useRef, useState as useState3, useEffect as useEffect3, useCallback as useCallback4 } from "react";
1215
- import {
1216
- useController as useController7
1217
- } from "react-hook-form";
1218
- import { jsx as jsx8 } from "react/jsx-runtime";
1219
- var Component5 = function SelectCascadeElement(props) {
1220
- const {
1221
- labelKey = "Label",
1222
- valueKey = "Value",
1223
- name,
1224
- onBlur,
1225
- onChange,
1226
- disabled,
1227
- options,
1228
- control,
1229
- loading = false,
1230
- placeholder,
1231
- label,
1232
- dependsOn,
1233
- textFieldProps = {},
1234
- variant,
1235
- sx,
1236
- isEdit = false,
1237
- ...rest
1238
- } = props;
1239
- const { required } = textFieldProps;
1240
- const getOptionKey = useCallback4(
1241
- (option) => {
1242
- if (typeof option === "string" || typeof option === "number") return option;
1243
- const key = option ? option[valueKey] : void 0;
1244
- return key !== void 0 && key !== null ? String(key) : "";
1245
- },
1246
- [valueKey]
1247
- );
1248
- const getOptionLabel = useCallback4(
1249
- (option) => {
1250
- if (typeof option === "string") return option;
1251
- return option ? String(option[labelKey]) : "";
1252
- },
1253
- [labelKey]
1254
- );
1255
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1256
- const {
1257
- field,
1258
- fieldState: { error }
1259
- } = useController7({
1260
- name,
1261
- control
1262
- });
1263
- const theme = useTheme5();
1264
- const { field: dependentField } = useController7({
1265
- name: dependsOn,
1266
- control
1267
- });
1268
- const parentValueRef = useRef(dependentField.value ?? null);
1269
- const [hasAutoSelected, setHasAutoSelected] = useState3(false);
1270
- useEffect3(() => {
1271
- if (!!dependentField.value && parentValueRef?.current !== dependentField.value || dependentField.value === null) {
1272
- field.onChange(null);
1273
- setHasAutoSelected(false);
1274
- }
1275
- }, [dependentField.value]);
1276
- useEffect3(() => {
1277
- if (isEdit && !disabled && options.length === 1 && field.value == null && !hasAutoSelected) {
1278
- field.onChange(getOptionKey(options[0]));
1279
- setHasAutoSelected(true);
1280
- } else {
1281
- if (options.length === 1 && field.value == null && !hasAutoSelected) {
1282
- field.onChange(getOptionKey(options[0]));
1283
- setHasAutoSelected(true);
1284
- }
1285
- }
1286
- }, [
1287
- options,
1288
- field.value,
1289
- field.onChange,
1290
- hasAutoSelected,
1291
- isEdit,
1292
- disabled,
1293
- field,
1294
- getOptionKey,
1295
- dependentField.onChange
1296
- ]);
1297
- return /* @__PURE__ */ jsx8(
1298
- Autocomplete2,
1299
- {
1300
- ...rest,
1301
- value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1302
- size: "small",
1303
- loading,
1304
- options,
1305
- getOptionKey,
1306
- getOptionLabel,
1307
- isOptionEqualToValue,
1308
- ref: field.ref,
1309
- disabled: dependentField.value == null || disabled,
1310
- onChange: (event, newValue, reason) => {
1311
- field.onChange(newValue ? getOptionKey(newValue) : null);
1312
- if (onChange && typeof onChange === "function") {
1313
- onChange(event, newValue, reason);
1314
- }
1315
- },
1316
- onBlur: (event) => {
1317
- field.onBlur();
1318
- if (typeof onBlur === "function") {
1319
- onBlur(event);
1320
- }
1321
- },
1322
- fullWidth: true,
1323
- renderInput: (params) => (
1324
- // @ts-ignore
1325
- /* @__PURE__ */ jsx8(
1326
- TextField3,
1327
- {
1328
- ...params,
1329
- fullWidth: true,
1330
- error: !!error,
1331
- required,
1332
- helperText: error ? error.message : "",
1333
- placeholder,
1334
- label,
1335
- variant: variant ? variant : "outlined",
1336
- sx: {
1337
- "& .MuiOutlinedInput-root": {
1338
- bgcolor: disabled || dependentField.value == null ? theme.palette.action.disabledBackground : "transparent"
1339
- },
1340
- "& .MuiInputLabel-asterisk": { color: "red" },
1341
- "& .MuiInputBase-input": {
1342
- cursor: disabled || dependentField.value == null ? "not-allowed" : "default"
1343
- },
1344
- ...sx
1345
- }
1346
- }
1347
- )
1348
- )
1349
- }
1350
- );
1351
- };
1352
- var SelectCascadeElement2 = ({
1353
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1354
- ...props
1355
- }) => {
1356
- if (gridProps) {
1357
- return /* @__PURE__ */ jsx8(Grid7, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx8(Component5, { ...props }) });
1358
- }
1359
- return /* @__PURE__ */ jsx8(Component5, { ...props });
1360
- };
1361
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1362
- var SelectCascadeElement_default = SelectCascadeElement2;
1363
-
1364
- // src/wrappers/SelectElement/SelectElement.tsx
1365
- import { Grid as Grid8, useTheme as useTheme6, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1366
- import {
1367
- useMemo as useMemo6,
1368
- useEffect as useEffect4,
1369
- useCallback as useCallback5
1370
- } from "react";
1371
- import {
1372
- useController as useController8
1373
- } from "react-hook-form";
1374
- import { jsx as jsx9 } from "react/jsx-runtime";
1375
- var Component6 = function SelectElement(props) {
1376
- const {
1377
- name,
1378
- control,
1379
- onChange,
1380
- isEdit,
1381
- options,
1382
- label,
1383
- sx,
1384
- variant,
1385
- disabled,
1386
- labelKey = "Label",
1387
- valueKey = "Value",
1388
- placeholder,
1389
- textFieldProps = {},
1390
- ...rest
1391
- } = props;
1392
- const { required } = textFieldProps;
1393
- const {
1394
- field,
1395
- fieldState: { error }
1396
- } = useController8({
1397
- name,
1398
- control
1399
- });
1400
- const theme = useTheme6();
1401
- const getOptionValue = useCallback5(
1402
- (option) => {
1403
- if (typeof option === "string") return option;
1404
- return option ? option[valueKey] : null;
1405
- },
1406
- [valueKey]
1407
- );
1408
- const getOptionLabel = useCallback5(
1409
- (option) => {
1410
- if (typeof option === "string") return option;
1411
- return option ? String(option[labelKey]) : "";
1412
- },
1413
- [labelKey]
1414
- );
1415
- const handleChange = (event, newValue, reason) => {
1416
- const option = newValue;
1417
- field.onChange(option ? getOptionValue(option) : null);
1418
- onChange?.(event, newValue, reason);
1419
- };
1420
- useEffect4(() => {
1421
- if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
1422
- const defaultOption = options[0];
1423
- const defaultValue = getOptionValue(defaultOption);
1424
- field.onChange(defaultValue);
1425
- }
1426
- }, [isEdit, options]);
1427
- const autocompleteValue = useMemo6(
1428
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1429
- [field.value, options, getOptionValue]
1430
- );
1431
- return /* @__PURE__ */ jsx9(
1432
- Autocomplete3,
1433
- {
1434
- ...rest,
1435
- filterSelectedOptions: false,
1436
- options,
1437
- value: autocompleteValue,
1438
- onChange: handleChange,
1439
- disabled,
1440
- getOptionLabel: (option) => getOptionLabel(option),
1441
- ref: field.ref,
1442
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1443
- renderInput: (params) => /* @__PURE__ */ jsx9(
1444
- TextField4,
1445
- {
1446
- ...params,
1447
- fullWidth: true,
1448
- required,
1449
- error: !!error,
1450
- helperText: error ? error.message : "",
1451
- label,
1452
- placeholder,
1453
- variant: variant ? variant : "outlined",
1454
- sx: {
1455
- "& .MuiOutlinedInput-root": {
1456
- bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1457
- },
1458
- "& .MuiInputLabel-asterisk": { color: "red" },
1459
- "& .MuiInputBase-input": {
1460
- cursor: disabled ? "not-allowed" : "default"
1461
- },
1462
- ...sx
1463
- }
1464
- }
1465
- )
1466
- }
1467
- );
1468
- };
1469
- var SelectElement2 = ({
1470
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1471
- ...props
1472
- }) => {
1473
- if (gridProps) {
1474
- return /* @__PURE__ */ jsx9(
1475
- Grid8,
1476
- {
1477
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1478
- children: /* @__PURE__ */ jsx9(Component6, { ...props })
1479
- }
1480
- );
1481
- }
1482
- return /* @__PURE__ */ jsx9(Component6, { ...props });
1483
- };
1484
- SelectElement2.displayName = "SelectElement";
1485
- var SelectElement_default = SelectElement2;
1486
-
1487
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1488
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1489
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1490
- import { Grid as Grid9, Checkbox as Checkbox3, TextField as TextField5, Autocomplete as Autocomplete4, CircularProgress as CircularProgress2 } from "@mui/material";
1491
- import { Fragment as Fragment2 } from "react";
1492
- import { useController as useController9 } from "react-hook-form";
1493
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1494
- var Component7 = function SelectMultiElement(props) {
1495
- const {
1496
- name,
1497
- control,
1498
- onBlur,
1499
- disabled,
1500
- options,
1501
- loading = false,
1502
- placeholder,
1503
- label,
1504
- variant,
1505
- sx,
1506
- labelKey = "Label",
1507
- valueKey = "Value",
1508
- ...rest
1509
- } = props;
1510
- const {
1511
- field,
1512
- fieldState: { error }
1513
- } = useController9({
1514
- name,
1515
- control
1516
- });
1517
- const getOptionValue = (option) => {
1518
- if (typeof option === "string") return option;
1519
- return option ? option[valueKey] : null;
1520
- };
1521
- const getOptionLabel = (option) => {
1522
- if (typeof option === "string") return option;
1523
- return option ? option[labelKey] : "";
1524
- };
1525
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1526
- const handleChange = (_, selectedOptions, reason) => {
1527
- if (reason === "clear") {
1528
- field.onChange([]);
1529
- } else if (reason === "selectOption" || reason === "removeOption") {
1530
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1531
- field.onChange(newValues);
1532
- }
1533
- };
1534
- const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1535
- const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1536
- return /* @__PURE__ */ jsx10(
1537
- Autocomplete4,
1538
- {
1539
- multiple: true,
1540
- value: selectedValue,
1541
- loading,
1542
- options,
1543
- getOptionLabel,
1544
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1545
- filterSelectedOptions: true,
1546
- disableCloseOnSelect: true,
1547
- ref: field.ref,
1548
- disabled: disabled ?? field.disabled,
1549
- onChange: handleChange,
1550
- onBlur: (event) => {
1551
- field.onBlur();
1552
- if (typeof onBlur === "function") {
1553
- onBlur(event);
1554
- }
1555
- },
1556
- fullWidth: true,
1557
- renderOption: (props1, option, { selected }) => {
1558
- const { key, ...optionProps } = props1;
1559
- return /* @__PURE__ */ jsxs5("li", { ...optionProps, children: [
1560
- /* @__PURE__ */ jsx10(Checkbox3, { icon, checkedIcon, checked: selected }),
1561
- getOptionLabel(option)
1562
- ] }, key);
1563
- },
1564
- renderInput: (params) => /* @__PURE__ */ jsx10(
1565
- TextField5,
1566
- {
1567
- ...params,
1568
- label,
1569
- error: !!error,
1570
- helperText: error ? error.message : "",
1571
- placeholder,
1572
- slotProps: {
1573
- input: {
1574
- ...params.InputProps,
1575
- endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1576
- loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1577
- params.InputProps.endAdornment
1578
- ] })
1579
- }
1580
- },
1581
- variant: variant ? variant : "outlined",
1582
- sx: {
1583
- ...sx
1584
- }
1585
- }
1586
- ),
1587
- ...rest
1588
- }
1589
- );
1590
- };
1591
- var SelectMultiElement2 = ({
1592
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1593
- ...props
1594
- }) => {
1595
- if (gridProps) {
1596
- return /* @__PURE__ */ jsx10(Grid9, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
1597
- }
1598
- return /* @__PURE__ */ jsx10(Component7, { ...props });
1599
- };
1600
- SelectMultiElement2.displayName = "SelectMultiElement";
1601
- var SelectMultiElement_default = SelectMultiElement2;
1602
-
1603
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1604
- import {
1605
- Grid as Grid10,
1606
- TextField as TextField6,
1607
- useForkRef as useForkRef3,
1608
- useTheme as useTheme7
1609
- } from "@mui/material";
1610
- import {
1611
- useController as useController10
1612
- } from "react-hook-form";
1613
- import { jsx as jsx11 } from "react/jsx-runtime";
1614
- var Component8 = function TextFieldElement(props) {
1615
- const {
1616
- rules = {},
1617
- parseError,
1618
- name,
1619
- control,
1620
- component: TextFieldComponent = TextField6,
1621
- gridProps,
1622
- transform,
1623
- label,
1624
- placeholder,
1625
- textFieldProps = {},
1626
- variant,
1627
- sx,
1628
- ...rest
1629
- } = props;
1630
- const {
1631
- type,
1632
- required,
1633
- helperText,
1634
- inputRef,
1635
- onBlur,
1636
- disabled,
1637
- ...restTextProps
1638
- } = textFieldProps;
1639
- const {
1640
- field,
1641
- fieldState: { error }
1642
- } = useController10({
1643
- name,
1644
- control
1645
- });
1646
- const theme = useTheme7();
1647
- const { value, onChange } = useTransform({
1648
- value: field.value,
1649
- onChange: field.onChange,
1650
- transform: {
1651
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1652
- return value2 ?? "";
1653
- },
1654
- output: typeof transform?.output === "function" ? transform.output : (event) => {
1655
- const value2 = event.target.value;
1656
- if (type !== "number") {
1657
- return value2;
1658
- }
1659
- if (value2 === "") {
1660
- return null;
1661
- }
1662
- if (value2 == null) {
1663
- return value2;
1664
- }
1665
- return Number(value2);
1666
- }
1667
- }
1668
- });
1669
- const handleInputRef = useForkRef3(field.ref, inputRef);
1670
- return /* @__PURE__ */ jsx11(
1671
- TextFieldComponent,
1672
- {
1673
- ...rest,
1674
- ...restTextProps,
1675
- name: field.name,
1676
- value,
1677
- onChange: (event) => {
1678
- field.onChange(event);
1679
- if (typeof onChange === "function") {
1680
- onChange(event);
1681
- }
1682
- },
1683
- onBlur: (event) => {
1684
- field.onBlur();
1685
- if (typeof onBlur === "function") {
1686
- onBlur(event);
1687
- }
1688
- },
1689
- disabled,
1690
- label,
1691
- placeholder,
1692
- fullWidth: true,
1693
- required,
1694
- type,
1695
- error: !!error,
1696
- helperText: error ? error.message : helperText,
1697
- inputRef: handleInputRef,
1698
- variant: variant ? variant : "outlined",
1699
- size: "small",
1700
- sx: {
1701
- "& .MuiInputLabel-asterisk": { color: "red" },
1702
- "& .MuiInputBase-input": {
1703
- cursor: disabled ? "not-allowed" : "default"
1704
- },
1705
- bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1706
- ...sx
1707
- }
1708
- }
1709
- );
1710
- };
1711
- var TextFieldElement2 = ({
1712
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1713
- ...props
1714
- }) => {
1715
- if (gridProps) {
1716
- return /* @__PURE__ */ jsx11(
1717
- Grid10,
1718
- {
1719
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1720
- children: /* @__PURE__ */ jsx11(Component8, { ...props })
1721
- }
1722
- );
1723
- }
1724
- return /* @__PURE__ */ jsx11(Component8, { ...props });
1725
- };
1726
- TextFieldElement2.displayName = "TextFieldElement";
1727
- var TextFieldElement_default = TextFieldElement2;
1728
-
1729
- // src/wrappers/TextFieldElement/EnhancedTextFieldElement.tsx
1730
- import {
1731
- Grid as Grid11,
1732
- TextField as TextField7,
1733
- useForkRef as useForkRef4,
1734
- useTheme as useTheme8
1735
- } from "@mui/material";
1736
- import {
1737
- useController as useController11
1738
- } from "react-hook-form";
1739
- import { jsx as jsx12 } from "react/jsx-runtime";
1740
- var Component9 = function EnhancedTextFieldElement(props) {
1741
- const {
1742
- rules = {},
1743
- parseError,
1744
- name,
1745
- control,
1746
- component: TextFieldComponent = TextField7,
1747
- gridProps,
1748
- transform,
1749
- fieldType = "text",
1750
- // Default to text type
1751
- defaultValue,
1752
- label,
1753
- placeholder,
1754
- textFieldProps = {},
1755
- variant,
1756
- sx,
1757
- onChange: customOnChange,
1758
- enableWarnings = process.env.NODE_ENV === "development",
1759
- ...rest
1760
- } = props;
1761
- const {
1762
- type,
1763
- required,
1764
- helperText,
1765
- inputRef,
1766
- onBlur,
1767
- disabled,
1768
- ...restTextProps
1769
- } = textFieldProps;
1770
- const {
1771
- field,
1772
- fieldState: { error }
1773
- } = useController11({
1774
- name,
1775
- control,
1776
- rules
1777
- });
1778
- const theme = useTheme8();
1779
- const { value, onChange } = useEnhancedTransform({
1780
- value: field.value,
1781
- onChange: field.onChange,
1782
- transform: transform ? {
1783
- input: transform.input,
1784
- output: transform.output
1785
- } : void 0,
1786
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1787
- // Auto-detect number type
1788
- defaultValue,
1789
- enableWarnings
1790
- });
1791
- const handleInputRef = useForkRef4(field.ref, inputRef);
1792
- return /* @__PURE__ */ jsx12(
1793
- TextFieldComponent,
1794
- {
1795
- ...rest,
1796
- ...restTextProps,
1797
- name: field.name,
1798
- value,
1799
- onChange: (event) => {
1800
- onChange(event);
1801
- if (typeof customOnChange === "function") {
1802
- customOnChange(event);
1803
- }
1804
- },
1805
- onBlur: (event) => {
1806
- field.onBlur();
1807
- if (typeof onBlur === "function") {
1808
- onBlur(event);
1809
- }
1810
- },
1811
- disabled,
1812
- label,
1813
- placeholder,
1814
- fullWidth: true,
1815
- required,
1816
- type,
1817
- error: !!error,
1818
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1819
- inputRef: handleInputRef,
1820
- variant: variant ? variant : "outlined",
1821
- size: "small",
1822
- sx: {
1823
- "& .MuiInputLabel-asterisk": { color: "red" },
1824
- "& .MuiInputBase-input": {
1825
- cursor: disabled ? "not-allowed" : "default"
1826
- },
1827
- bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1828
- ...sx
1829
- }
1830
- }
1831
- );
1832
- };
1833
- var EnhancedTextFieldElement2 = ({
1834
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1835
- ...props
1836
- }) => {
1837
- if (gridProps) {
1838
- return /* @__PURE__ */ jsx12(
1839
- Grid11,
1840
- {
1841
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1842
- children: /* @__PURE__ */ jsx12(Component9, { ...props })
1843
- }
1844
- );
1845
- }
1846
- return /* @__PURE__ */ jsx12(Component9, { ...props });
1847
- };
1848
- EnhancedTextFieldElement2.displayName = "EnhancedTextFieldElement";
1849
-
1850
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1851
- import { Grid as Grid12, useForkRef as useForkRef5, useTheme as useTheme9 } from "@mui/material";
1852
- import { TimePicker } from "@mui/x-date-pickers";
1853
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1854
- import { useCallback as useCallback6 } from "react";
1855
- import { useController as useController12 } from "react-hook-form";
1856
- import { jsx as jsx13 } from "react/jsx-runtime";
1857
- function readValueAsDate(adapter, value) {
1858
- if (typeof value === "string") {
1859
- if (value === "") {
1860
- return null;
1861
- }
1862
- return adapter.utils.date(value);
1863
- }
1864
- return value;
1865
- }
1866
- function useTransform2(options) {
1867
- const value = typeof options.transform?.input === "function" ? options.transform.input(options.value) : options.value;
1868
- const onChange = useCallback6(
1869
- (...event) => {
1870
- if (typeof options.transform?.output === "function") {
1871
- options.onChange(options.transform.output(...event));
1872
- } else {
1873
- options.onChange(...event);
1874
- }
1875
- },
1876
- [options]
1877
- );
1878
- return {
1879
- value,
1880
- onChange
1881
- };
1882
- }
1883
- var Component10 = function TimePickerElement(props) {
1884
- const {
1885
- name,
1886
- required,
1887
- inputProps,
1888
- control,
1889
- textReadOnly,
1890
- label,
1891
- placeholder,
1892
- slotProps,
1893
- timePickerProps = {},
1894
- transform,
1895
- sx,
1896
- ...rest
1897
- } = props;
1898
- const adapter = useLocalizationContext2();
1899
- const theme = useTheme9();
1900
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1901
- const {
1902
- field,
1903
- fieldState: { error }
1904
- } = useController12({
1905
- name,
1906
- control,
1907
- defaultValue: null
1908
- });
1909
- const { value, onChange } = useTransform2({
1910
- value: field.value,
1911
- onChange: field.onChange,
1912
- transform: {
1913
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1914
- output: (outputValue, context) => {
1915
- if (outputValue === null) return null;
1916
- return outputValue;
1917
- }
1918
- }
1919
- });
1920
- const handleInputRef = useForkRef5(field.ref, inputRef);
1921
- return /* @__PURE__ */ jsx13(
1922
- TimePicker,
1923
- {
1924
- ...rest,
1925
- ...restTimePickerProps,
1926
- ...field,
1927
- value,
1928
- label,
1929
- disabled,
1930
- ...timePickerProps,
1931
- inputRef: handleInputRef,
1932
- onClose: (...args) => {
1933
- field.onBlur();
1934
- if (onClose) {
1935
- onClose(...args);
1936
- }
1937
- },
1938
- onChange: (newValue, context) => {
1939
- onChange(newValue, context);
1940
- if (typeof timePickerProps.onChange === "function") {
1941
- timePickerProps.onChange(newValue, context);
1942
- }
1943
- },
1944
- sx: {
1945
- "& .MuiOutlinedInput-root": {
1946
- bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1947
- },
1948
- "& .MuiInputLabel-asterisk": { color: "red" },
1949
- "& .MuiInputBase-input": {
1950
- cursor: disabled ? "not-allowed" : "default"
1951
- },
1952
- ...sx
1953
- },
1954
- slotProps: {
1955
- ...slotProps,
1956
- actionBar: {
1957
- actions: ["clear", "cancel", "accept"]
1958
- },
1959
- textField: {
1960
- ...inputProps,
1961
- required,
1962
- placeholder,
1963
- fullWidth: true,
1964
- onBlur: (event) => {
1965
- field.onBlur();
1966
- if (typeof inputProps?.onBlur === "function") {
1967
- inputProps.onBlur(event);
1968
- }
1969
- },
1970
- error: !!error,
1971
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1972
- inputProps: {
1973
- readOnly: !!textReadOnly,
1974
- ...inputProps?.inputProps
1975
- }
1976
- }
1977
- }
1978
- }
1979
- );
1980
- };
1981
- var TimePickerElement2 = ({
1982
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1983
- ...props
1984
- }) => {
1985
- if (gridProps) {
1986
- return /* @__PURE__ */ jsx13(
1987
- Grid12,
1988
- {
1989
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1990
- children: /* @__PURE__ */ jsx13(Component10, { ...props })
1991
- }
1992
- );
1993
- }
1994
- return /* @__PURE__ */ jsx13(Component10, { ...props });
1995
- };
1996
- TimePickerElement2.displayName = "TimePickerElement";
1997
- var TimePickerElement_default = TimePickerElement2;
1998
-
1999
- export {
2000
- AsyncMultiSelect2,
2001
- CheckboxElement2 as CheckboxElement,
2002
- CheckboxGroup2 as CheckboxGroup,
2003
- readDatePickerValueAsDate,
2004
- useDatePickerValue,
2005
- useDatePickerValidation,
2006
- useDatePickerStyles,
2007
- DatePickerElementCore,
2008
- DatePickerElement,
2009
- isValidDate,
2010
- isParsableDateString,
2011
- createDateInputTransform,
2012
- createDateOutputTransform,
2013
- createDefaultDatePickerConfig,
2014
- extractErrorMessage,
2015
- createStableKey,
2016
- PasswordElement_default,
2017
- RadioButtonGroup_default,
2018
- SelectCascadeElement_default,
2019
- SelectElement_default,
2020
- SelectMultiElement_default,
2021
- TextFieldElement_default,
2022
- EnhancedTextFieldElement2 as EnhancedTextFieldElement,
2023
- TimePickerElement_default
2024
- };
2025
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL0FzeW5jTXVsdGlTZWxlY3QyL0FzeW5jTXVsdGlTZWxlY3QyLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L0VuaGFuY2VkVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVkdWNlciwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0MlByb3BzLCBBc3luY1NlbGVjdDJQYXlsb2FkLCBPcHRpb24ySXRlbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmludGVyZmFjZSBDb21wb25lbnRTdGF0ZSB7XG4gIG9wdGlvbnM6IE9wdGlvbjJJdGVtW107XG4gIHNlbGVjdGVkT3B0aW9uczogT3B0aW9uMkl0ZW1bXTtcbiAgaW5wdXRWYWx1ZTogc3RyaW5nO1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBpbml0aWFsTG9hZGVkOiBib29sZWFuO1xufVxuXG50eXBlIENvbXBvbmVudEFjdGlvbiA9XG4gIHwgeyB0eXBlOiBcIlNFVF9PUFRJT05TXCI7IHBheWxvYWQ6IE9wdGlvbjJJdGVtW10gfVxuICB8IHsgdHlwZTogXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiOyBwYXlsb2FkOiBPcHRpb24ySXRlbVtdIH1cbiAgfCB7IHR5cGU6IFwiU0VUX0lOUFVUX1ZBTFVFXCI7IHBheWxvYWQ6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcIlNFVF9MT0FESU5HXCI7IHBheWxvYWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJTRVRfSU5JVElBTF9MT0FERURcIjsgcGF5bG9hZDogYm9vbGVhbiB9XG4gIHwgeyB0eXBlOiBcIlJFU0VUX09QVElPTlNcIiB9O1xuXG5jb25zdCBpbml0aWFsU3RhdGU6IENvbXBvbmVudFN0YXRlID0ge1xuICBvcHRpb25zOiBbXSxcbiAgc2VsZWN0ZWRPcHRpb25zOiBbXSxcbiAgaW5wdXRWYWx1ZTogXCJcIixcbiAgbG9hZGluZzogZmFsc2UsXG4gIGluaXRpYWxMb2FkZWQ6IGZhbHNlLFxufTtcblxuZnVuY3Rpb24gY29tcG9uZW50UmVkdWNlcihzdGF0ZTogQ29tcG9uZW50U3RhdGUsIGFjdGlvbjogQ29tcG9uZW50QWN0aW9uKTogQ29tcG9uZW50U3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBcIlNFVF9PUFRJT05TXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3B0aW9uczogYWN0aW9uLnBheWxvYWQsIGxvYWRpbmc6IGZhbHNlIH07XG4gICAgY2FzZSBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgc2VsZWN0ZWRPcHRpb25zOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJTRVRfSU5QVVRfVkFMVUVcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBpbnB1dFZhbHVlOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJTRVRfTE9BRElOR1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGxvYWRpbmc6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlNFVF9JTklUSUFMX0xPQURFRFwiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGluaXRpYWxMb2FkZWQ6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlJFU0VUX09QVElPTlNcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBvcHRpb25zOiBzdGF0ZS5zZWxlY3RlZE9wdGlvbnMgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cbmNvbnN0IEFzeW5jTXVsdGlTZWxlY3QyQ29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz5cbj4oe1xuICBuYW1lLFxuICBjb250cm9sLFxuICBwbGFjZWhvbGRlcixcbiAgaW5pdGlhbFZhbHVlcyxcbiAgbGFiZWwsXG4gIHF1ZXJ5Rm4sXG4gIHZhcmlhbnQgPSBcIm91dGxpbmVkXCIsXG4gIHN4LFxuICBkaXNhYmxlZCA9IGZhbHNlLFxuICBkZWJvdW5jZU1zID0gNDAwLFxuICBsb2FkaW5nVGV4dCA9IFwiTG9hZGluZy4uLlwiLFxuICBub09wdGlvbnNUZXh0ID0gXCJObyBvcHRpb25zXCIsXG4gIHJlbmRlcklucHV0LFxuICAuLi5yZXN0XG59OiBBc3luY011bHRpU2VsZWN0MlByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIGNvbnN0IFtzdGF0ZSwgZGlzcGF0Y2hdID0gdXNlUmVkdWNlcihjb21wb25lbnRSZWR1Y2VyLCBpbml0aWFsU3RhdGUpO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZGVib3VuY2VkRmV0Y2ggPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShhc3luYyAocGF5bG9hZDogQXN5bmNTZWxlY3QyUGF5bG9hZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeUZuKHBheWxvYWQpO1xuXG4gICAgICAgICAgLy8gTWVyZ2Ugc2VsZWN0ZWQgb3B0aW9ucyB3aXRoIHNlYXJjaCByZXN1bHRzLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIC4uLnN0YXRlLnNlbGVjdGVkT3B0aW9ucyxcbiAgICAgICAgICAgIC4uLnJlc3VsdHMuZmlsdGVyKFxuICAgICAgICAgICAgICAob3B0aW9uKSA9PiAhc3RhdGUuc2VsZWN0ZWRPcHRpb25zLnNvbWUoKHNlbGVjdGVkKSA9PiBzZWxlY3RlZC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9PUFRJT05TXCIsIHBheWxvYWQ6IG1lcmdlZE9wdGlvbnMgfSk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgZGVib3VuY2VNcyksXG4gICAgW3F1ZXJ5Rm4sIHN0YXRlLnNlbGVjdGVkT3B0aW9ucywgZGVib3VuY2VNc11cbiAgKTtcblxuICAvLyBMb2FkIGluaXRpYWwgdmFsdWVzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpbml0aWFsVmFsdWVzPy5sZW5ndGggfHwgc3RhdGUuaW5pdGlhbExvYWRlZCkgcmV0dXJuO1xuXG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBpbml0aWFsVmFsdWVzLFxuICAgIH07XG5cbiAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiLCBwYXlsb2FkOiByZXN1bHRzIH0pO1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX09QVElPTlNcIiwgcGF5bG9hZDogcmVzdWx0cyB9KTtcbiAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9JTklUSUFMX0xPQURFRFwiLCBwYXlsb2FkOiB0cnVlIH0pO1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHRzLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpKTtcbiAgICAgIH1cblxuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgIH0pLmNhdGNoKChfZXJyb3IpID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfSwgW2luaXRpYWxWYWx1ZXMsIHN0YXRlLmluaXRpYWxMb2FkZWQsIHF1ZXJ5Rm4sIGZpZWxkXSk7XG5cbiAgLy8gSGFuZGxlIHNlYXJjaCBpbnB1dCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzdGF0ZS5pbml0aWFsTG9hZGVkKSByZXR1cm47XG5cbiAgICBpZiAoc3RhdGUuaW5wdXRWYWx1ZSA9PT0gXCJcIikge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlJFU0VUX09QVElPTlNcIiB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3QyUGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBzdGF0ZS5pbnB1dFZhbHVlLFxuICAgICAgaW5pdGlhbFZhbHVlczogbnVsbCxcbiAgICB9O1xuXG4gICAgZGVib3VuY2VkRmV0Y2gocGF5bG9hZCk7XG4gIH0sIFtzdGF0ZS5pbnB1dFZhbHVlLCBzdGF0ZS5pbml0aWFsTG9hZGVkLCBkZWJvdW5jZWRGZXRjaF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuU3ludGhldGljRXZlbnQsIG5ld1ZhbHVlOiBPcHRpb24ySXRlbVtdKSA9PiB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIiwgcGF5bG9hZDogbmV3VmFsdWUgfSk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgfSxcbiAgICBbZmllbGRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfSU5QVVRfVkFMVUVcIiwgcGF5bG9hZDogbmV3SW5wdXRWYWx1ZSB9KTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBPcHRpb24ySXRlbSwgdmFsdWU6IE9wdGlvbjJJdGVtKSA9PiBvcHRpb24udmFsdWUgPT09IHZhbHVlLnZhbHVlLFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjaygob3B0aW9uOiBPcHRpb24ySXRlbSkgPT4gb3B0aW9uLmxhYmVsLCBbXSk7XG5cbiAgY29uc3QgZGVmYXVsdFJlbmRlcklucHV0ID0gdXNlQ2FsbGJhY2soXG4gICAgKHBhcmFtczogUGFyYW1ldGVyczxSZXF1aXJlZDxBc3luY011bHRpU2VsZWN0MlByb3BzPltcInJlbmRlcklucHV0XCJdPlswXSkgPT4gKFxuICAgICAgPFRleHRGaWVsZFxuICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgdmFyaWFudD17dmFyaWFudH1cbiAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgIGhlbHBlclRleHQ9e2Vycm9yPy5tZXNzYWdlfVxuICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7c3RhdGUubG9hZGluZyAmJiA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz59XG4gICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAuLi5zeCxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgKSxcbiAgICBbbGFiZWwsIHBsYWNlaG9sZGVyLCB2YXJpYW50LCBlcnJvciwgc3RhdGUubG9hZGluZywgZGlzYWJsZWQsIHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCwgc3hdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgb3B0aW9ucz17c3RhdGUub3B0aW9uc31cbiAgICAgIHZhbHVlPXtzdGF0ZS5zZWxlY3RlZE9wdGlvbnN9XG4gICAgICBsb2FkaW5nPXtzdGF0ZS5sb2FkaW5nfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25JbnB1dENoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICBsb2FkaW5nVGV4dD17bG9hZGluZ1RleHR9XG4gICAgICBub09wdGlvbnNUZXh0PXtub09wdGlvbnNUZXh0fVxuICAgICAgcmVuZGVySW5wdXQ9e3JlbmRlcklucHV0IHx8IGRlZmF1bHRSZW5kZXJJbnB1dH1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MiA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KHtcbiAgZ3JpZFByb3BzLFxuICAuLi5wcm9wc1xufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19PlxuICAgICAgICA8QXN5bmNNdWx0aVNlbGVjdDJDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPEFzeW5jTXVsdGlTZWxlY3QyQ29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5Bc3luY011bHRpU2VsZWN0Mi5kaXNwbGF5TmFtZSA9IFwiQXN5bmNNdWx0aVNlbGVjdDJcIjtcblxuZXhwb3J0IHsgQXN5bmNNdWx0aVNlbGVjdDIgfTtcbiIsICJpbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEdyaWQsXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSBcIi4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KFxuICBwcm9wczogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICBkaXNhYmxlZCxcbiAgICBzeCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgYm9vbGVhbj4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiAodmFsdWUpID0+ICEhdmFsdWUsXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgICAgOiAoY2hlY2tlZCkgPT4gY2hlY2tlZCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgY2hlY2tlZDogYm9vbGVhbikgPT4ge1xuICAgIG9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8IFwiXCJ9XG4gICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCBcInByaW1hcnlcIn1cbiAgICAgICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzeCkgPyBzeCA6IFtzeF0pLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpblxuICAgICAgICAgICAgICAgICAgICA6IGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgXCImLk11aS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4gey4uLnByb3BzfSAvPjtcbn07XG5cbkNoZWNrYm94RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiQ2hlY2tib3hFbGVtZW50XCI7XG5cbmV4cG9ydCB7IENoZWNrYm94RWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIENoZWNrYm94UHJvcHMsXG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgR3JpZFByb3BzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEdyaWQsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuZXhwb3J0IHR5cGUgQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIG51bWJlcltdID0gbnVtYmVyW11cbj4gPSBPbWl0PENoZWNrYm94UHJvcHMsIFwibmFtZVwiPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsPzogRm9ybUNvbnRyb2xMYWJlbFByb3BzW1wibGFiZWxcIl07XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgXCJsYWJlbFwiIHwgXCJjb250cm9sXCI+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIG9wdGlvbnM6IEFycmF5PHsgVmFsdWU6IG51bWJlcjsgTGFiZWw6IHN0cmluZyB9Pjtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94R3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgbnVtYmVyW10gPSBudW1iZXJbXVxuPihwcm9wczogQ2hlY2tib3hHcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3QgeyBuYW1lLCBjb250cm9sLCBsYWJlbCwgbGFiZWxQcm9wcywgaW5wdXRSZWYsIG9wdGlvbnMsIC4uLnJlc3QgfSA9XG4gICAgcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZDogcmVzdC5kaXNhYmxlZCxcbiAgfSk7XG5cbiAgY29uc3QgW3NlbGVjdGVkVmFsdWVzLCBzZXRTZWxlY3RlZFZhbHVlc10gPSB1c2VTdGF0ZTxudW1iZXJbXT4oXG4gICAgb3B0aW9ucy5maWx0ZXIoKGMpID0+IGZpZWxkLnZhbHVlPy5pbmNsdWRlcyhjLlZhbHVlKSkubWFwKChjKSA9PiBjLlZhbHVlKSB8fFxuICAgIFtdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmaWVsZC5vbkNoYW5nZShzZWxlY3RlZFZhbHVlcyA/IFsuLi5zZWxlY3RlZFZhbHVlc10gOiBbXSk7XG4gIH0sIFtzZWxlY3RlZFZhbHVlc10pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSwgMTApO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlcyhbLi4uc2VsZWN0ZWRWYWx1ZXMsIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKHNlbGVjdGVkVmFsdWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdmFsdWUpKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIHtvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIGtleT17YCR7b3B0aW9uLlZhbHVlfWB9XG4gICAgICAgICAgICBsYWJlbD17b3B0aW9uLkxhYmVsfVxuICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgXCJwcmltYXJ5XCJ9XG4gICAgICAgICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHJlc3Quc3gpID8gcmVzdC5zeCA6IFtyZXN0LnN4XSksXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA/IFwiZXJyb3IubWFpblwiIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uVmFsdWV9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uLlZhbHVlKX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBDaGVja2JveEdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIG51bWJlcltdID0gbnVtYmVyW11cbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEdyb3VwUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19PlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cbkNoZWNrYm94R3JvdXAuZGlzcGxheU5hbWUgPSBcIkNoZWNrYm94R3JvdXBcIjtcblxuZXhwb3J0IHsgQ2hlY2tib3hHcm91cCB9O1xuXG4iLCAiaW1wb3J0IHsgR3JpZCB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH0gZnJvbSBcIi4vRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50UHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEEgZnVsbHktZmVhdHVyZWQsIHR5cGUtc2FmZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgZm9yIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBjb21iaW5lcyB0aGUgY29yZSBkYXRlIHBpY2tlciBmdW5jdGlvbmFsaXR5IHdpdGggb3B0aW9uYWwgR3JpZCBsYXlvdXQgd3JhcHBpbmcsXG4gKiBwcm92aWRpbmcgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgZm9ybS1iYXNlZCBkYXRlIHNlbGVjdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0LlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gXHVEODNDXHVERkFGICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlcyBhbmQgZGF0ZSB2YWx1ZXNcbiAqIC0gXHVEODNEXHVERDI3ICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0gXHVEODNDXHVERkE4ICoqVGhlbWluZyoqOiBBdXRvbWF0aWMgYWRhcHRhdGlvbiB0byBNVUkgdGhlbWUgd2l0aCBjdXN0b21pemFibGUgc3R5bGVzXG4gKiAtIFx1MjY3RiAqKkFjY2Vzc2liaWxpdHkqKjogV0NBRy1jb21wbGlhbnQgd2l0aCBwcm9wZXIgQVJJQSBhdHRyaWJ1dGVzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gKiAtIFx1RDgzRFx1REU4MCAqKlBlcmZvcm1hbmNlKio6IE9wdGltaXplZCB3aXRoIG1lbW9pemF0aW9uIGFuZCBlZmZpY2llbnQgcmUtcmVuZGVyaW5nXG4gKiAtIFx1RDgzRFx1RENGMSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0gXHVEODNEXHVERUUxXHVGRTBGICoqVmFsaWRhdGlvbioqOiBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gXHVEODNEXHVERDA0ICoqVHJhbnNmb3JtYXRpb24qKjogRmxleGlibGUgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBcdUQ4M0RcdURDREEgKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsICJpbXBvcnQgeyB1c2VGb3JrUmVmIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUge1xuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgRmllbGRQYXRoIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQge1xuICB1c2VEYXRlUGlja2VyVmFsdWUsXG4gIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uLFxuICB1c2VEYXRlUGlja2VyU3R5bGVzLFxufSBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogVGhlIGNvcmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGhvdXQgR3JpZCB3cmFwcGVyLlxuICpcbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCwgcGVyZm9ybWFudCBkYXRlIHBpY2tlciBjb21wb25lbnQgdGhhdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtIHdoaWxlIHByb3ZpZGluZyBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydCBhbmRcbiAqIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXNcbiAqIC0gQXV0b21hdGljIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFRoZW1lLWF3YXJlIHN0eWxpbmcgd2l0aCBhY2Nlc3NpYmlsaXR5IHN1cHBvcnRcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemVkIHdpdGggcHJvcGVyIG1lbW9pemF0aW9uXG4gKiAtIEZvcndhcmQgcmVmIHN1cHBvcnQgZm9yIGFkdmFuY2VkIHVzZSBjYXNlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJEYXRlIG9mIEJpcnRoXCJcbiAqICAgcmVxdWlyZWRcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiU3RhcnQgRGF0ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICB9fVxuICogICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnU3RhcnQgZGF0ZSBtdXN0IGJlIHRvZGF5IG9yIGxhdGVyJ1xuICogICAgIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50Q29yZSA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxhbnksIGFueSwgYW55LCBhbnk+XG4+KDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgICBydWxlcyxcbiAgICBjb250cm9sLFxuICAgIHBhcnNlRXJyb3IsXG4gICAgdHJhbnNmb3JtLFxuICAgIHZhbGlkYXRpb24sXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dFJlYWRPbmx5ID0gZmFsc2UsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFByb3BzID0ge30sXG4gICAgc2xvdFByb3BzID0ge30sXG4gICAgZGF0ZVBpY2tlclByb3BzID0ge30sXG4gICAgdmFyaWFudCA9IFwib3V0bGluZWRcIixcbiAgICBzeDogY3VzdG9tU3gsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgLi4ucmVzdFByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBFeHRyYWN0IERhdGVQaWNrZXItc3BlY2lmaWMgcHJvcHNcbiAgY29uc3Qge1xuICAgIGRpc2FibGVkLFxuICAgIGlucHV0UmVmOiBleHRlcm5hbElucHV0UmVmLFxuICAgIG9uQ2xvc2UsXG4gICAgLi4ucmVzdERhdGVQaWNrZXJQcm9wc1xuICB9ID0gZGF0ZVBpY2tlclByb3BzO1xuXG4gIC8vIFNldCB1cCBmb3JtIGNvbnRyb2xsZXJcbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGUsXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgcnVsZXMsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIGFueSwgLy8gTGV0IHJlYWN0LWhvb2stZm9ybSBoYW5kbGUgdGhlIGRlZmF1bHQgdmFsdWUgdHlwaW5nXG4gIH0pO1xuXG4gIC8vIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGhvb2tcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2U6IG9uVmFsdWVDaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gICAgZmllbGQsXG4gICAgdHJhbnNmb3JtLFxuICB9KTtcblxuICAvLyBWYWxpZGF0aW9uIGhvb2tcbiAgY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gICAgZmllbGRTdGF0ZSxcbiAgICB2YWxpZGF0aW9uLFxuICAgIHBhcnNlRXJyb3IsXG4gICAgdmFsdWUsXG4gIH0pO1xuXG4gIC8vIFN0eWxpbmcgaG9va1xuICBjb25zdCB7IHN4OiBjb21wdXRlZFN4LCBjbGFzc05hbWUgfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIHN4OiBjdXN0b21TeCxcbiAgfSk7XG5cbiAgLy8gTWVyZ2UgaW5wdXQgcmVmc1xuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAvLyBNZW1vaXplZCBjaGFuZ2UgaGFuZGxlciB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLCBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgb25WYWx1ZUNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgfSxcbiAgICBbb25WYWx1ZUNoYW5nZV1cbiAgKTtcblxuICAvLyBNZW1vaXplZCBjbG9zZSBoYW5kbGVyXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8dHlwZW9mIG9uQ2xvc2U+PikgPT4ge1xuICAgICAgLy8gVHJpZ2dlciBmb3JtIGZpZWxkIGJsdXIgZm9yIHZhbGlkYXRpb25cbiAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQ2xvc2UgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICApO1xuXG4gIC8vIE1lbW9pemVkIGJsdXIgaGFuZGxlciBmb3IgdGV4dCBmaWVsZFxuICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0eXBlb2YgaW5wdXRQcm9wcy5vbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpbnB1dFByb3BzLm9uQmx1cihldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQub25CbHVyLCBpbnB1dFByb3BzLm9uQmx1cl1cbiAgKTtcblxuICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICBjb25zdCBtZW1vaXplZFNsb3RQcm9wcyA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5zbG90UHJvcHMsXG4gICAgYWN0aW9uQmFyOiB7XG4gICAgICBhY3Rpb25zOiBbXCJjbGVhclwiLCBcInRvZGF5XCIsIFwiY2FuY2VsXCIsIFwiYWNjZXB0XCJdIGFzIEFycmF5PFwiYWNjZXB0XCIgfCBcImNhbmNlbFwiIHwgXCJjbGVhclwiIHwgXCJuZXh0XCIgfCBcIm5leHRPckFjY2VwdFwiIHwgXCJ0b2RheVwiPixcbiAgICAgIC4uLnNsb3RQcm9wcy5hY3Rpb25CYXIsXG4gICAgfSxcbiAgICB0ZXh0RmllbGQ6IHtcbiAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICByZXF1aXJlZCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgdmFyaWFudCxcbiAgICAgIG9uQmx1cjogaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICAgIGVycm9yOiBoYXNFcnJvcixcbiAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgcmVhZE9ubHk6IHRleHRSZWFkT25seSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogaW52YWxpZCxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAuLi5pbnB1dFByb3BzLmlucHV0UHJvcHMsXG4gICAgICB9LFxuICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAuLi4obG9hZGluZyAmJiBMb2FkaW5nQ29tcG9uZW50ICYmIHtcbiAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgIGVuZEFkb3JubWVudDogPExvYWRpbmdDb21wb25lbnQgLz4sXG4gICAgICAgICAgLi4uaW5wdXRQcm9wcy5JbnB1dFByb3BzLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgIH0sXG4gIH0pLCBbXG4gICAgc2xvdFByb3BzLFxuICAgIGlucHV0UHJvcHMsXG4gICAgcmVxdWlyZWQsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdmFyaWFudCxcbiAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgIGhhc0Vycm9yLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBoZWxwZXJUZXh0LFxuICAgIHRleHRSZWFkT25seSxcbiAgICBpbnZhbGlkLFxuICAgIG5hbWUsXG4gICAgbG9hZGluZyxcbiAgICBMb2FkaW5nQ29tcG9uZW50LFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxEYXRlUGlja2VyXG4gICAgICAvLyBTcHJlYWQgcmVzdCBwcm9wcyBmaXJzdCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuXG4gICAgICB7Li4ucmVzdFByb3BzfVxuICAgICAgey4uLnJlc3REYXRlUGlja2VyUHJvcHN9XG5cbiAgICAgIC8vIENvcmUgcHJvcHNcbiAgICAgIHJlZj17cmVmfVxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cblxuICAgICAgLy8gVUkgcHJvcHNcbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHN4PXtjb21wdXRlZFN4fVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG5cbiAgICAgIC8vIFNsb3QgcHJvcHNcbiAgICAgIHNsb3RQcm9wcz17bWVtb2l6ZWRTbG90UHJvcHN9XG5cbiAgICAgIC8vIEFjY2Vzc2liaWxpdHkgcHJvcHNcbiAgICAgIGFyaWEtaW52YWxpZD17aW52YWxpZH1cbiAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e2hhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkfVxuICAgIC8+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nXG5EYXRlUGlja2VyRWxlbWVudENvcmUuZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudENvcmUgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnRDb3JlO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUeXBlLXNhZmUgZGF0ZSB2YWx1ZSByZWFkZXIgdGhhdCBoYW5kbGVzIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgZnJvbSB0aGUgZGF0ZSBhZGFwdGVyXG4gKiBAcGFyYW0gYWRhcHRlciAtIFRoZSBsb2NhbGl6YXRpb24gY29udGV4dCBmcm9tIE1VSSBkYXRlIHBpY2tlcnNcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0IChzdHJpbmcsIGRhdGUsIG9yIG51bGwpXG4gKiBAcmV0dXJucyBQcm9wZXJseSB0eXBlZCBkYXRlIHZhbHVlIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGU+KFxuICBhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0PixcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCBURGF0ZSB8IHVuZGVmaW5lZFxuKTogVERhdGUgfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgYWRhcHRlciB0byBwYXJzZSB0aGUgc3RyaW5nIGludG8gYSBkYXRlXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICByZXR1cm4gcGFyc2VkRGF0ZSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbHVlIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+IHtcbiAgLyoqIFRoZSBmaWVsZCBjb250cm9sbGVyIGZyb20gcmVhY3QtaG9vay1mb3JtICovXG4gIGZpZWxkOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRcIl07XG4gIC8qKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgKi9cbiAgdHJhbnNmb3JtPzogRGF0ZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbHVlIGhvb2tcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZVJldHVybjxUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGU+IHtcbiAgLyoqIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBmb3IgZGlzcGxheSBpbiB0aGUgcGlja2VyICovXG4gIHZhbHVlOiBUVmFsdWUgfCBudWxsO1xuICAvKiogQ2hhbmdlIGhhbmRsZXIgZm9yIHBpY2tlciB2YWx1ZSB1cGRhdGVzICovXG4gIG9uQ2hhbmdlOiAoXG4gICAgdmFsdWU6IFRWYWx1ZSB8IG51bGwsXG4gICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIGRhdGUgcGlja2VyIHZhbHVlIHRyYW5zZm9ybWF0aW9ucyB3aXRoIHR5cGUgc2FmZXR5XG4gKiBcbiAqIFRoaXMgaG9vayBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gZm9ybSBmaWVsZCB2YWx1ZXMgYW5kIGRhdGUgcGlja2VyIHZhbHVlcyxcbiAqIGFwcGx5aW5nIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgc3RyaWN0IFR5cGVTY3JpcHQgdHlwaW5nLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBEYXkuanMgZGF0ZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICogICBmaWVsZCxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gZGF5anMoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogbnVsbFxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHZhbHVlIHRyYW5zZm9ybWF0aW9uXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB0cmFuc2Zvcm1lZCB2YWx1ZSBhbmQgY2hhbmdlIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWx1ZTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsdWVPcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZURhdGVQaWNrZXJWYWx1ZVJldHVybjxUVmFsdWU+IHtcbiAgY29uc3QgeyBmaWVsZCwgdHJhbnNmb3JtIH0gPSBvcHRpb25zO1xuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIC8vIFRyYW5zZm9ybSB0aGUgZmllbGQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlclxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCk6IFRWYWx1ZSB8IG51bGwgPT4ge1xuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtLmlucHV0KGZpZWxkLnZhbHVlKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogaGFuZGxlIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb25cbiAgICByZXR1cm4gcmVhZERhdGVQaWNrZXJWYWx1ZUFzRGF0ZShhZGFwdGVyLCBmaWVsZC52YWx1ZSkgYXMgVFZhbHVlIHwgbnVsbDtcbiAgfSwgW2ZpZWxkLnZhbHVlLCB0cmFuc2Zvcm0/LmlucHV0LCBhZGFwdGVyXSk7XG5cbiAgLy8gQ3JlYXRlIGEgc3RhYmxlIGNoYW5nZSBoYW5kbGVyXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLCBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm0ub3V0cHV0KG5ld1ZhbHVlLCBjb250ZXh0KTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZSh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IHN0b3JlIHRoZSBkYXRlIGFzLWlzXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQub25DaGFuZ2UsIHRyYW5zZm9ybT8ub3V0cHV0XVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWx1ZTsiLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMge1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYSB2YWxpZGF0aW9uIGVycm9yICovXG4gIGhhc0Vycm9yPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdGV4dCBpbnB1dCBpcyByZWFkLW9ubHkgKi9cbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBzdHlsZXMgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0cyAqL1xuICBzeD86IFN4UHJvcHM8VGhlbWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIC8qKiBDb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQgKi9cbiAgc3g6IFN4UHJvcHM8VGhlbWU+O1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3Igc3R5bGluZyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgdGhlbWUtYXdhcmUgZGF0ZSBwaWNrZXIgc3R5bGVzIHdpdGggY29uc2lzdGVudCBkZXNpZ24gc3lzdGVtIGludGVncmF0aW9uXG4gKiBcbiAqIFRoaXMgaG9vayBwcm92aWRlcyBvcHRpbWl6ZWQsIG1lbW9pemVkIHN0eWxlcyBmb3IgZGF0ZSBwaWNrZXIgY29tcG9uZW50cyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0IHRvIHRoZSBjdXJyZW50IE1VSSB0aGVtZSBhbmQgY29tcG9uZW50IHN0YXRlIChkaXNhYmxlZCwgZXJyb3IsIGxvYWRpbmcsIGV0Yy4pLlxuICogSXQgZW5zdXJlcyBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGFsbCBkYXRlIHBpY2tlciBpbnN0YW5jZXMgd2hpbGUgYWxsb3dpbmcgY3VzdG9taXphdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBsb2FkaW5nOiBpc0xvYWRpbmdcbiAqIH0pO1xuICogXG4gKiByZXR1cm4gPERhdGVQaWNrZXIgc3g9e3N4fSAuLi4gLz47XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBzeDoge1xuICogICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICBjb2xvcjogJ3ByaW1hcnkubWFpbidcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3R5bGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb21wdXRlZCBzdHlsZXMgYW5kIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyU3R5bGVzKFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyA9IHt9XG4pOiBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgY29uc3QgeyBkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seSwgc3g6IGN1c3RvbVN4IH0gPSBvcHRpb25zO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBjb21wdXRlZCBzdHlsZXMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IGNvbXB1dGVkU3ggPSB1c2VNZW1vKCgpOiBTeFByb3BzPFRoZW1lPiA9PiB7XG4gICAgY29uc3QgYmFzZVN0eWxlczogU3hQcm9wczxUaGVtZT4gPSB7XG4gICAgICAvLyBJbnB1dCBmaWVsZCBzdHlsaW5nXG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQgXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZvciBzbW9vdGggc3RhdGUgY2hhbmdlc1xuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoW1xuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgICAnYm9yZGVyLWNvbG9yJyxcbiAgICAgICAgICAnY29sb3InXG4gICAgICAgIF0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnQsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIEVycm9yIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1mb2N1c2VkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDJweCAke3RoZW1lLnBhbGV0dGUuZXJyb3IubWFpbn0yNWAsIC8vIDI1IGlzIDE1JSBvcGFjaXR5IGluIGhleFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnB1dCBlbGVtZW50IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IFwibm90LWFsbG93ZWRcIiBcbiAgICAgICAgICA6IHRleHRSZWFkT25seSBcbiAgICAgICAgICAgID8gXCJwb2ludGVyXCIgXG4gICAgICAgICAgICA6IFwidGV4dFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gUmVhZC1vbmx5IHNwZWNpZmljIHN0eWxpbmdcbiAgICAgICAgLi4uKHRleHRSZWFkT25seSAmJiAhZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCAvLyBIaWRlIHRleHQgY3Vyc29yIGluIHJlYWQtb25seSBtb2RlXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGVcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJ3YWl0XCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gUmVxdWlyZWQgZmllbGQgYXN0ZXJpc2sgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgXG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIGZvbnRTaXplOiBcIjEuMmVtXCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBMYWJlbCBzdHlsaW5nIHdpdGggYmV0dGVyIGNvbnRyYXN0XG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBoYXNFcnJvciBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnksXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGNvbnRyYXN0IGZvciBkaXNhYmxlZCBzdGF0ZVxuICAgICAgICAuLi4oZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWQsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSGVscGVyIHRleHQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlGb3JtSGVscGVyVGV4dC1yb290XCI6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIFxuICAgICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gQ2FsZW5kYXIgaWNvbiBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QWRvcm5tZW50LXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCBcbiAgICAgICAgICA6IGhhc0Vycm9yIFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmFjdGl2ZSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZvY3VzIHJpbmcgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1mb2N1c2VkXCI6IHtcbiAgICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWlufTUwYCwgLy8gNTAgaXMgMzElIG9wYWNpdHlcbiAgICAgICAgb3V0bGluZU9mZnNldDogXCIycHhcIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuaGFuY2VkIGNvbnRyYXN0IGZvciBkYXJrIHRoZW1lc1xuICAgICAgLi4uKHRoZW1lLnBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnICYmIHtcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIHdpdGggY3VzdG9tIHN0eWxlc1xuICAgIHJldHVybiBjdXN0b21TeCA/IFtiYXNlU3R5bGVzLCBjdXN0b21TeF0gYXMgU3hQcm9wczxUaGVtZT4gOiBiYXNlU3R5bGVzO1xuICB9LCBbXG4gICAgdGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgY3VzdG9tU3gsXG4gIF0pO1xuXG4gIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIGV4dGVybmFsIHN0eWxpbmcgaG9va3NcbiAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBpZiAoZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWRpc2FibGVkJyk7XG4gICAgaWYgKGhhc0Vycm9yKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1lcnJvcicpO1xuICAgIGlmIChsb2FkaW5nKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1sb2FkaW5nJyk7XG4gICAgaWYgKHRleHRSZWFkT25seSkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tcmVhZE9ubHknKTtcbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPiAwID8gY2xhc3Nlcy5qb2luKCcgJykgOiB1bmRlZmluZWQ7XG4gIH0sIFtkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seV0pO1xuXG4gIHJldHVybiB7XG4gICAgc3g6IGNvbXB1dGVkU3gsXG4gICAgY2xhc3NOYW1lLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyU3R5bGVzOyIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSBmb3IgY3JlYXRpbmcgYnJhbmRlZCBkYXRlIHR5cGVzIHRvIHByZXZlbnQgbWl4aW5nIGRpZmZlcmVudCBkYXRlIGZvcm1hdHNcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBiYXNlIGRhdGUgdHlwZVxuICogQHRlbXBsYXRlIFRCcmFuZCAtIFRoZSBicmFuZCBzdHJpbmcgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kZWREYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlLCBUQnJhbmQgZXh0ZW5kcyBzdHJpbmc+ID0gXG4gIFREYXRlICYgeyByZWFkb25seSBfX2JyYW5kOiBUQnJhbmQgfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS1saWtlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaWNrZXJWYWxpZERhdGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBEYXRlIG9iamVjdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGRhdGUtbGlrZSBvYmplY3RzIHdpdGggY29tbW9uIGRhdGUgbGlicmFyeSBtZXRob2RzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgLy8gRGF5LmpzLCBNb21lbnQuanMsIG9yIHNpbWlsYXJcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMdXhvbiBEYXRlVGltZVxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGFyc2VhYmxlIGRhdGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNhYmxlRGF0ZVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJhc2ljIElTTyBkYXRlIGZvcm1hdCBjaGVja1xuICBjb25zdCBpc29EYXRlUmVnZXggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezN9KT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xuXG4gIGlmIChpc29EYXRlUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIERhdGUgY29uc3RydWN0b3IgY2FuIHBhcnNlIGl0XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICByZXR1cm4gIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGUgcGlja2VyIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgZGF0ZSBhZGFwdGVyIGZyb20gTVVJIGxvY2FsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4pIHtcbiAgcmV0dXJuICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogVERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlKHBhcnNlZCkgPyAocGFyc2VkIGFzIFREYXRlKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGRhdGUgcGlja2VyIHZhbHVlcyBiYWNrIHRvIGZvcm0gdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCB0byB1c2UgZm9yIHN0cmluZyBjb252ZXJzaW9uIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZGF0ZXMgdG8gZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVPdXRwdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oZm9ybWF0Pzogc3RyaW5nKSB7XG4gIHJldHVybiAodmFsdWU6IFREYXRlIHwgbnVsbCk6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIC8vIElmIG5vIGZvcm1hdCBzcGVjaWZpZWQsIHJldHVybiB0aGUgZGF0ZSBhcy1pc1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGRhdGUgbGlicmFyeSBmb3JtYXRzXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdpc28nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtb25seScpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEYXkuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBNb21lbnQuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBMdXhvbiBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBkZWZhdWx0IGRhdGUgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGVcbiAqIEByZXR1cm5zIERlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRlUGlja2VyQ29uZmlnPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPigpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBEZWZhdWx0IHNsb3QgcHJvcHMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAgICBzbG90UHJvcHM6IHtcbiAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICB2YXJpYW50OiAnb3V0bGluZWQnIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgZ3JpZCBwcm9wcyBmb3IgbGF5b3V0IGNvbnNpc3RlbmN5XG4gICAgZ3JpZFByb3BzOiB7XG4gICAgICBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gYXMgY29uc3QsXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IHZhbGlkYXRpb24gY29uZmlndXJhdGlvblxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAgICAgICAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICAgICAgICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBzYWZlbHkgZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciB0eXBlc1xuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCAoY291bGQgYmUgZnJvbSByZWFjdC1ob29rLWZvcm0gb3IgTVVJIGRhdGUgcGlja2VyKVxuICogQHJldHVybnMgQSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgLy8gUmVhY3QgSG9vayBGb3JtIEZpZWxkRXJyb3JcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gTVVJIERhdGVWYWxpZGF0aW9uRXJyb3JcbiAgICBpZiAoJ3R5cGUnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gKGVycm9yIGFzIGFueSkudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gZWFybHknO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGxhdGUnO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGlzIG5vdCBhdmFpbGFibGUnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBkYXRlIHNlbGVjdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdJbnZhbGlkIGlucHV0Jztcbn1cblxuLyoqXG4gKiBQZXJmb3JtYW5jZSB1dGlsaXR5IHRvIGNyZWF0ZSBzdGFibGUgcmVmZXJlbmNlcyBmb3IgY29tcGxleCBwcm9wc1xuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2luZyBjb21wbGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgaW4gdXNlTWVtby91c2VDYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhYmxlS2V5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oY29uZmlnOiBUKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyBmb3IgY29uc2lzdGVudCBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICBzb3J0ZWRba10gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykuc29ydCgpLmpvaW4oJy0nKTtcbiAgfVxufSIsICJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5XCI7XG5pbXBvcnQgVmlzaWJpbGl0eU9mZiBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEljb25CdXR0b25Qcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFBhc3N3b3JkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcInBhc3N3b3JkXCIgfCBcInVzZXIuY3VycmVudFBhc3N3b3JkXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIENvbG9yIG9mIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uIGJ1dHRvblxuICAgKiBAZGVmYXVsdFZhbHVlIFwiZGVmYXVsdFwiXG4gICAqL1xuICBpY29uQ29sb3I/OiBJY29uQnV0dG9uUHJvcHNbXCJjb2xvclwiXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59O1xuXG50eXBlIFBhc3N3b3JkRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IChwYXNzd29yZCkgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBlbmRBZG9ybm1lbnQgPSAoXG4gICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPXtcImVuZFwifT5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIG9uTW91c2VEb3duPXsoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmQoIXBhc3N3b3JkKX1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICBjb2xvcj17aWNvbkNvbG9yID8/IFwiZGVmYXVsdFwifVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gXCJwYXNzd29yZFwiIDogXCJ0ZXh0XCJ9XG4gICAgICB2YWx1ZT17ZmllbGQudmFsdWV9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbnlvbmUgdXNpbmcgdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAvLyBiZWNhdXNlIG5vdyB3ZSBhcmUgcGFzc2luZyBldmVudCBpbnN0ZWFkIG9mIGV2ZW50LnRhcmdldC52YWx1ZSBvciArZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXN0Lm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHsuLi4odHlwZW9mIHNsb3RQcm9wcyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHtcbiAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1tcInNsb3RQcm9wc1wiXSxcbiAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBwYXNzd29yZCBUZXh0RmllbGQgd2l0aCBzaG93L2hpZGUgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgcGFzc3dvcmQgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIGEgYnVpbHQtaW4gdmlzaWJpbGl0eSB0b2dnbGUgYnV0dG9uLiBUaGUgcGFzc3dvcmRcbiAqIGNhbiBiZSBzaG93biBvciBoaWRkZW4gYnkgY2xpY2tpbmcgdGhlIGV5ZSBpY29uIGluIHRoZSBpbnB1dCdzIGVuZCBhZG9ybm1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIFBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSB2aXNpYmlsaXR5IGljb25zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnLFxuICogICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogOCwgbWVzc2FnZTogJ01pbmltdW0gOCBjaGFyYWN0ZXJzJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGljb24gY29sb3I6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiQ29uZmlybSBQYXNzd29yZFwiXG4gKiAgIGljb25Db2xvcj1cInByaW1hcnlcIlxuICogICBwbGFjZWhvbGRlcj1cIlJlLWVudGVyIHlvdXIgcGFzc3dvcmRcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld1Bhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJOZXcgUGFzc3dvcmRcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcmVuZGVySWNvbj17KGhpZGRlbikgPT4gaGlkZGVuID8gPEN1c3RvbUhpZGVJY29uIC8+IDogPEN1c3RvbVNob3dJY29uIC8+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5QYXNzd29yZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlBhc3N3b3JkRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBQYXNzd29yZEVsZW1lbnQ7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBSYWRpb0dyb3VwUHJvcHMsXG4gIFJhZGlvUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIFJhZGlvLFxuICBSYWRpb0dyb3VwLFxuICB1c2VUaGVtZSxcbiAgR3JpZFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSBcIi4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybVwiO1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgUHJpbWl0aXZlVmFsdWU+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+ICZcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4ge1xuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG4gIHR5cGU/OiBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiYm9vbGVhblwiO1xuICBlbXB0eU9wdGlvbkxhYmVsPzogc3RyaW5nO1xuICBvbkNoYW5nZT86ICh2YWx1ZTogVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvbiB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgcmV0dXJuT2JqZWN0PzogYm9vbGVhbjtcbiAgcm93PzogYm9vbGVhbjtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCBcImxhYmVsXCIgfCBcImNvbnRyb2xcIiB8IFwidmFsdWVcIj47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgXCJyZXF1aXJlZFwiIHwgXCJlcnJvclwiPjtcbiAgcmFkaW9Qcm9wcz86IFJhZGlvUHJvcHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICB2YWx1ZTogVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvbiB8IHVuZGVmaW5lZFxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFJhZGlvQnV0dG9uR3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiaWRcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwibGFiZWxcIixcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiZGlzYWJsZWRcIlxuPihwcm9wczogUmFkaW9CdXR0b25Hcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+KSB7XG4gIGNvbnN0IHtcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG5hbWUsXG4gICAgbGFiZWxLZXkgPSBcImxhYmVsXCIgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gXCJpZFwiIGFzIFRWYWx1ZUtleSxcbiAgICBkaXNhYmxlZEtleSA9IFwiZGlzYWJsZWRcIiBhcyBURGlzYWJsZWRLZXksXG4gICAgcmVxdWlyZWQsXG4gICAgZW1wdHlPcHRpb25MYWJlbCxcbiAgICByZXR1cm5PYmplY3QsXG4gICAgcm93LFxuICAgIGNvbnRyb2wsXG4gICAgdHlwZSxcbiAgICBsYWJlbFByb3BzLFxuICAgIGRpc2FibGVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIHJhZGlvUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvblxuICA+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgKFwiXCIgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcbiAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtPy5vdXRwdXRcbiAgICAgICAgICA6IChfZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgb25SYWRpb0NoYW5nZTogUmFkaW9Hcm91cFByb3BzW1wib25DaGFuZ2VcIl0gPSAoZXZlbnQsIHJhZGlvVmFsdWUpID0+IHtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHJldHVybk9iamVjdFxuICAgICAgPyAob3B0aW9ucyBhcyBUT3B0aW9uW10pLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uW3ZhbHVlS2V5XSA9PT0gcmFkaW9WYWx1ZSlcbiAgICAgIDogcmFkaW9WYWx1ZSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG5cbiAgICBvbkNoYW5nZShldmVudCwgcmV0dXJuVmFsdWUpO1xuICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXN0Lm9uQ2hhbmdlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPFJhZGlvR3JvdXAgb25DaGFuZ2U9e29uUmFkaW9DaGFuZ2V9IG5hbWU9e25hbWV9IHJvdz17cm93fSB2YWx1ZT17dmFsdWV9PlxuICAgICAgICB7ZW1wdHlPcHRpb25MYWJlbCAmJiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxSYWRpb1xuICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBjaGVja2VkPXshdmFsdWV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYWJlbD17ZW1wdHlPcHRpb25MYWJlbH1cbiAgICAgICAgICAgIHZhbHVlPVwiXCJcbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvblt2YWx1ZUtleV07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSBvcHRpb25bZGlzYWJsZWRLZXldIHx8IGZhbHNlO1xuICAgICAgICAgIGxldCB2YWw6IFRPcHRpb25bVFZhbHVlS2V5XSB8IHVuZGVmaW5lZCA9IHJldHVybk9iamVjdFxuICAgICAgICAgICAgPyAodmFsdWUgYXMgVE9wdGlvbik/Llt2YWx1ZUtleV1cbiAgICAgICAgICAgIDogdmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbCA9IE51bWJlcih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBCb29sZWFuKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHZhbCA9PT0gb3B0aW9uS2V5O1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG9wdGlvbktleSl9XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBvcHRpb25EaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25LZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgIHtlcnJvciAmJiA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD59XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IFJhZGlvQnV0dG9uR3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiaWRcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwibGFiZWxcIixcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiZGlzYWJsZWRcIlxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbiwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbiwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gey4uLnByb3BzfSAvPjtcbn07XG5cblJhZGlvQnV0dG9uR3JvdXAuZGlzcGxheU5hbWUgPSBcIlJhZGlvQnV0dG9uR3JvdXBcIjtcblxuZXhwb3J0IGRlZmF1bHQgUmFkaW9CdXR0b25Hcm91cDtcbiIsICJpbXBvcnQge1xuICBHcmlkLFxuICB1c2VUaGVtZSxcbiAgVGV4dEZpZWxkLFxuICB0eXBlIFN4UHJvcHMsXG4gIEF1dG9jb21wbGV0ZSxcbiAgdHlwZSBHcmlkUHJvcHMsXG4gIHR5cGUgQ2hpcFR5cGVNYXAsXG4gIHR5cGUgVGV4dEZpZWxkUHJvcHMsXG4gIHR5cGUgVGV4dEZpZWxkVmFyaWFudHMsXG4gIHR5cGUgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb250cm9sLFxuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbiAgdHlwZSBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnIHwgJ2dldE9wdGlvbkxhYmVsJyB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzeD86IFN4UHJvcHM7XG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIGxhYmVsS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG59O1xuXG50eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50Q29tcG9uZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oXG4gIHByb3BzOiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnLFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zLFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgc3gsXG4gICAgaXNFZGl0ID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3QgZ2V0T3B0aW9uS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpIHJldHVybiBvcHRpb247XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXkgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlS2V5XVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleSBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmPFRPcHRpb24+KGRlcGVuZGVudEZpZWxkLnZhbHVlID8/IG51bGwpO1xuICBjb25zdCBbaGFzQXV0b1NlbGVjdGVkLCBzZXRIYXNBdXRvU2VsZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgKCEhZGVwZW5kZW50RmllbGQudmFsdWUgJiYgcGFyZW50VmFsdWVSZWY/LmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IG51bGxcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtkZXBlbmRlbnRGaWVsZC52YWx1ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzRWRpdCAmJiAhZGlzYWJsZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgICAgIHNldEhhc0F1dG9TZWxlY3RlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGZpZWxkLnZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGhhc0F1dG9TZWxlY3RlZCxcbiAgICBpc0VkaXQsXG4gICAgZGlzYWJsZWQsXG4gICAgZmllbGQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGRlcGVuZGVudEZpZWxkLm9uQ2hhbmdlLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiAoZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGZpZWxkLnZhbHVlID8gb3B0aW9uIDogbnVsbCkpXG4gICAgICAgICAgLmZpbmQoQm9vbGVhbikgfHwgbnVsbFxuICAgICAgfVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsIHx8IGRpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSA/IGdldE9wdGlvbktleShuZXdWYWx1ZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdCc6IHtcbiAgICAgICAgICAgICAgYmdjb2xvcjpcbiAgICAgICAgICAgICAgICBkaXNhYmxlZCB8fCBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrJzogeyBjb2xvcjogJ3JlZCcgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dEJhc2UtaW5wdXQnOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgfHwgZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCA/ICdub3QtYWxsb3dlZCcgOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RDYXNjYWRlRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdENhc2NhZGVFbGVtZW50O1xuIiwgImltcG9ydCB7IEdyaWQsIHVzZVRoZW1lLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVZhbHVlLFxuICBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24sXG4gIEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgdXNlTWVtbyxcbiAgdHlwZSBKU1gsXG4gIHVzZUVmZmVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHR5cGUgU3ludGhldGljRXZlbnQsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb250cm9sLFxuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbiAgdHlwZSBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFNlbGVjdEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFtcImRlZmF1bHRDb21wb25lbnRcIl1cbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8IFwibmFtZVwiXG4gIHwgXCJyZW5kZXJJbnB1dFwiXG4gIHwgXCJpc09wdGlvbkVxdWFsVG9WYWx1ZVwiXG4gIHwgXCJnZXRPcHRpb25MYWJlbFwiXG4gIHwgXCJkaXNhYmxlZFwiXG4+ICYge1xuICAvKipcbiAgICogVmFsaWRhdGlvbiBydWxlcyBmb3IgdGhlIGZpZWxkXG4gICAqIEBleGFtcGxlIHsgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGFuIG9wdGlvbicgfVxuICAgKi9cbiAgcnVsZXM/OiBVc2VDb250cm9sbGVyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJydWxlc1wiXTtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiY2F0ZWdvcnlcIiB8IFwidXNlci5kZXBhcnRtZW50XCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBzZWxlY3QgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJDaG9vc2UgYW4gb3B0aW9uLi4uXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJDYXRlZ29yeVwiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGVkaXQgbW9kZSAoYWZmZWN0cyBhdXRvLXNlbGVjdGlvbiBiZWhhdmlvcilcbiAgICogV2hlbiBmYWxzZSBhbmQgb25seSBvbmUgb3B0aW9uIGV4aXN0cywgdGhhdCBvcHRpb24gaXMgYXV0by1zZWxlY3RlZFxuICAgKiBAZGVmYXVsdFZhbHVlIGZhbHNlXG4gICAqL1xuICBpc0VkaXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VsZWN0IGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBpbiBvcHRpb24gb2JqZWN0cyB0byB1c2UgYXMgZGlzcGxheSBsYWJlbFxuICAgKiBAZGVmYXVsdFZhbHVlIFwiTGFiZWxcIlxuICAgKiBAZXhhbXBsZSBcIm5hbWVcIiB8IFwidGl0bGVcIlxuICAgKi9cbiAgbGFiZWxLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBpbiBvcHRpb24gb2JqZWN0cyB0byB1c2UgYXMgdGhlIHZhbHVlXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJWYWx1ZVwiXG4gICAqIEBleGFtcGxlIFwiaWRcIiB8IFwiY29kZVwiXG4gICAqL1xuICB2YWx1ZUtleT86IGtleW9mIFRPcHRpb247XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsIFwibmFtZVwiPjtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdEVsZW1lbnQ8XG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwW1wiZGVmYXVsdENvbXBvbmVudFwiXVxuPihcbiAgcHJvcHM6IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25DaGFuZ2UsXG4gICAgaXNFZGl0LFxuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgc3gsXG4gICAgdmFyaWFudCxcbiAgICBkaXNhYmxlZCxcbiAgICBsYWJlbEtleSA9IFwiTGFiZWxcIixcbiAgICB2YWx1ZUtleSA9IFwiVmFsdWVcIixcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcInN0cmluZ1wiKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlS2V5XSA6IG51bGw7IC8vIFJldHVybiBudWxsIGZvciBjb25zaXN0ZW5jeVxuICAgIH0sXG4gICAgW3ZhbHVlS2V5XVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwic3RyaW5nXCIpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsS2V5XSkgOiBcIlwiO1xuICAgIH0sXG4gICAgW2xhYmVsS2V5XVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBldmVudDogU3ludGhldGljRXZlbnQsXG4gICAgbmV3VmFsdWU6IEF1dG9jb21wbGV0ZVZhbHVlPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbz4sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gbmV3VmFsdWUgYXMgVE9wdGlvbiB8IG51bGw7XG5cbiAgICBmaWVsZC5vbkNoYW5nZShvcHRpb24gPyBnZXRPcHRpb25WYWx1ZShvcHRpb24pIDogbnVsbCk7XG4gICAgb25DaGFuZ2U/LihldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICAhaXNFZGl0ICYmXG4gICAgICBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgKGZpZWxkLnZhbHVlID09IG51bGwgfHwgZmllbGQudmFsdWUgPT0gdW5kZWZpbmVkIHx8IGZpZWxkLnZhbHVlID09PSBcIlwiKVxuICAgICkge1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbiA9IG9wdGlvbnNbMF07XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBnZXRPcHRpb25WYWx1ZShkZWZhdWx0T3B0aW9uKTtcblxuICAgICAgZmllbGQub25DaGFuZ2UoZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gIH0sIFtpc0VkaXQsIG9wdGlvbnNdKTtcblxuICBjb25zdCBhdXRvY29tcGxldGVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBmaWVsZC52YWx1ZSkgPz8gbnVsbCxcbiAgICBbZmllbGQudmFsdWUsIG9wdGlvbnMsIGdldE9wdGlvblZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnM9e2ZhbHNlfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgYXV0b2NvbXBsZXRlVmFsdWUgYXMgQXV0b2NvbXBsZXRlVmFsdWU8XG4gICAgICAgICAgVE9wdGlvbixcbiAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgICAgICAgIEZyZWVTb2xvXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBnZXRPcHRpb25MYWJlbD17KFxuICAgICAgICBvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz5cbiAgICAgICkgPT4gZ2V0T3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlwifVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiBcIm91dGxpbmVkXCJ9XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgICAgICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBBdXRvY29tcGxldGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgZnJvbSBwcmVkZWZpbmVkIG9wdGlvbnMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHNlbGVjdC9hdXRvY29tcGxldGUgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSwgaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICogZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy4gSXQgc3VwcG9ydHMgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b2NvbXBsZXRlIHdpdGggZmlsdGVyaW5nXG4gKiAtIFNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIHN1cHBvcnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG9wdGlvbiBkaXNwbGF5IChsYWJlbEtleS92YWx1ZUtleSlcbiAqIC0gQXV0by1zZWxlY3Rpb24gd2hlbiBvbmx5IG9uZSBvcHRpb24gZXhpc3RzXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY2F0ZWdvcnlcIlxuICogICBsYWJlbD1cIkNhdGVnb3J5XCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgTGFiZWw6ICdUZWNobm9sb2d5JywgVmFsdWU6ICd0ZWNoJyB9LFxuICogICAgIHsgTGFiZWw6ICdGaW5hbmNlJywgVmFsdWU6ICdmaW5hbmNlJyB9XG4gKiAgIF19XG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5JyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBrZXlzOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcklkXCJcbiAqICAgbGFiZWw9XCJBc3NpZ24gdG8gVXNlclwiXG4gKiAgIG9wdGlvbnM9e3VzZXJzfVxuICogICBsYWJlbEtleT1cImZ1bGxOYW1lXCJcbiAqICAgdmFsdWVLZXk9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwW1wiZGVmYXVsdENvbXBvbmVudFwiXVxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5TZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJTZWxlY3RFbGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdEVsZW1lbnQ7XG4iLCAiaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94JztcbmltcG9ydCBDaGVja0JveE91dGxpbmVCbGFua0ljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIENoZWNrYm94LCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSwgQ2lyY3VsYXJQcm9ncmVzcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBKU1gsIFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFBhdGgsIENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMsIFVzZUNvbnRyb2xsZXJQcm9wcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4vL0B0cy1ub2NoZWNrXG5cbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG50eXBlIEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUsXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8VE9wdGlvbiwgTXVsdGlwbGUsIERpc2FibGVDbGVhcmFibGUsIEZyZWVTb2xvLCBDaGlwQ29tcG9uZW50PixcbiAgJ25hbWUnIHwgJ3JlbmRlcklucHV0JyB8ICdtdWx0aXBsZScgfCAnb25DaGFuZ2UnIHwgJ3ZhbHVlJ1xuPjtcblxuZXhwb3J0IHR5cGUgU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8VE9wdGlvbiwgTXVsdGlwbGUsIERpc2FibGVDbGVhcmFibGUsIEZyZWVTb2xvLCBDaGlwQ29tcG9uZW50PiAmIHtcbiAgcnVsZXM/OiBVc2VDb250cm9sbGVyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5bJ3J1bGVzJ107XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBzeD86IFN4UHJvcHM7XG4gIGxhYmVsS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xufTtcblxudHlwZSBTZWxlY3RNdWx0aUVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zLFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUtleV0gOiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bbGFiZWxLZXldIDogJyc7XG4gIH07XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgZmllbGQudmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSlcbiAgICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gZmllbGQudmFsdWUuaW5jbHVkZXMoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkpXG4gICAgICA6IFtdO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBfOiBTeW50aGV0aWNFdmVudCxcbiAgICBzZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnY2xlYXInKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShbXSk7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICdzZWxlY3RPcHRpb24nIHx8IHJlYXNvbiA9PT0gJ3JlbW92ZU9wdGlvbicpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHNlbGVjdGVkT3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSk7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGljb24gPSA8Q2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcbiAgY29uc3QgY2hlY2tlZEljb24gPSA8Q2hlY2tCb3hJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICB2YWx1ZT17c2VsZWN0ZWRWYWx1ZX1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSl9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGRpc2FibGVDbG9zZU9uU2VsZWN0XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCA/PyBmaWVsZC5kaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wczEsIG9wdGlvbiwgeyBzZWxlY3RlZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcHJvcHMxO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAgPENoZWNrYm94IGljb249e2ljb259IGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn0gY2hlY2tlZD17c2VsZWN0ZWR9IC8+XG4gICAgICAgICAgICB7Z2V0T3B0aW9uTGFiZWwob3B0aW9uIGFzIFRPcHRpb24pfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgcmVuZGVySW5wdXQ9eyhwYXJhbXMpID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdE11bHRpRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5TZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0TXVsdGlFbGVtZW50JztcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0TXVsdGlFbGVtZW50O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBTeFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUHJvcHNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIG1pbkxlbmd0aDogeyB2YWx1ZTogMywgbWVzc2FnZTogJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyB9IH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsIFwibmFtZVwiPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xufVxuXG50eXBlIFRleHRGaWVsZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihcbiAgcHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBydWxlcyA9IHt9LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIGdyaWRQcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAoXCJcIiBhcyBUVmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgICAgOiAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHVzaW5nIHRyYW5zZm9ybS5vdXRwdXRcbiAgICAgICAgLy8gYmVjYXVzZSBub3cgd2UgYXJlIHBhc3NpbmcgZXZlbnQgaW5zdGVhZCBvZiBldmVudC50YXJnZXQudmFsdWUgb3IgK2V2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogaGVscGVyVGV4dH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHN4PXt7XG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgVGV4dEZpZWxkIHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gTnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJmaXJzdE5hbWVcIlxuICogICBsYWJlbD1cIkZpcnN0IE5hbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0ZpcnN0IG5hbWUgaXMgcmVxdWlyZWQnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgdHlwZT1cImVtYWlsXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBOdW1iZXIgaW5wdXQgd2l0aCB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgdGV4dEZpZWxkUHJvcHM9e3sgdHlwZTogJ251bWJlcicgfX1cbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWU/LnRvU3RyaW5nKCkgfHwgJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRleHRGaWVsZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlRleHRGaWVsZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dEZpZWxkRWxlbWVudDtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgU3hQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclByb3BzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXJcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSwgdHlwZSBGaWVsZFR5cGUgfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZmllbGRcbiAgICogQGV4YW1wbGUgeyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLCBtaW5MZW5ndGg6IHsgdmFsdWU6IDMsIG1lc3NhZ2U6ICdNaW5pbXVtIDMgY2hhcmFjdGVycycgfSB9XG4gICAqL1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsIFwibmFtZVwiPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB2b2lkO1xuICAvKipcbiAgICogRW5hYmxlIGRldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb24gaXNzdWVzXG4gICAqIEBkZWZhdWx0VmFsdWUgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICovXG4gIGVuYWJsZVdhcm5pbmdzPzogYm9vbGVhbjtcbn1cblxudHlwZSBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+KFxuICBwcm9wczogRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKSA9PiBSZWFjdC5KU1guRWxlbWVudDtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPihwcm9wczogRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcnVsZXMgPSB7fSxcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBncmlkUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIGZpZWxkVHlwZSA9ICd0ZXh0JywgLy8gRGVmYXVsdCB0byB0ZXh0IHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICBlbmFibGVXYXJuaW5ncyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgcnVsZXMsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICAvLyBVc2UgdGhlIGVuaGFuY2VkIHRyYW5zZm9ybSBob29rIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSA/IHtcbiAgICAgIGlucHV0OiB0cmFuc2Zvcm0uaW5wdXQsXG4gICAgICBvdXRwdXQ6IHRyYW5zZm9ybS5vdXRwdXQsXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm0gPyAodHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6IGZpZWxkVHlwZSkgOiB1bmRlZmluZWQsIC8vIEF1dG8tZGV0ZWN0IG51bWJlciB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGVuYWJsZVdhcm5pbmdzLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHN4PXt7XG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEFuIGVuaGFuY2VkIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIFRoaXMgZW5oYW5jZWQgdmVyc2lvbiBwcm92aWRlcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9yaWdpbmFsIFRleHRGaWVsZEVsZW1lbnRcbiAqIHBsdXMgYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nIChudW1iZXIsIHRleHQsIGV0Yy4pXG4gKiAtIEJldHRlciBUeXBlU2NyaXB0IGluZmVyZW5jZSBhbmQgdHlwZSBzYWZldHlcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqIC0gRW5oYW5jZWQgZXJyb3IgaGFuZGxpbmcgd2l0aCBjdXN0b20gcGFyc2VFcnJvciBzdXBwb3J0XG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydCAoYmFja3dhcmQgY29tcGF0aWJsZSlcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIEVuaGFuY2VkIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb24gKGJhY2t3YXJkIGNvbXBhdGlibGUpOlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgU3hQcm9wcyxcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBHcmlkLCB1c2VGb3JrUmVmLCB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgVGltZVBpY2tlclByb3BzLFxuICBUaW1lUGlja2VyU2xvdFByb3BzLFxuICBUaW1lVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IFRpbWVQaWNrZXIgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIFBhdGhWYWx1ZSxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIFVzZUNvbnRyb2xsZXJQcm9wcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBVc2VUcmFuc2Zvcm1PcHRpb25zLCBVc2VUcmFuc2Zvcm1SZXR1cm4gfSBmcm9tIFwiQC9ob29rc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGVcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpIGFzIFREYXRlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4oXG4gIG9wdGlvbnM6IFVzZVRyYW5zZm9ybU9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlVHJhbnNmb3JtUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4ge1xuICBjb25zdCB2YWx1ZSA9XG4gICAgdHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IG9wdGlvbnMudHJhbnNmb3JtLmlucHV0KG9wdGlvbnMudmFsdWUpXG4gICAgICA6IG9wdGlvbnMudmFsdWU7XG5cbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoLi4uZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShvcHRpb25zLnRyYW5zZm9ybS5vdXRwdXQoLi4uZXZlbnQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMub25DaGFuZ2UoLi4uZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29wdGlvbnNdXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZVxuPiB7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGlzRGF0ZT86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBUaW1lVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGlucHV0UHJvcHM/OiBUZXh0RmllbGRQcm9wcztcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzW1wiaGVscGVyVGV4dFwiXTtcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICBzbG90UHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJTbG90UHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgXCJ0ZXh0RmllbGRcIlxuICA+O1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlIHwgbnVsbDtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICB2YWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PFRpbWVWYWxpZGF0aW9uRXJyb3I+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgdGltZVBpY2tlclByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyUHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgXCJ2YWx1ZVwiIHwgXCJzbG90UHJvcHNcIlxuICA+O1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIHN4PzogU3hQcm9wcztcbn1cblxudHlwZSBUaW1lUGlja2VyRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4oXG4gIHByb3BzOiBUaW1lUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRpbWVQaWNrZXJFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZVxuPihwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkLFxuICAgIGlucHV0UHJvcHMsXG4gICAgY29udHJvbCxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICBzeCxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IGRpc2FibGVkLCBpbnB1dFJlZiwgb25DbG9zZSwgLi4ucmVzdFRpbWVQaWNrZXJQcm9wcyB9ID1cbiAgICB0aW1lUGlja2VyUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSB8IG51bGw+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKG5ld1ZhbHVlKSA9PiByZWFkVmFsdWVBc0RhdGUoYWRhcHRlciwgbmV3VmFsdWUpLFxuICAgICAgb3V0cHV0OiAob3V0cHV0VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKG91dHB1dFZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gb3V0cHV0VmFsdWU7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUaW1lUGlja2VyXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGltZVBpY2tlclByb3BzfVxuICAgICAgey4uLmZpZWxkfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgey4uLnRpbWVQaWNrZXJQcm9wc31cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIG9uQ2xvc2U9eyguLi5hcmdzKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KG5ld1ZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgfSxcbiAgICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogW1wiY2xlYXJcIiwgXCJjYW5jZWxcIiwgXCJhY2NlcHRcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICAgIG9uQmx1cjogKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBpbnB1dFByb3BzLm9uQmx1cihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICBoZWxwZXJUZXh0OiBlcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IGlucHV0UHJvcHM/LmhlbHBlclRleHQgfHwgcmVzdC5oZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiAhIXRleHRSZWFkT25seSxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lUGlja2VyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRpbWVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJUaW1lUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBUaW1lUGlja2VyRWxlbWVudDtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7OztBQUFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxnQkFBZ0I7QUFDekIsU0FBZ0IsYUFBYSxXQUFXLFlBQVksZUFBZTtBQUNuRSxTQUFTLHFCQUFxQjtBQW9MaEIsbUJBQ29CLEtBRHBCO0FBL0pkLElBQU0sZUFBK0I7QUFBQSxFQUNuQyxTQUFTLENBQUM7QUFBQSxFQUNWLGlCQUFpQixDQUFDO0FBQUEsRUFDbEIsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsZUFBZTtBQUNqQjtBQUVBLFNBQVMsaUJBQWlCLE9BQXVCLFFBQXlDO0FBQ3hGLFVBQVEsT0FBTyxNQUFNO0FBQUEsSUFDbkIsS0FBSztBQUNILGFBQU8sRUFBRSxHQUFHLE9BQU8sU0FBUyxPQUFPLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFDN0QsS0FBSztBQUNILGFBQU8sRUFBRSxHQUFHLE9BQU8saUJBQWlCLE9BQU8sUUFBUTtBQUFBLElBQ3JELEtBQUs7QUFDSCxhQUFPLEVBQUUsR0FBRyxPQUFP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SUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtBQUFBLEVBQy9ELEdBQUc7QUFDTCxNQUErRTtBQUM3RSxNQUFJLFdBQVc7QUFDYixXQUNFLGdCQUFBSDtBQUFBLE1BQUNOO0FBQUEsTUFBQTtBQUFBLFFBQ0UsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxVQUFVO0FBQUEsUUFFckUsMEJBQUFNLE1BQUNFLGFBQUEsRUFBVyxHQUFHLE9BQU87QUFBQTtBQUFBLElBQ3hCO0FBQUEsRUFFSjtBQUVBLFNBQU8sZ0JBQUFGLE1BQUNFLGFBQUEsRUFBVyxHQUFHLE9BQU87QUFDL0I7QUFFQUMsbUJBQWtCLGNBQWM7QUFFaEMsSUFBTyw0QkFBUUE7IiwKICAibmFtZXMiOiBbIkdyaWQiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJ1c2VUaGVtZSIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgIkNoZWNrYm94RWxlbWVudCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIkZvcm1Db250cm9sIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUdyb3VwIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkdyaWQiLCAidXNlRWZmZWN0IiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkNoZWNrYm94R3JvdXAiLCAiR3JpZCIsICJmb3J3YXJkUmVmIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZU1lbW8iLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJqc3giLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgImpzeCIsICJmb3J3YXJkUmVmIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAiR3JpZCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAicGFzc3dvcmQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJ1c2VUaGVtZSIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VUaGVtZSIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgInVzZVN0YXRlIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCAiR3JpZCIsICJ1c2VUaGVtZSIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgInVzZU1lbW8iLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJDaXJjdWxhclByb2dyZXNzIiwgIkZyYWdtZW50IiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIlNlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VUaGVtZSIsICJ2YWx1ZSIsICJ1c2VGb3JrUmVmIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VUaGVtZSIsICJ1c2VGb3JrUmVmIiwgIkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAidXNlRm9ya1JlZiIsICJ1c2VUaGVtZSIsICJ1c2VMb2NhbGl6YXRpb25Db250ZXh0IiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgInVzZVRyYW5zZm9ybSIsICJDb21wb25lbnQiLCAiVGltZVBpY2tlckVsZW1lbnQiXQp9Cg==