@gnwebsoft/ui 4.0.49 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2742 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-PW777IOX.js";
5
- import {
6
- readValueAsDate
7
- } from "./chunk-N37HXJT5.js";
8
-
9
- // src/wrappers/types/common.ts
10
- function isValidOption(value) {
11
- return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
12
- }
13
- function normalizeOptions(options, labelField = "Label", valueField = "Value") {
14
- return options.map((option) => ({
15
- Label: String(option[labelField] ?? ""),
16
- Value: option[valueField],
17
- disabled: Boolean(option.disabled)
18
- }));
19
- }
20
-
21
- // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
22
- import {
23
- Autocomplete,
24
- CircularProgress,
25
- debounce,
26
- Grid,
27
- TextField,
28
- useTheme
29
- } from "@mui/material";
30
- import match from "autosuggest-highlight/match";
31
- import parse from "autosuggest-highlight/parse";
32
- import {
33
- useState,
34
- useRef,
35
- useMemo,
36
- useEffect,
37
- useCallback,
38
- Fragment
39
- } from "react";
40
- import { useController } from "react-hook-form";
41
- import { jsx, jsxs } from "react/jsx-runtime";
42
- var Component = function AsyncSelectMultiElement(props) {
43
- const {
44
- name,
45
- disabled,
46
- control,
47
- placeholder,
48
- label,
49
- queryFn,
50
- variant,
51
- labelField = "Label",
52
- valueField = "Value",
53
- ...rest
54
- } = props;
55
- const {
56
- field,
57
- fieldState: { error }
58
- } = useController({
59
- name,
60
- control
61
- });
62
- const theme = useTheme();
63
- const [selectedOptions, setSelectedOptions] = useState([]);
64
- const [inputValue, setInputValue] = useState("");
65
- const [options, setOptions] = useState([]);
66
- const [loading, setLoading] = useState(false);
67
- const loadedValuesRef = useRef([]);
68
- const isInitialPopulationActive = useRef(false);
69
- const lastFetchedSearchTermRef = useRef(null);
70
- const initialLoadCompleteRef = useRef(false);
71
- const selectedOptionsRef = useRef([]);
72
- const getOptionValue = useCallback(
73
- (option) => option ? String(option[valueField]) : "",
74
- [valueField]
75
- );
76
- const getOptionLabel = useCallback(
77
- (option) => option ? String(option[labelField]) : "",
78
- [labelField]
79
- );
80
- const fetchData = useMemo(
81
- () => debounce(
82
- (payload, callback) => {
83
- queryFn(payload).then((c) => {
84
- if (Array.isArray(c)) {
85
- callback(c);
86
- } else if (c && Array.isArray(c.data)) {
87
- callback(
88
- c.data
89
- );
90
- } else if (c && Array.isArray(c.Data)) {
91
- callback(
92
- c.Data
93
- );
94
- } else {
95
- callback([]);
96
- }
97
- });
98
- },
99
- 400
100
- ),
101
- [queryFn]
102
- );
103
- useEffect(() => {
104
- selectedOptionsRef.current = selectedOptions;
105
- }, [selectedOptions]);
106
- useEffect(() => {
107
- const formValues = Array.isArray(field.value) ? field.value : [];
108
- if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
109
- return;
110
- }
111
- if (formValues.length === 0) {
112
- setSelectedOptions([]);
113
- setOptions([]);
114
- loadedValuesRef.current = [];
115
- lastFetchedSearchTermRef.current = null;
116
- initialLoadCompleteRef.current = true;
117
- return;
118
- }
119
- let active = true;
120
- setLoading(true);
121
- isInitialPopulationActive.current = true;
122
- loadedValuesRef.current = formValues;
123
- initialLoadCompleteRef.current = true;
124
- fetchData({ Query: null, SelectedValue: formValues }, (results) => {
125
- if (active) {
126
- const fetchedOptions = results || [];
127
- setSelectedOptions([...fetchedOptions]);
128
- setOptions(fetchedOptions);
129
- }
130
- setLoading(false);
131
- isInitialPopulationActive.current = false;
132
- });
133
- return () => {
134
- active = false;
135
- };
136
- }, [field.value, fetchData]);
137
- useEffect(() => {
138
- if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
139
- return;
140
- }
141
- if (!inputValue) {
142
- if (selectedOptionsRef.current.length === 0) {
143
- setOptions([]);
144
- } else {
145
- setOptions(selectedOptionsRef.current);
146
- }
147
- lastFetchedSearchTermRef.current = null;
148
- return;
149
- }
150
- if (inputValue === lastFetchedSearchTermRef.current) {
151
- return;
152
- }
153
- let active = true;
154
- setLoading(true);
155
- fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
156
- if (active) {
157
- const results = searchResults || [];
158
- const currentSelected = selectedOptionsRef.current;
159
- const selectedOptionIds = new Set(
160
- currentSelected.map((opt) => getOptionValue(opt))
161
- );
162
- const combined = [...currentSelected];
163
- results.forEach((result) => {
164
- if (!selectedOptionIds.has(getOptionValue(result))) {
165
- combined.push(result);
166
- }
167
- });
168
- setOptions(combined);
169
- lastFetchedSearchTermRef.current = inputValue;
170
- }
171
- setLoading(false);
172
- });
173
- return () => {
174
- active = false;
175
- };
176
- }, [inputValue, fetchData, getOptionValue]);
177
- const handleChange = (_, newSelectedOptions) => {
178
- setSelectedOptions(newSelectedOptions);
179
- const newValues = newSelectedOptions.map((c) => c[valueField]);
180
- field.onChange(newValues.length === 0 ? null : newValues);
181
- loadedValuesRef.current = newValues;
182
- setOptions(newSelectedOptions);
183
- setInputValue("");
184
- lastFetchedSearchTermRef.current = null;
185
- };
186
- const isDisabled = useMemo(() => {
187
- return disabled ?? false;
188
- }, [disabled]);
189
- return /* @__PURE__ */ jsx(
190
- Autocomplete,
191
- {
192
- multiple: true,
193
- loading,
194
- getOptionLabel,
195
- isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
196
- options,
197
- value: selectedOptions,
198
- disabled,
199
- filterSelectedOptions: true,
200
- filterOptions: (x) => x,
201
- noOptionsText: "Type Something...",
202
- onChange: handleChange,
203
- sx: {
204
- "&.Mui-disabled": {
205
- cursor: "not-allowed !important"
206
- },
207
- "& .MuiInputBase-root.Mui-disabled": {
208
- backgroundColor: theme.palette.action.disabledBackground,
209
- cursor: "not-allowed !important"
210
- },
211
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
212
- cursor: "not-allowed !important"
213
- },
214
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
215
- borderColor: error ? "red" : void 0
216
- },
217
- "& .MuiFilledInput-root.Mui-disabled": {
218
- borderColor: error ? "red" : void 0
219
- }
220
- },
221
- onInputChange: (_, newInputValue) => setInputValue(newInputValue),
222
- renderInput: (params) => /* @__PURE__ */ jsx(
223
- TextField,
224
- {
225
- ...params,
226
- label,
227
- error: !!error,
228
- helperText: error ? error.message : "",
229
- placeholder,
230
- InputProps: {
231
- ...params.InputProps,
232
- endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
233
- loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
234
- params.InputProps.endAdornment
235
- ] })
236
- },
237
- variant: variant ? variant : "outlined"
238
- }
239
- ),
240
- renderOption: (props2, option, state) => {
241
- const { key, ...optionProps } = props2;
242
- const optionLabel = getOptionLabel(option);
243
- const matches = match(optionLabel, state.inputValue, {
244
- insideWords: true
245
- });
246
- const parts = parse(optionLabel, matches);
247
- return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
248
- "span",
249
- {
250
- style: {
251
- fontWeight: part.highlight ? 700 : 400
252
- },
253
- children: part.text
254
- },
255
- index
256
- )) }) }, key);
257
- },
258
- ...rest
259
- }
260
- );
261
- };
262
- var AsyncSelectMultiElement2 = ({
263
- gridProps,
264
- ...props
265
- }) => {
266
- if (gridProps) {
267
- return /* @__PURE__ */ jsx(
268
- Grid,
269
- {
270
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
271
- children: /* @__PURE__ */ jsx(
272
- Component,
273
- {
274
- ...props
275
- }
276
- )
277
- }
278
- );
279
- }
280
- return /* @__PURE__ */ jsx(Component, { ...props });
281
- };
282
- AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
283
-
284
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
285
- import {
286
- Checkbox,
287
- FormControl,
288
- FormControlLabel,
289
- FormGroup,
290
- FormHelperText,
291
- Grid as Grid2
292
- } from "@mui/material";
293
- import { useController as useController2 } from "react-hook-form";
294
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
295
- var Component2 = function CheckboxElement(props) {
296
- const {
297
- name,
298
- control,
299
- label,
300
- labelProps,
301
- helperText,
302
- parseError,
303
- transform,
304
- disabled,
305
- onChange: customOnChange,
306
- ...rest
307
- } = props;
308
- const {
309
- field,
310
- fieldState: { error }
311
- } = useController2({
312
- name,
313
- control,
314
- disabled
315
- });
316
- if (field.value == null || field.value == void 0) {
317
- field.onChange(false);
318
- }
319
- const customOutputTransform = transform?.output;
320
- const { value, onChange } = useTransform({
321
- value: field.value,
322
- onChange: field.onChange,
323
- transform: {
324
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
325
- output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
326
- const event = eventOrValue;
327
- const checked = _value;
328
- return customOutputTransform(event, checked);
329
- } : (eventOrValue, _value) => {
330
- const checked = _value;
331
- return checked;
332
- }
333
- }
334
- });
335
- const handleChange = (event, checked) => {
336
- onChange(event, checked);
337
- if (typeof customOnChange === "function") {
338
- customOnChange(event, checked);
339
- }
340
- };
341
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
342
- return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
343
- /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
344
- FormControlLabel,
345
- {
346
- label: label || "",
347
- ...labelProps,
348
- disabled,
349
- control: /* @__PURE__ */ jsx2(
350
- Checkbox,
351
- {
352
- ...rest,
353
- color: rest.color || "primary",
354
- checked: value,
355
- disabled,
356
- onChange: handleChange,
357
- ref: field.ref
358
- }
359
- )
360
- }
361
- ) }),
362
- (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
363
- ] });
364
- };
365
- var CheckboxElement2 = ({
366
- gridProps = {},
367
- ...props
368
- }) => {
369
- return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
370
- };
371
-
372
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
373
- import {
374
- Checkbox as Checkbox2,
375
- FormControl as FormControl2,
376
- FormControlLabel as FormControlLabel2,
377
- FormGroup as FormGroup2,
378
- FormHelperText as FormHelperText2,
379
- FormLabel,
380
- Grid as Grid3
381
- } from "@mui/material";
382
- import { useCallback as useCallback2 } from "react";
383
- import { useController as useController3 } from "react-hook-form";
384
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
385
- var Component3 = function CheckboxGroup(props) {
386
- const {
387
- name,
388
- control,
389
- label,
390
- required,
391
- formLabelProps,
392
- labelProps,
393
- labelKey = "Label",
394
- valueKey = "Value",
395
- options,
396
- ...rest
397
- } = props;
398
- const {
399
- field,
400
- fieldState: { error }
401
- } = useController3({
402
- name,
403
- control,
404
- disabled: rest.disabled
405
- });
406
- const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
407
- const handleChange = useCallback2(
408
- (event) => {
409
- const changedValueString = event.target.value;
410
- const isChecked = event.target.checked;
411
- const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
412
- const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
413
- if (optionsAreNumeric) {
414
- const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
415
- field.onChange(newValuesAsNumbers);
416
- } else {
417
- field.onChange(newSelectedValuesString);
418
- }
419
- },
420
- [field, options, valueKey, selectedValuesAsString]
421
- );
422
- return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
423
- label && /* @__PURE__ */ jsx3(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
424
- /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx3(
425
- FormControlLabel2,
426
- {
427
- label: option[labelKey],
428
- ...labelProps,
429
- control: /* @__PURE__ */ jsx3(
430
- Checkbox2,
431
- {
432
- ...rest,
433
- color: rest.color || "primary",
434
- value: option[valueKey],
435
- checked: selectedValuesAsString.includes(
436
- String(option[valueKey])
437
- ),
438
- onChange: handleChange
439
- }
440
- )
441
- },
442
- `${option[valueKey]}`
443
- )) }),
444
- error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
445
- ] });
446
- };
447
- var CheckboxGroupElement = ({
448
- gridProps = {},
449
- ...props
450
- }) => {
451
- return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
452
- };
453
- CheckboxGroupElement.displayName = "CheckboxGroup";
454
-
455
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
456
- import { Grid as Grid4 } from "@mui/material";
457
- import { forwardRef as forwardRef2 } from "react";
458
-
459
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
460
- import { useForkRef } from "@mui/material";
461
- import { DatePicker } from "@mui/x-date-pickers";
462
- import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
463
- import { useController as useController4 } from "react-hook-form";
464
-
465
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
466
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
467
- import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
468
- function readDatePickerValueAsDate(adapter, value) {
469
- if (value === null || value === void 0) {
470
- return null;
471
- }
472
- if (typeof value === "string") {
473
- if (value === "") {
474
- return null;
475
- }
476
- const parsedDate = adapter.utils.date(value);
477
- return parsedDate;
478
- }
479
- return value;
480
- }
481
- function useDatePickerValue(options) {
482
- const { field, transform } = options;
483
- const adapter = useLocalizationContext();
484
- const value = useMemo2(() => {
485
- if (typeof transform?.input === "function") {
486
- return transform.input(field.value);
487
- }
488
- return readDatePickerValueAsDate(adapter, field.value);
489
- }, [field.value, transform?.input, adapter]);
490
- const onChange = useCallback3(
491
- (newValue, context) => {
492
- if (typeof transform?.output === "function") {
493
- const transformedValue = transform.output(newValue, context);
494
- field.onChange(transformedValue);
495
- } else {
496
- field.onChange(newValue);
497
- }
498
- },
499
- // eslint-disable-next-line react-hooks/exhaustive-deps
500
- [field.onChange, transform?.output]
501
- );
502
- return {
503
- value,
504
- onChange
505
- };
506
- }
507
-
508
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
509
- import { useMemo as useMemo3 } from "react";
510
- var DEFAULT_ERROR_MESSAGES = {
511
- invalidDate: "Please enter a valid date",
512
- minDate: "Date must be after the minimum allowed date",
513
- maxDate: "Date must be before the maximum allowed date",
514
- disabledDate: "This date is not allowed",
515
- required: "This field is required"
516
- };
517
- function useDatePickerValidation(options) {
518
- const { fieldState, validation, parseError, value } = options;
519
- const validationResult = useMemo3(() => {
520
- const { error: fieldError, invalid } = fieldState;
521
- let currentError = fieldError;
522
- if (!fieldError && value && validation) {
523
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
524
- if (minDate && value < minDate) {
525
- currentError = {
526
- type: "minDate",
527
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
528
- };
529
- } else if (maxDate && value > maxDate) {
530
- currentError = {
531
- type: "maxDate",
532
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
533
- };
534
- } else if (shouldDisableDate && shouldDisableDate(value)) {
535
- currentError = {
536
- type: "disabledDate",
537
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
538
- };
539
- }
540
- }
541
- const hasError = Boolean(currentError);
542
- return {
543
- hasError,
544
- error: currentError,
545
- invalid: invalid || hasError
546
- };
547
- }, [fieldState, validation, value]);
548
- const errorMessage = useMemo3(() => {
549
- if (!validationResult.error) {
550
- return null;
551
- }
552
- if (parseError) {
553
- return parseError(validationResult.error);
554
- }
555
- if (typeof validationResult.error === "string") {
556
- return validationResult.error;
557
- }
558
- if ("message" in validationResult.error && validationResult.error.message) {
559
- return validationResult.error.message;
560
- }
561
- if ("type" in validationResult.error) {
562
- const errorType = validationResult.error.type;
563
- switch (errorType) {
564
- case "required":
565
- return DEFAULT_ERROR_MESSAGES.required;
566
- case "minDate":
567
- return DEFAULT_ERROR_MESSAGES.minDate;
568
- case "maxDate":
569
- return DEFAULT_ERROR_MESSAGES.maxDate;
570
- case "disabledDate":
571
- return DEFAULT_ERROR_MESSAGES.disabledDate;
572
- case "invalidDate":
573
- default:
574
- return DEFAULT_ERROR_MESSAGES.invalidDate;
575
- }
576
- }
577
- return DEFAULT_ERROR_MESSAGES.invalidDate;
578
- }, [validationResult.error, parseError]);
579
- return {
580
- ...validationResult,
581
- errorMessage
582
- };
583
- }
584
-
585
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
586
- import { useTheme as useTheme2 } from "@mui/material";
587
- import { useMemo as useMemo4 } from "react";
588
- function useDatePickerStyles(options = {}) {
589
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
590
- const theme = useTheme2();
591
- const computedSx = useMemo4(() => {
592
- const baseStyles = {
593
- // Input field styling
594
- "& .MuiOutlinedInput-root": {
595
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
596
- // Transition for smooth state changes
597
- transition: theme.transitions.create([
598
- "background-color",
599
- "border-color",
600
- "color"
601
- ], {
602
- duration: theme.transitions.duration.short
603
- }),
604
- // Error state styling
605
- ...hasError && {
606
- borderColor: theme.palette.error.main,
607
- "&:hover": {
608
- borderColor: theme.palette.error.main
609
- },
610
- "&.Mui-focused": {
611
- borderColor: theme.palette.error.main,
612
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
613
- // 25 is 15% opacity in hex
614
- }
615
- },
616
- // Loading state styling
617
- ...loading && {
618
- opacity: 0.7,
619
- pointerEvents: "none"
620
- }
621
- },
622
- // Input element styling
623
- "& .MuiInputBase-input": {
624
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
625
- // Read-only specific styling
626
- ...textReadOnly && !disabled && {
627
- cursor: "pointer",
628
- userSelect: "none",
629
- caretColor: "transparent"
630
- // Hide text cursor in read-only mode
631
- },
632
- // Loading state
633
- ...loading && {
634
- cursor: "wait"
635
- }
636
- },
637
- // Required field asterisk styling
638
- "& .MuiInputLabel-asterisk": {
639
- color: theme.palette.error.main,
640
- fontSize: "1.2em"
641
- },
642
- // Label styling with better contrast
643
- "& .MuiInputLabel-root": {
644
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
645
- // Ensure proper contrast for disabled state
646
- ...disabled && {
647
- color: theme.palette.text.disabled
648
- }
649
- },
650
- // Helper text styling
651
- "& .MuiFormHelperText-root": {
652
- marginLeft: theme.spacing(1),
653
- marginRight: theme.spacing(1),
654
- // Error state
655
- ...hasError && {
656
- color: theme.palette.error.main
657
- }
658
- },
659
- // Calendar icon styling
660
- "& .MuiInputAdornment-root": {
661
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
662
- },
663
- // Focus ring for accessibility
664
- "& .MuiOutlinedInput-root.Mui-focused": {
665
- outline: `2px solid ${theme.palette.primary.main}50`,
666
- // 50 is 31% opacity
667
- outlineOffset: "2px"
668
- },
669
- // Enhanced contrast for dark themes
670
- ...theme.palette.mode === "dark" && {
671
- "& .MuiOutlinedInput-root": {
672
- borderWidth: 2
673
- }
674
- }
675
- };
676
- return customSx ? [baseStyles, customSx] : baseStyles;
677
- }, [
678
- theme,
679
- disabled,
680
- hasError,
681
- loading,
682
- textReadOnly,
683
- customSx
684
- ]);
685
- const className = useMemo4(() => {
686
- const classes = [];
687
- if (disabled) classes.push("DatePickerElement--disabled");
688
- if (hasError) classes.push("DatePickerElement--error");
689
- if (loading) classes.push("DatePickerElement--loading");
690
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
691
- return classes.length > 0 ? classes.join(" ") : void 0;
692
- }, [disabled, hasError, loading, textReadOnly]);
693
- return {
694
- sx: computedSx,
695
- className
696
- };
697
- }
698
-
699
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
700
- import { jsx as jsx4 } from "react/jsx-runtime";
701
- var DatePickerElementCore = forwardRef(
702
- (props, ref) => {
703
- const {
704
- name,
705
- required = false,
706
- control,
707
- parseError,
708
- transform,
709
- validation,
710
- label,
711
- placeholder,
712
- textReadOnly = false,
713
- helperText,
714
- inputProps = {},
715
- slotProps = {},
716
- datePickerProps = {},
717
- variant = "outlined",
718
- loading = false,
719
- LoadingComponent,
720
- ...restProps
721
- } = props;
722
- const {
723
- disabled,
724
- inputRef: externalInputRef,
725
- onClose,
726
- ...restDatePickerProps
727
- } = datePickerProps;
728
- const { field, fieldState } = useController4({
729
- name,
730
- control,
731
- defaultValue: null
732
- // Let react-hook-form handle the default value typing
733
- });
734
- const { value, onChange: onValueChange } = useDatePickerValue({
735
- field,
736
- transform
737
- });
738
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
739
- fieldState,
740
- validation,
741
- parseError,
742
- value
743
- });
744
- const { className } = useDatePickerStyles({
745
- disabled,
746
- hasError,
747
- loading,
748
- textReadOnly
749
- });
750
- const handleInputRef = useForkRef(field.ref, externalInputRef);
751
- const handleChange = useCallback4(
752
- (newValue, context) => {
753
- onValueChange(newValue, context);
754
- },
755
- [onValueChange]
756
- );
757
- const handleClose = useCallback4(
758
- (...args) => {
759
- field.onBlur();
760
- if (onClose) {
761
- onClose(...args);
762
- }
763
- },
764
- // eslint-disable-next-line react-hooks/exhaustive-deps
765
- [field.onBlur, onClose]
766
- );
767
- const handleTextFieldBlur = useCallback4(
768
- (event) => {
769
- field.onBlur();
770
- if (typeof inputProps.onBlur === "function") {
771
- inputProps.onBlur(event);
772
- }
773
- },
774
- // eslint-disable-next-line react-hooks/exhaustive-deps
775
- [field.onBlur, inputProps.onBlur]
776
- );
777
- const memoizedSlotProps = useMemo5(
778
- () => ({
779
- ...slotProps,
780
- actionBar: {
781
- actions: ["clear", "today", "cancel", "accept"],
782
- ...slotProps.actionBar
783
- },
784
- textField: {
785
- ...inputProps,
786
- required,
787
- placeholder,
788
- fullWidth: true,
789
- variant,
790
- onBlur: handleTextFieldBlur,
791
- error: hasError,
792
- helperText: hasError ? errorMessage : helperText,
793
- inputProps: {
794
- readOnly: textReadOnly,
795
- "aria-invalid": invalid,
796
- "aria-describedby": hasError ? `${name}-error` : void 0,
797
- ...inputProps.inputProps
798
- },
799
- // Add loading indicator if provided
800
- ...loading && LoadingComponent && {
801
- InputProps: {
802
- endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
803
- ...inputProps.InputProps
804
- }
805
- },
806
- ...slotProps.textField
807
- }
808
- }),
809
- [
810
- slotProps,
811
- inputProps,
812
- required,
813
- placeholder,
814
- variant,
815
- handleTextFieldBlur,
816
- hasError,
817
- errorMessage,
818
- helperText,
819
- textReadOnly,
820
- invalid,
821
- name,
822
- loading,
823
- LoadingComponent
824
- ]
825
- );
826
- return /* @__PURE__ */ jsx4(
827
- DatePicker,
828
- {
829
- ...restProps,
830
- ...restDatePickerProps,
831
- ref,
832
- name,
833
- value,
834
- onChange: handleChange,
835
- onClose: handleClose,
836
- inputRef: handleInputRef,
837
- label,
838
- disabled,
839
- className,
840
- slotProps: memoizedSlotProps,
841
- "aria-invalid": invalid,
842
- "aria-describedby": hasError ? `${name}-error` : void 0
843
- }
844
- );
845
- }
846
- );
847
- DatePickerElementCore.displayName = "DatePickerElementCore";
848
-
849
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
850
- import { jsx as jsx5 } from "react/jsx-runtime";
851
- var DatePickerElement = forwardRef2((props, ref) => {
852
- const {
853
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
854
- ...coreProps
855
- } = props;
856
- if (gridProps === false) {
857
- return /* @__PURE__ */ jsx5(
858
- DatePickerElementCore,
859
- {
860
- ref,
861
- ...coreProps
862
- }
863
- );
864
- }
865
- return /* @__PURE__ */ jsx5(
866
- Grid4,
867
- {
868
- ref,
869
- ...gridProps,
870
- children: /* @__PURE__ */ jsx5(
871
- DatePickerElementCore,
872
- {
873
- ...coreProps
874
- }
875
- )
876
- }
877
- );
878
- });
879
- DatePickerElement.displayName = "DatePickerElement";
880
-
881
- // src/wrappers/DatePickerElement/utils.ts
882
- function isValidDate(value) {
883
- if (value === null || value === void 0) {
884
- return false;
885
- }
886
- if (value instanceof Date) {
887
- return !isNaN(value.getTime());
888
- }
889
- if (typeof value === "object" && value !== null) {
890
- if ("isValid" in value && typeof value.isValid === "function") {
891
- return value.isValid();
892
- }
893
- if ("isValid" in value && typeof value.isValid === "boolean") {
894
- return value.isValid;
895
- }
896
- }
897
- return false;
898
- }
899
- function isParsableDateString(value) {
900
- if (typeof value !== "string" || value === "") {
901
- return false;
902
- }
903
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
904
- if (isoDateRegex.test(value)) {
905
- return true;
906
- }
907
- const parsed = new Date(value);
908
- return !isNaN(parsed.getTime());
909
- }
910
- function createDateInputTransform(adapter) {
911
- return (value) => {
912
- if (value === null || value === void 0) {
913
- return null;
914
- }
915
- if (typeof value === "string") {
916
- if (value === "") {
917
- return null;
918
- }
919
- try {
920
- const parsed = adapter.utils.date(value);
921
- return isValidDate(parsed) ? parsed : null;
922
- } catch {
923
- return null;
924
- }
925
- }
926
- if (isValidDate(value)) {
927
- return value;
928
- }
929
- return null;
930
- };
931
- }
932
- function createDateOutputTransform(format) {
933
- return (value) => {
934
- if (value === null || value === void 0) {
935
- return null;
936
- }
937
- if (!isValidDate(value)) {
938
- return null;
939
- }
940
- if (!format) {
941
- return value;
942
- }
943
- try {
944
- if (value instanceof Date) {
945
- if (format === "iso") {
946
- return value.toISOString();
947
- }
948
- if (format === "date-only") {
949
- return value.toISOString().split("T")[0];
950
- }
951
- }
952
- if (typeof value.format === "function") {
953
- return value.format(format);
954
- }
955
- if (typeof value.format === "function") {
956
- return value.format(format);
957
- }
958
- if (typeof value.toFormat === "function") {
959
- return value.toFormat(format);
960
- }
961
- return value;
962
- } catch {
963
- return null;
964
- }
965
- };
966
- }
967
- function createDefaultDatePickerConfig() {
968
- return {
969
- // Default slot props for consistent behavior
970
- slotProps: {
971
- actionBar: {
972
- actions: ["clear", "today", "cancel", "accept"]
973
- },
974
- textField: {
975
- fullWidth: true,
976
- variant: "outlined"
977
- }
978
- },
979
- // Default grid props for layout consistency
980
- gridProps: {
981
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
982
- },
983
- // Default validation configuration
984
- validation: {
985
- errorMessages: {
986
- invalidDate: "Please enter a valid date",
987
- minDate: "Date must be after the minimum allowed date",
988
- maxDate: "Date must be before the maximum allowed date",
989
- disabledDate: "This date is not allowed"
990
- }
991
- }
992
- };
993
- }
994
- function extractErrorMessage(error) {
995
- if (error === null || error === void 0) {
996
- return "";
997
- }
998
- if (typeof error === "string") {
999
- return error;
1000
- }
1001
- if (typeof error === "object" && error !== null) {
1002
- if ("message" in error && typeof error.message === "string") {
1003
- return error.message;
1004
- }
1005
- if ("type" in error && typeof error.type === "string") {
1006
- const errorType = error.type;
1007
- switch (errorType) {
1008
- case "invalidDate":
1009
- return "Please enter a valid date";
1010
- case "minDate":
1011
- return "Date is too early";
1012
- case "maxDate":
1013
- return "Date is too late";
1014
- case "disabledDate":
1015
- return "This date is not available";
1016
- default:
1017
- return "Invalid date selection";
1018
- }
1019
- }
1020
- }
1021
- return "Invalid input";
1022
- }
1023
- function createStableKey(config) {
1024
- try {
1025
- return JSON.stringify(config, (key, value) => {
1026
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1027
- const sorted = {};
1028
- Object.keys(value).sort().forEach((k) => {
1029
- sorted[k] = value[k];
1030
- });
1031
- return sorted;
1032
- }
1033
- return value;
1034
- });
1035
- } catch {
1036
- return Object.keys(config).sort().join("-");
1037
- }
1038
- }
1039
-
1040
- // src/wrappers/PasswordElement/PasswordElement.tsx
1041
- import Visibility from "@mui/icons-material/Visibility";
1042
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
1043
- import {
1044
- IconButton,
1045
- InputAdornment,
1046
- TextField as TextField2,
1047
- useForkRef as useForkRef2,
1048
- Grid as Grid5
1049
- } from "@mui/material";
1050
- import { useState as useState2 } from "react";
1051
- import { useController as useController5 } from "react-hook-form";
1052
- import { jsx as jsx6 } from "react/jsx-runtime";
1053
- var Component4 = function PasswordEl(props) {
1054
- const {
1055
- iconColor,
1056
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
1057
- slotProps,
1058
- name,
1059
- control,
1060
- inputRef,
1061
- onBlur,
1062
- ...rest
1063
- } = props;
1064
- const [password, setPassword] = useState2(true);
1065
- const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
1066
- IconButton,
1067
- {
1068
- onMouseDown: (e) => e.preventDefault(),
1069
- onClick: () => setPassword(!password),
1070
- tabIndex: -1,
1071
- color: iconColor ?? "default",
1072
- children: renderIcon(password)
1073
- }
1074
- ) });
1075
- const {
1076
- field,
1077
- fieldState: { error }
1078
- } = useController5({
1079
- name,
1080
- control
1081
- });
1082
- const handleInputRef = useForkRef2(field.ref, inputRef);
1083
- return /* @__PURE__ */ jsx6(
1084
- TextField2,
1085
- {
1086
- ...rest,
1087
- inputRef: handleInputRef,
1088
- type: password ? "password" : "text",
1089
- value: field.value ?? "",
1090
- fullWidth: true,
1091
- variant: rest.variant ?? "outlined",
1092
- onChange: (event) => {
1093
- field.onChange(event);
1094
- if (typeof rest.onChange === "function") {
1095
- rest.onChange(event);
1096
- }
1097
- },
1098
- onBlur: (event) => {
1099
- field.onBlur();
1100
- if (typeof onBlur === "function") {
1101
- onBlur(event);
1102
- }
1103
- },
1104
- ...typeof slotProps === "undefined" ? {
1105
- InputProps: {
1106
- endAdornment
1107
- }
1108
- } : {
1109
- slotProps: {
1110
- ...slotProps,
1111
- input: {
1112
- endAdornment,
1113
- ...slotProps?.input
1114
- }
1115
- }
1116
- },
1117
- error: !!error,
1118
- helperText: error ? error.message : ""
1119
- }
1120
- );
1121
- };
1122
- var PasswordElement = ({
1123
- gridProps = {},
1124
- ...props
1125
- }) => {
1126
- return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
1127
- };
1128
-
1129
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1130
- import {
1131
- FormControl as FormControl3,
1132
- FormControlLabel as FormControlLabel3,
1133
- FormHelperText as FormHelperText3,
1134
- FormLabel as FormLabel2,
1135
- Radio,
1136
- RadioGroup,
1137
- Grid as Grid6
1138
- } from "@mui/material";
1139
- import { useController as useController6 } from "react-hook-form";
1140
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1141
- var Component5 = function RadioButtonGroup(props) {
1142
- const {
1143
- options,
1144
- label,
1145
- name,
1146
- labelKey = "label",
1147
- valueKey = "id",
1148
- disabledKey = "disabled",
1149
- required,
1150
- emptyOptionLabel,
1151
- returnObject,
1152
- row = true,
1153
- control,
1154
- type,
1155
- labelProps,
1156
- disabled,
1157
- formLabelProps,
1158
- radioProps,
1159
- transform,
1160
- ...rest
1161
- } = props;
1162
- const {
1163
- field,
1164
- fieldState: { error }
1165
- } = useController6({
1166
- name,
1167
- disabled,
1168
- control
1169
- });
1170
- const { value, onChange } = useTransform({
1171
- value: field.value,
1172
- onChange: field.onChange,
1173
- transform: {
1174
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1175
- return value2 || "";
1176
- },
1177
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1178
- if (value2 && type === "number") {
1179
- return Number(value2);
1180
- }
1181
- if (value2 && type === "boolean") {
1182
- return Boolean(value2);
1183
- }
1184
- return value2;
1185
- }
1186
- }
1187
- });
1188
- const onRadioChange = (event, radioValue) => {
1189
- const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1190
- onChange(event, returnValue);
1191
- if (typeof rest.onChange === "function") {
1192
- rest.onChange(returnValue);
1193
- }
1194
- };
1195
- return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1196
- label && /* @__PURE__ */ jsx7(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
1197
- /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1198
- emptyOptionLabel && /* @__PURE__ */ jsx7(
1199
- FormControlLabel3,
1200
- {
1201
- ...labelProps,
1202
- control: /* @__PURE__ */ jsx7(
1203
- Radio,
1204
- {
1205
- ...radioProps,
1206
- checked: !value
1207
- }
1208
- ),
1209
- label: emptyOptionLabel,
1210
- value: ""
1211
- }
1212
- ),
1213
- options.map((option) => {
1214
- const optionKey = option[valueKey];
1215
- const optionDisabled = option[disabledKey] || false;
1216
- let val = returnObject ? value?.[valueKey] : value;
1217
- if (type === "number" && val !== void 0) {
1218
- val = Number(val);
1219
- } else if (type === "boolean" && val !== void 0) {
1220
- val = Boolean(val);
1221
- }
1222
- const isChecked = val === optionKey;
1223
- return /* @__PURE__ */ jsx7(
1224
- FormControlLabel3,
1225
- {
1226
- ...labelProps,
1227
- control: /* @__PURE__ */ jsx7(
1228
- Radio,
1229
- {
1230
- ...radioProps,
1231
- disabled: disabled || optionDisabled,
1232
- checked: isChecked
1233
- }
1234
- ),
1235
- value: optionKey,
1236
- label: option[labelKey]
1237
- },
1238
- String(optionKey)
1239
- );
1240
- })
1241
- ] }),
1242
- error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1243
- ] });
1244
- };
1245
- var RadioButtonGroup2 = ({
1246
- gridProps = {},
1247
- ...props
1248
- }) => {
1249
- return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
1250
- Component5,
1251
- {
1252
- ...props
1253
- }
1254
- ) });
1255
- };
1256
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1257
-
1258
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1259
- import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1260
- import { useTheme as useTheme3 } from "@mui/material/styles";
1261
- import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1262
- import { useController as useController7 } from "react-hook-form";
1263
- import { jsx as jsx8 } from "react/jsx-runtime";
1264
- var Component6 = function SelectCascadeElement(props) {
1265
- const theme = useTheme3();
1266
- const {
1267
- labelField = "Label",
1268
- valueField = "Value",
1269
- name,
1270
- onBlur,
1271
- onChange,
1272
- disabled,
1273
- options: optionsInput,
1274
- control,
1275
- loading = false,
1276
- placeholder,
1277
- label,
1278
- dependsOn,
1279
- textFieldProps = {},
1280
- variant,
1281
- isNullable = false,
1282
- disableDefaultSelected = false,
1283
- ...rest
1284
- } = props;
1285
- const { required, ...restTextProps } = textFieldProps;
1286
- const options = useMemo6(() => optionsInput || [], [optionsInput]);
1287
- const getOptionKey = useCallback5(
1288
- (option) => {
1289
- if (typeof option === "string" || typeof option === "number")
1290
- return option;
1291
- const key = option ? option[valueField] : void 0;
1292
- return key !== void 0 && key !== null ? String(key) : "";
1293
- },
1294
- [valueField]
1295
- );
1296
- const getOptionLabel = useCallback5(
1297
- (option) => {
1298
- if (typeof option === "string") return option;
1299
- return option ? String(option[labelField]) : "";
1300
- },
1301
- [labelField]
1302
- );
1303
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1304
- const {
1305
- field,
1306
- fieldState: { error }
1307
- } = useController7({
1308
- name,
1309
- control
1310
- });
1311
- const { field: dependentField } = useController7({
1312
- name: dependsOn,
1313
- control
1314
- });
1315
- const parentValueRef = useRef2(dependentField.value);
1316
- useEffect2(() => {
1317
- if (parentValueRef.current !== dependentField.value) {
1318
- field.onChange(null);
1319
- parentValueRef.current = dependentField.value;
1320
- }
1321
- }, [dependentField.value, field]);
1322
- useEffect2(() => {
1323
- if (disableDefaultSelected && options.length === 1 && field.value != null) {
1324
- field.onChange(null);
1325
- }
1326
- }, [disableDefaultSelected, options.length]);
1327
- useEffect2(() => {
1328
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1329
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1330
- if (disabled) return;
1331
- field.onChange(getOptionKey(options[0]));
1332
- }
1333
- }, [
1334
- options,
1335
- disabled,
1336
- getOptionKey,
1337
- field.onChange,
1338
- dependentField.value,
1339
- disableDefaultSelected
1340
- ]);
1341
- const isDisabled = useMemo6(() => {
1342
- if (disabled) return true;
1343
- if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
1344
- return true;
1345
- if (options.length === 1 && !isNullable && !disableDefaultSelected) {
1346
- return true;
1347
- }
1348
- return false;
1349
- }, [
1350
- disabled,
1351
- dependentField.value,
1352
- options.length,
1353
- isNullable,
1354
- disableDefaultSelected
1355
- ]);
1356
- return /* @__PURE__ */ jsx8(
1357
- Autocomplete2,
1358
- {
1359
- ...rest,
1360
- value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1361
- loading,
1362
- options,
1363
- getOptionKey,
1364
- getOptionLabel,
1365
- isOptionEqualToValue,
1366
- ref: field.ref,
1367
- disabled: isDisabled,
1368
- sx: {
1369
- "&.Mui-disabled": {
1370
- cursor: "not-allowed !important"
1371
- },
1372
- "& .MuiInputBase-root.Mui-disabled": {
1373
- backgroundColor: theme.palette.action.disabledBackground,
1374
- cursor: "not-allowed !important"
1375
- },
1376
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1377
- cursor: "not-allowed !important"
1378
- },
1379
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1380
- borderColor: error ? "red" : void 0
1381
- },
1382
- "& .MuiFilledInput-root.Mui-disabled": {
1383
- borderColor: error ? "red" : void 0
1384
- }
1385
- },
1386
- onChange: (event, newValue, reason) => {
1387
- field.onChange(newValue ? getOptionKey(newValue) : null);
1388
- if (onChange && typeof onChange === "function") {
1389
- onChange(event, newValue, reason);
1390
- }
1391
- },
1392
- onBlur: (event) => {
1393
- field.onBlur();
1394
- if (typeof onBlur === "function") {
1395
- onBlur(event);
1396
- }
1397
- },
1398
- fullWidth: true,
1399
- renderInput: (params) => /* @__PURE__ */ jsx8(
1400
- TextField3,
1401
- {
1402
- ...params,
1403
- ...restTextProps,
1404
- fullWidth: true,
1405
- error: !!error,
1406
- required,
1407
- helperText: error ? error.message : "",
1408
- placeholder,
1409
- label,
1410
- variant: variant ? variant : "outlined"
1411
- }
1412
- )
1413
- }
1414
- );
1415
- };
1416
- var SelectCascadeElement2 = ({
1417
- gridProps = {},
1418
- ...props
1419
- }) => {
1420
- return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
1421
- };
1422
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1423
-
1424
- // src/wrappers/SelectElement/SelectElement.tsx
1425
- import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1426
- import { useTheme as useTheme4 } from "@mui/material/styles";
1427
- import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
1428
- import { useController as useController8 } from "react-hook-form";
1429
- import { jsx as jsx9 } from "react/jsx-runtime";
1430
- var Component7 = function SelectElement(props) {
1431
- const theme = useTheme4();
1432
- const {
1433
- name,
1434
- control,
1435
- onChange,
1436
- options: optionsInput,
1437
- label,
1438
- variant,
1439
- disabled,
1440
- labelField = "Label",
1441
- valueField = "Value",
1442
- placeholder,
1443
- textFieldProps = {},
1444
- isNullable = false,
1445
- disableDefaultSelected = false,
1446
- ...rest
1447
- } = props;
1448
- const { required, ...restTextProps } = textFieldProps;
1449
- const options = useMemo7(() => optionsInput || [], [optionsInput]);
1450
- const {
1451
- field,
1452
- fieldState: { error }
1453
- } = useController8({
1454
- name,
1455
- control
1456
- });
1457
- const getOptionValue = useCallback6(
1458
- (option) => {
1459
- if (typeof option === "string") return option;
1460
- return option ? option[valueField] : null;
1461
- },
1462
- [valueField]
1463
- );
1464
- const getOptionLabel = useCallback6(
1465
- (option) => {
1466
- if (typeof option === "string") return option;
1467
- return option ? String(option[labelField]) : "";
1468
- },
1469
- [labelField]
1470
- );
1471
- useEffect3(() => {
1472
- if (disableDefaultSelected && options.length === 1 && field.value != null) {
1473
- field.onChange(null);
1474
- }
1475
- }, [disableDefaultSelected, options.length]);
1476
- useEffect3(() => {
1477
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1478
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1479
- if (disabled) return;
1480
- field.onChange(getOptionValue(options[0]));
1481
- }
1482
- }, [
1483
- options,
1484
- disabled,
1485
- getOptionValue,
1486
- field.onChange,
1487
- disableDefaultSelected
1488
- ]);
1489
- const isDisabled = useMemo7(() => {
1490
- if (disabled) return true;
1491
- if (options.length === 0) return true;
1492
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1493
- return true;
1494
- return false;
1495
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1496
- const autocompleteValue = useMemo7(
1497
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1498
- [field.value, options, getOptionValue]
1499
- );
1500
- return /* @__PURE__ */ jsx9(
1501
- Autocomplete3,
1502
- {
1503
- ...rest,
1504
- filterSelectedOptions: false,
1505
- options,
1506
- value: autocompleteValue,
1507
- onChange: (event, newValue, reason) => {
1508
- const option = newValue;
1509
- field.onChange(option ? getOptionValue(option) : null);
1510
- onChange?.(event, newValue, reason);
1511
- },
1512
- disabled: isDisabled,
1513
- sx: {
1514
- "&.Mui-disabled": {
1515
- cursor: "not-allowed !important"
1516
- },
1517
- "& .MuiInputBase-root.Mui-disabled": {
1518
- backgroundColor: theme.palette.action.disabledBackground,
1519
- cursor: "not-allowed !important"
1520
- },
1521
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1522
- cursor: "not-allowed !important"
1523
- },
1524
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1525
- borderColor: error ? "red" : void 0
1526
- },
1527
- "& .MuiFilledInput-root.Mui-disabled": {
1528
- borderColor: error ? "red" : void 0
1529
- }
1530
- },
1531
- getOptionLabel: (option) => getOptionLabel(option),
1532
- ref: field.ref,
1533
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1534
- renderInput: (params) => /* @__PURE__ */ jsx9(
1535
- TextField4,
1536
- {
1537
- ...params,
1538
- ...restTextProps,
1539
- fullWidth: true,
1540
- required,
1541
- error: !!error,
1542
- helperText: error ? error.message : "",
1543
- label,
1544
- placeholder,
1545
- variant: variant ? variant : "outlined"
1546
- }
1547
- )
1548
- }
1549
- );
1550
- };
1551
- var SelectElement2 = ({
1552
- gridProps = {},
1553
- ...props
1554
- }) => {
1555
- return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
1556
- };
1557
- SelectElement2.displayName = "SelectElement";
1558
-
1559
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1560
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1561
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1562
- import {
1563
- Grid as Grid9,
1564
- Checkbox as Checkbox3,
1565
- TextField as TextField5,
1566
- Autocomplete as Autocomplete4,
1567
- CircularProgress as CircularProgress2,
1568
- useTheme as useTheme5
1569
- } from "@mui/material";
1570
- import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
1571
- import { useController as useController9 } from "react-hook-form";
1572
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1573
- var Component8 = function SelectMultiElement(props) {
1574
- const {
1575
- name,
1576
- control,
1577
- onBlur,
1578
- disabled,
1579
- options: optionsInput,
1580
- loading = false,
1581
- placeholder,
1582
- label,
1583
- isNullable,
1584
- disableDefaultSelected = true,
1585
- variant,
1586
- labelField = "Label",
1587
- valueField = "Value",
1588
- ...rest
1589
- } = props;
1590
- const theme = useTheme5();
1591
- const options = useMemo8(() => optionsInput || [], [optionsInput]);
1592
- const {
1593
- field,
1594
- fieldState: { error }
1595
- } = useController9({
1596
- name,
1597
- control
1598
- });
1599
- const getOptionValue = (option) => {
1600
- if (typeof option === "string") return option;
1601
- return option ? option[valueField] : null;
1602
- };
1603
- const getOptionLabel = (option) => {
1604
- if (typeof option === "string") return option;
1605
- return option ? String(option[labelField]) : "";
1606
- };
1607
- const isDisabled = useMemo8(() => {
1608
- if (disabled) return true;
1609
- if (options.length === 0) return true;
1610
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1611
- return true;
1612
- return false;
1613
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1614
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1615
- useEffect4(() => {
1616
- if (disableDefaultSelected && options.length === 1 && field.value != null) {
1617
- field.onChange(null);
1618
- }
1619
- }, [disableDefaultSelected, options.length]);
1620
- useEffect4(() => {
1621
- const hasValue = Array.isArray(field.value) && field.value.length > 0;
1622
- if (options.length === 1 && !hasValue && !isNullable && !disableDefaultSelected) {
1623
- field.onChange([getOptionValue(options[0])]);
1624
- }
1625
- }, [
1626
- options,
1627
- getOptionValue,
1628
- field.onChange,
1629
- isNullable,
1630
- disableDefaultSelected
1631
- ]);
1632
- const handleChange = (_, selectedOptions, reason) => {
1633
- if (reason === "clear") {
1634
- field.onChange(null);
1635
- } else if (reason === "selectOption" || reason === "removeOption") {
1636
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1637
- field.onChange(newValues.length === 0 ? null : newValues);
1638
- }
1639
- };
1640
- const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1641
- const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1642
- return /* @__PURE__ */ jsx10(
1643
- Autocomplete4,
1644
- {
1645
- multiple: true,
1646
- value: selectedValue,
1647
- loading,
1648
- options,
1649
- getOptionLabel,
1650
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1651
- filterSelectedOptions: true,
1652
- disableCloseOnSelect: true,
1653
- ref: field.ref,
1654
- disabled: isDisabled,
1655
- onChange: handleChange,
1656
- onBlur: (event) => {
1657
- field.onBlur();
1658
- if (typeof onBlur === "function") {
1659
- onBlur(event);
1660
- }
1661
- },
1662
- sx: {
1663
- "&.Mui-disabled": {
1664
- cursor: "not-allowed !important"
1665
- },
1666
- "& .MuiInputBase-root.Mui-disabled": {
1667
- backgroundColor: theme.palette.action.disabledBackground,
1668
- cursor: "not-allowed !important"
1669
- },
1670
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1671
- cursor: "not-allowed !important"
1672
- },
1673
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1674
- borderColor: error ? "red" : void 0
1675
- },
1676
- "& .MuiFilledInput-root.Mui-disabled": {
1677
- borderColor: error ? "red" : void 0
1678
- }
1679
- },
1680
- fullWidth: true,
1681
- renderOption: (props1, option, { selected }) => {
1682
- return /* @__PURE__ */ jsxs5("li", { ...props1, children: [
1683
- /* @__PURE__ */ jsx10(
1684
- Checkbox3,
1685
- {
1686
- icon,
1687
- checkedIcon,
1688
- checked: selected
1689
- }
1690
- ),
1691
- getOptionLabel(option)
1692
- ] });
1693
- },
1694
- renderInput: (params) => /* @__PURE__ */ jsx10(
1695
- TextField5,
1696
- {
1697
- ...params,
1698
- label,
1699
- error: !!error,
1700
- helperText: error ? error.message : "",
1701
- placeholder,
1702
- InputProps: {
1703
- ...params.InputProps,
1704
- endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1705
- loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1706
- params.InputProps.endAdornment
1707
- ] })
1708
- },
1709
- variant: variant ? variant : "outlined"
1710
- }
1711
- ),
1712
- ...rest
1713
- }
1714
- );
1715
- };
1716
- var SelectMultiElement2 = ({
1717
- gridProps = {},
1718
- ...props
1719
- }) => {
1720
- return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
1721
- };
1722
- SelectMultiElement2.displayName = "SelectMultiElement";
1723
-
1724
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1725
- import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
1726
- import { useController as useController10 } from "react-hook-form";
1727
- import { jsx as jsx11 } from "react/jsx-runtime";
1728
- var Component9 = function TextFieldElement(props) {
1729
- const {
1730
- parseError,
1731
- name,
1732
- control,
1733
- component: TextFieldComponent = TextField6,
1734
- transform,
1735
- fieldType = "text",
1736
- // Default to text type
1737
- defaultValue,
1738
- label,
1739
- placeholder,
1740
- textFieldProps = {},
1741
- variant,
1742
- onChange: customOnChange,
1743
- enableWarnings = process.env.NODE_ENV === "development",
1744
- ...rest
1745
- } = props;
1746
- const {
1747
- type,
1748
- required,
1749
- helperText,
1750
- inputRef,
1751
- onInput,
1752
- onBlur,
1753
- disabled,
1754
- ...restTextProps
1755
- } = textFieldProps;
1756
- const {
1757
- field,
1758
- fieldState: { error }
1759
- } = useController10({
1760
- name,
1761
- control
1762
- });
1763
- const { value, onChange } = useEnhancedTransform(
1764
- {
1765
- value: field.value,
1766
- onChange: field.onChange,
1767
- transform: transform ? {
1768
- input: transform.input,
1769
- output: transform.output
1770
- } : void 0,
1771
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1772
- // Auto-detect number type
1773
- defaultValue,
1774
- enableWarnings
1775
- }
1776
- );
1777
- const handleInputRef = useForkRef3(field.ref, inputRef);
1778
- return /* @__PURE__ */ jsx11(
1779
- TextFieldComponent,
1780
- {
1781
- ...rest,
1782
- ...restTextProps,
1783
- name: field.name,
1784
- value,
1785
- onChange: (event) => {
1786
- const input = event.target.value;
1787
- if (input === "") {
1788
- field.onChange(null);
1789
- } else {
1790
- onChange(event);
1791
- }
1792
- if (typeof customOnChange === "function") {
1793
- customOnChange(event);
1794
- }
1795
- return;
1796
- },
1797
- onBlur: (event) => {
1798
- field.onBlur();
1799
- if (typeof onBlur === "function") {
1800
- onBlur(event);
1801
- }
1802
- },
1803
- onInput: (event) => {
1804
- if (typeof onInput === "function") {
1805
- onInput(event);
1806
- }
1807
- },
1808
- disabled,
1809
- label,
1810
- placeholder,
1811
- fullWidth: true,
1812
- required,
1813
- type,
1814
- error: !!error,
1815
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1816
- inputRef: handleInputRef,
1817
- variant: variant ? variant : "outlined"
1818
- }
1819
- );
1820
- };
1821
- var TextFieldElement2 = ({
1822
- gridProps = {},
1823
- ...props
1824
- }) => {
1825
- return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
1826
- };
1827
-
1828
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1829
- import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1830
- import { TimePicker } from "@mui/x-date-pickers";
1831
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1832
- import { renderTimeViewClock } from "@mui/x-date-pickers/timeViewRenderers";
1833
- import dayjs from "dayjs";
1834
- import { useState as useState3 } from "react";
1835
- import { useController as useController11 } from "react-hook-form";
1836
- import { jsx as jsx12 } from "react/jsx-runtime";
1837
- var Component10 = function TimePickerElement(props) {
1838
- const {
1839
- name,
1840
- required,
1841
- inputProps,
1842
- control,
1843
- label,
1844
- placeholder,
1845
- slotProps,
1846
- timePickerProps = {},
1847
- transform,
1848
- ...rest
1849
- } = props;
1850
- const adapter = useLocalizationContext2();
1851
- const [open, setOpen] = useState3(false);
1852
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1853
- const {
1854
- field,
1855
- fieldState: { error }
1856
- } = useController11({
1857
- name,
1858
- control,
1859
- defaultValue: null
1860
- });
1861
- const { value, onChange } = useTransform({
1862
- value: field.value,
1863
- onChange: field.onChange,
1864
- transform: {
1865
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1866
- output: (data) => {
1867
- if (!dayjs.isDayjs(data)) {
1868
- return null;
1869
- }
1870
- return data;
1871
- }
1872
- }
1873
- });
1874
- const handleInputRef = useForkRef4(field.ref, inputRef);
1875
- return /* @__PURE__ */ jsx12(
1876
- TimePicker,
1877
- {
1878
- ...rest,
1879
- ...restTimePickerProps,
1880
- value,
1881
- label,
1882
- disabled,
1883
- open,
1884
- inputRef: handleInputRef,
1885
- viewRenderers: {
1886
- hours: renderTimeViewClock,
1887
- minutes: renderTimeViewClock,
1888
- seconds: renderTimeViewClock
1889
- },
1890
- onOpen: () => setOpen(true),
1891
- onClose: (...args) => {
1892
- setOpen(false);
1893
- field.onBlur();
1894
- onClose?.(...args);
1895
- },
1896
- onChange: (newValue, context) => {
1897
- onChange(newValue);
1898
- timePickerProps.onChange?.(newValue, context);
1899
- },
1900
- slotProps: {
1901
- ...slotProps,
1902
- actionBar: {
1903
- actions: ["clear", "cancel", "accept"]
1904
- },
1905
- textField: {
1906
- ...inputProps,
1907
- required,
1908
- placeholder,
1909
- fullWidth: true,
1910
- readOnly: true,
1911
- sx: {
1912
- cursor: disabled ? "not-allowed" : "pointer"
1913
- },
1914
- onClick: () => {
1915
- if (!disabled) {
1916
- setOpen(true);
1917
- }
1918
- },
1919
- onBlur: (event) => {
1920
- field.onBlur();
1921
- inputProps?.onBlur?.(event);
1922
- },
1923
- error: !!error,
1924
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1925
- inputProps: {
1926
- readOnly: true,
1927
- inputMode: "none",
1928
- ...inputProps?.inputProps
1929
- }
1930
- }
1931
- }
1932
- }
1933
- );
1934
- };
1935
- var TimePickerElement2 = ({
1936
- gridProps = {},
1937
- ...props
1938
- }) => {
1939
- return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
1940
- };
1941
- TimePickerElement2.displayName = "TimePickerElement";
1942
-
1943
- // src/wrappers/SliderElement/SliderElement.tsx
1944
- import {
1945
- Box,
1946
- FormControl as FormControl4,
1947
- FormHelperText as FormHelperText4,
1948
- FormLabel as FormLabel3,
1949
- Grid as Grid12,
1950
- Slider
1951
- } from "@mui/material";
1952
- import { useController as useController12 } from "react-hook-form";
1953
- import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
1954
- var Component11 = function SliderElementCore(props) {
1955
- const {
1956
- name,
1957
- control,
1958
- label,
1959
- helperText,
1960
- parseError,
1961
- min = 0,
1962
- max = 100,
1963
- step = 1,
1964
- marks = false,
1965
- required = false,
1966
- disabled = false,
1967
- sliderProps = {}
1968
- } = props;
1969
- const {
1970
- field,
1971
- fieldState: { error }
1972
- } = useController12({
1973
- name,
1974
- control
1975
- });
1976
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
1977
- return /* @__PURE__ */ jsxs6(
1978
- FormControl4,
1979
- {
1980
- fullWidth: true,
1981
- margin: "normal",
1982
- error: !!error,
1983
- required,
1984
- disabled,
1985
- children: [
1986
- label && /* @__PURE__ */ jsx13(FormLabel3, { sx: { mb: 2 }, children: label }),
1987
- /* @__PURE__ */ jsx13(Box, { sx: { px: 2 }, children: /* @__PURE__ */ jsx13(
1988
- Slider,
1989
- {
1990
- ...sliderProps,
1991
- ref: field.ref,
1992
- name: field.name,
1993
- value: typeof field.value === "number" ? field.value : min,
1994
- onChange: (_, newValue) => field.onChange(newValue),
1995
- onBlur: field.onBlur,
1996
- min,
1997
- max,
1998
- step,
1999
- marks,
2000
- valueLabelDisplay: "auto",
2001
- disabled
2002
- }
2003
- ) }),
2004
- (errorMessage || helperText) && /* @__PURE__ */ jsx13(FormHelperText4, { children: errorMessage || helperText })
2005
- ]
2006
- }
2007
- );
2008
- };
2009
- var SliderElement = ({
2010
- gridProps = {},
2011
- ...props
2012
- }) => {
2013
- return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component11, { ...props }) });
2014
- };
2015
- SliderElement.displayName = "SliderElement";
2016
-
2017
- // src/wrappers/FileUploadElement/FileUploadElement.tsx
2018
- import {
2019
- Box as Box2,
2020
- Button,
2021
- Chip,
2022
- FormControl as FormControl5,
2023
- FormHelperText as FormHelperText5,
2024
- FormLabel as FormLabel4,
2025
- Grid as Grid13,
2026
- Stack
2027
- } from "@mui/material";
2028
- import CloudUploadIcon from "@mui/icons-material/CloudUpload";
2029
- import { useCallback as useCallback7, useRef as useRef3 } from "react";
2030
- import { useController as useController13, useFormContext } from "react-hook-form";
2031
- import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
2032
- var Component12 = function FileUploadElementCore(props) {
2033
- const {
2034
- name,
2035
- control,
2036
- label,
2037
- helperText,
2038
- parseError,
2039
- maxFiles = 5,
2040
- maxSizeMB = 10,
2041
- allowedExtensions = [".jpg", ".jpeg", ".png", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
2042
- required = false,
2043
- disabled = false,
2044
- buttonText = "Choose Files"
2045
- } = props;
2046
- const { setError, clearErrors } = useFormContext();
2047
- const fileInputRef = useRef3(null);
2048
- const {
2049
- field,
2050
- fieldState: { error }
2051
- } = useController13({
2052
- name,
2053
- control
2054
- });
2055
- const files = Array.isArray(field.value) ? field.value : [];
2056
- const validateFiles = useCallback7(
2057
- (fileList) => {
2058
- if (!fileList || fileList.length === 0) {
2059
- return [];
2060
- }
2061
- if (fileList.length > maxFiles) {
2062
- return `Maximum ${maxFiles} files allowed`;
2063
- }
2064
- const maxSizeBytes = maxSizeMB * 1024 * 1024;
2065
- const validFiles = [];
2066
- for (let i = 0; i < fileList.length; i++) {
2067
- const file = fileList[i];
2068
- if (file.size > maxSizeBytes) {
2069
- return `File "${file.name}" exceeds ${maxSizeMB}MB size limit`;
2070
- }
2071
- const extension = "." + file.name.split(".").pop()?.toLowerCase();
2072
- if (!allowedExtensions.includes(extension)) {
2073
- return `File "${file.name}" has invalid extension. Allowed: ${allowedExtensions.join(", ")}`;
2074
- }
2075
- validFiles.push(file);
2076
- }
2077
- return validFiles;
2078
- },
2079
- [maxFiles, maxSizeMB, allowedExtensions]
2080
- );
2081
- const handleFileChange = useCallback7(
2082
- (event) => {
2083
- const result = validateFiles(event.target.files);
2084
- if (typeof result === "string") {
2085
- setError(name, { type: "validation", message: result });
2086
- if (fileInputRef.current) {
2087
- fileInputRef.current.value = "";
2088
- }
2089
- return;
2090
- }
2091
- clearErrors(name);
2092
- field.onChange(result);
2093
- },
2094
- [validateFiles, setError, clearErrors, name, field]
2095
- );
2096
- const handleRemoveFile = useCallback7(
2097
- (index) => {
2098
- const newFiles = files.filter((_, i) => i !== index);
2099
- field.onChange(newFiles);
2100
- if (fileInputRef.current) {
2101
- fileInputRef.current.value = "";
2102
- }
2103
- },
2104
- [files, field]
2105
- );
2106
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
2107
- return /* @__PURE__ */ jsxs7(
2108
- FormControl5,
2109
- {
2110
- fullWidth: true,
2111
- margin: "normal",
2112
- error: !!error,
2113
- required,
2114
- disabled,
2115
- children: [
2116
- label && /* @__PURE__ */ jsx14(FormLabel4, { sx: { mb: 1 }, children: label }),
2117
- /* @__PURE__ */ jsxs7(Box2, { children: [
2118
- /* @__PURE__ */ jsxs7(
2119
- Button,
2120
- {
2121
- variant: "outlined",
2122
- component: "label",
2123
- startIcon: /* @__PURE__ */ jsx14(CloudUploadIcon, {}),
2124
- disabled: disabled || files.length >= maxFiles,
2125
- children: [
2126
- buttonText,
2127
- /* @__PURE__ */ jsx14(
2128
- "input",
2129
- {
2130
- ref: fileInputRef,
2131
- type: "file",
2132
- multiple: true,
2133
- accept: allowedExtensions.join(","),
2134
- hidden: true,
2135
- onChange: handleFileChange
2136
- }
2137
- )
2138
- ]
2139
- }
2140
- ),
2141
- files.length > 0 && /* @__PURE__ */ jsx14(Stack, { direction: "row", spacing: 1, flexWrap: "wrap", sx: { mt: 2 }, children: files.map((file, index) => /* @__PURE__ */ jsx14(
2142
- Chip,
2143
- {
2144
- label: `${file.name} (${(file.size / 1024).toFixed(1)} KB)`,
2145
- onDelete: disabled ? void 0 : () => handleRemoveFile(index),
2146
- sx: { mb: 1 }
2147
- },
2148
- `${file.name}-${index}`
2149
- )) })
2150
- ] }),
2151
- (errorMessage || helperText) && /* @__PURE__ */ jsx14(FormHelperText5, { children: errorMessage || helperText })
2152
- ]
2153
- }
2154
- );
2155
- };
2156
- var FileUploadElement = ({
2157
- gridProps = {},
2158
- ...props
2159
- }) => {
2160
- return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
2161
- };
2162
- FileUploadElement.displayName = "FileUploadElement";
2163
-
2164
- // src/wrappers/PhoneNumberElement/PhoneNumberElement.tsx
2165
- import { Grid as Grid14 } from "@mui/material";
2166
- import { useController as useController14 } from "react-hook-form";
2167
- import { MuiTelInput } from "mui-tel-input";
2168
- import { jsx as jsx15 } from "react/jsx-runtime";
2169
- var TelInput = MuiTelInput;
2170
- var Component13 = function PhoneNumberEl(props) {
2171
- const {
2172
- name,
2173
- control,
2174
- label,
2175
- placeholder,
2176
- defaultCountry = "US",
2177
- preferredCountries,
2178
- onlyCountries,
2179
- excludeCountries,
2180
- disabled = false,
2181
- required = false,
2182
- parseError,
2183
- textFieldProps
2184
- } = props;
2185
- const {
2186
- field,
2187
- fieldState: { error }
2188
- } = useController14({ name, control });
2189
- const errorMessage = error ? parseError ? parseError(error) : error.message : textFieldProps?.helperText;
2190
- return /* @__PURE__ */ jsx15(
2191
- TelInput,
2192
- {
2193
- value: field.value ?? "",
2194
- onChange: (val) => field.onChange(val),
2195
- onBlur: () => field.onBlur(),
2196
- inputRef: field.ref,
2197
- label,
2198
- placeholder,
2199
- defaultCountry,
2200
- preferredCountries,
2201
- onlyCountries,
2202
- excludedCountries: excludeCountries,
2203
- forceCallingCode: true,
2204
- focusOnSelectFlag: true,
2205
- fullWidth: true,
2206
- required,
2207
- disabled,
2208
- error: !!error,
2209
- helperText: errorMessage,
2210
- size: textFieldProps?.size
2211
- }
2212
- );
2213
- };
2214
- var PhoneNumberElement = ({
2215
- gridProps = {},
2216
- ...props
2217
- }) => {
2218
- return /* @__PURE__ */ jsx15(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(Component13, { ...props }) });
2219
- };
2220
-
2221
- // src/wrappers/AsyncSelect/index.tsx
2222
- import {
2223
- Autocomplete as Autocomplete5,
2224
- CircularProgress as CircularProgress3,
2225
- Grid as Grid15,
2226
- TextField as TextField7,
2227
- useTheme as useTheme6
2228
- } from "@mui/material";
2229
- import { debounce as debounce2 } from "@mui/material/utils";
2230
- import {
2231
- Fragment as Fragment3,
2232
- useCallback as useCallback8,
2233
- useEffect as useEffect5,
2234
- useMemo as useMemo9,
2235
- useRef as useRef4,
2236
- useState as useState4
2237
- } from "react";
2238
- import {
2239
- useController as useController15
2240
- } from "react-hook-form";
2241
- import { jsx as jsx16, jsxs as jsxs8 } from "react/jsx-runtime";
2242
- var Component14 = function AsyncSelectElement(props) {
2243
- const {
2244
- name,
2245
- disabled,
2246
- control,
2247
- placeholder,
2248
- // initialValue,
2249
- // isNullable,
2250
- label,
2251
- queryFn,
2252
- variant,
2253
- labelField = "Label",
2254
- valueField = "Value",
2255
- ...rest
2256
- } = props;
2257
- const {
2258
- field,
2259
- fieldState: { error }
2260
- } = useController15({
2261
- name,
2262
- control
2263
- });
2264
- const theme = useTheme6();
2265
- const [loading, setLoading] = useState4(false);
2266
- const [selectedOption, setSelectedOption] = useState4(null);
2267
- const [inputValue, setInputValue] = useState4("");
2268
- const [options, setOptions] = useState4([]);
2269
- const [open, setOpen] = useState4(false);
2270
- const loadedValueRef = useRef4(
2271
- void 0
2272
- );
2273
- const fetchData = useMemo9(
2274
- () => debounce2(
2275
- (payload, callback) => {
2276
- queryFn(payload).then((c) => callback(c));
2277
- },
2278
- 400
2279
- ),
2280
- [queryFn]
2281
- );
2282
- const getOptionValue = useCallback8(
2283
- (option) => {
2284
- return option ? String(option[valueField]) : "";
2285
- },
2286
- [valueField]
2287
- );
2288
- const getOptionLabel = useCallback8(
2289
- (option) => {
2290
- return option ? String(option[labelField]) : "";
2291
- },
2292
- [labelField]
2293
- );
2294
- useEffect5(() => {
2295
- const currentValue = field.value;
2296
- if (currentValue && loadedValueRef.current !== currentValue) {
2297
- if (selectedOption && getOptionValue(selectedOption) === currentValue) {
2298
- loadedValueRef.current = currentValue;
2299
- return;
2300
- }
2301
- const active = true;
2302
- setLoading(true);
2303
- loadedValueRef.current = currentValue;
2304
- fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
2305
- if (!active) return;
2306
- setLoading(false);
2307
- const matchedOption = results?.find(
2308
- (option) => String(getOptionValue(option)) === String(currentValue)
2309
- );
2310
- if (matchedOption) {
2311
- setOptions([matchedOption]);
2312
- setSelectedOption(matchedOption);
2313
- setInputValue(getOptionLabel(matchedOption));
2314
- }
2315
- });
2316
- return;
2317
- }
2318
- if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
2319
- if (inputValue === "") {
2320
- setOptions([]);
2321
- setLoading(false);
2322
- return;
2323
- }
2324
- const active = true;
2325
- setLoading(true);
2326
- fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
2327
- if (!active) return;
2328
- setLoading(false);
2329
- setOptions(results || []);
2330
- });
2331
- return;
2332
- }
2333
- if (!currentValue && selectedOption) {
2334
- setSelectedOption(null);
2335
- setInputValue("");
2336
- setOptions([]);
2337
- loadedValueRef.current = void 0;
2338
- }
2339
- }, [
2340
- field.value,
2341
- inputValue,
2342
- fetchData,
2343
- getOptionLabel,
2344
- getOptionValue,
2345
- selectedOption,
2346
- labelField,
2347
- valueField
2348
- ]);
2349
- const isDisabled = useMemo9(() => {
2350
- return disabled ?? false;
2351
- }, [disabled]);
2352
- const handleChange = useCallback8(
2353
- (_, newSelectedOption) => {
2354
- setSelectedOption(newSelectedOption);
2355
- const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
2356
- field.onChange(newValue);
2357
- loadedValueRef.current = newValue;
2358
- if (newSelectedOption) {
2359
- setInputValue(getOptionLabel(newSelectedOption));
2360
- } else {
2361
- setInputValue("");
2362
- setOptions([]);
2363
- }
2364
- },
2365
- [field, getOptionValue, getOptionLabel]
2366
- );
2367
- const handleInputChange = useCallback8(
2368
- (_, newInputValue) => {
2369
- setInputValue(newInputValue);
2370
- },
2371
- []
2372
- );
2373
- const handleBlur = useCallback8(() => {
2374
- if (selectedOption) {
2375
- setInputValue(getOptionLabel(selectedOption));
2376
- } else {
2377
- setInputValue("");
2378
- }
2379
- }, [selectedOption, getOptionLabel]);
2380
- const handleOpen = useCallback8(() => {
2381
- setOpen(true);
2382
- }, []);
2383
- const handleClose = useCallback8(() => {
2384
- setOpen(false);
2385
- }, []);
2386
- return /* @__PURE__ */ jsx16(
2387
- Autocomplete5,
2388
- {
2389
- ...rest,
2390
- fullWidth: true,
2391
- open,
2392
- onOpen: handleOpen,
2393
- onClose: handleClose,
2394
- onBlur: handleBlur,
2395
- loading,
2396
- getOptionLabel,
2397
- getOptionKey: getOptionValue,
2398
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2399
- autoComplete: true,
2400
- disabled: isDisabled,
2401
- includeInputInList: true,
2402
- options,
2403
- value: selectedOption,
2404
- filterSelectedOptions: true,
2405
- filterOptions: (x) => x,
2406
- onChange: handleChange,
2407
- onInputChange: handleInputChange,
2408
- sx: {
2409
- "&.Mui-disabled": {
2410
- cursor: "not-allowed !important"
2411
- },
2412
- "& .MuiInputBase-root.Mui-disabled": {
2413
- backgroundColor: theme.palette.action.disabledBackground,
2414
- cursor: "not-allowed !important"
2415
- },
2416
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
2417
- cursor: "not-allowed !important"
2418
- },
2419
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
2420
- borderColor: error ? "red" : void 0
2421
- },
2422
- "& .MuiFilledInput-root.Mui-disabled": {
2423
- borderColor: error ? "red" : void 0
2424
- }
2425
- },
2426
- noOptionsText: "Type Something...",
2427
- renderInput: (params) => /* @__PURE__ */ jsx16(
2428
- TextField7,
2429
- {
2430
- ...params,
2431
- label,
2432
- error: !!error,
2433
- helperText: error ? error.message : "",
2434
- placeholder,
2435
- slotProps: {
2436
- input: {
2437
- ...params.InputProps,
2438
- endAdornment: /* @__PURE__ */ jsxs8(Fragment3, { children: [
2439
- loading ? /* @__PURE__ */ jsx16(CircularProgress3, { color: "inherit", size: 20 }) : null,
2440
- params.InputProps.endAdornment
2441
- ] })
2442
- }
2443
- },
2444
- variant: variant ? variant : "outlined"
2445
- }
2446
- ),
2447
- renderOption: (renderProps, option) => {
2448
- const { key, ...optionProps } = renderProps;
2449
- return /* @__PURE__ */ jsx16("li", { ...optionProps, children: option[labelField] }, key);
2450
- }
2451
- }
2452
- );
2453
- };
2454
- var AsyncSelectElement2 = ({
2455
- gridProps = {},
2456
- ...props
2457
- }) => {
2458
- return /* @__PURE__ */ jsx16(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(
2459
- Component14,
2460
- {
2461
- ...props
2462
- }
2463
- ) });
2464
- };
2465
- AsyncSelectElement2.displayName = "AsyncSelectElement";
2466
-
2467
- // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2468
- import { Grid as Grid16, TextField as TextField8, useForkRef as useForkRef5 } from "@mui/material";
2469
- import { useController as useController16 } from "react-hook-form";
2470
- import { jsx as jsx17 } from "react/jsx-runtime";
2471
- var Component15 = function NumberFieldElement(props) {
2472
- const {
2473
- parseError,
2474
- name,
2475
- control,
2476
- component: TextFieldComponent = TextField8,
2477
- transform,
2478
- fieldType = "text",
2479
- // Default to text type
2480
- defaultValue,
2481
- label,
2482
- placeholder,
2483
- textFieldProps = {},
2484
- variant,
2485
- onChange: customOnChange,
2486
- enableWarnings = process.env.NODE_ENV === "development",
2487
- maxLength,
2488
- ...rest
2489
- } = props;
2490
- const {
2491
- type = "number",
2492
- required,
2493
- helperText,
2494
- inputRef,
2495
- onInput,
2496
- onBlur,
2497
- disabled,
2498
- ...restTextProps
2499
- } = textFieldProps;
2500
- const {
2501
- field,
2502
- fieldState: { error }
2503
- } = useController16({
2504
- name,
2505
- control
2506
- });
2507
- const { value, onChange } = useEnhancedTransform(
2508
- {
2509
- value: field.value,
2510
- onChange: field.onChange,
2511
- transform: transform ? {
2512
- input: transform.input,
2513
- output: transform.output
2514
- } : void 0,
2515
- fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
2516
- // Auto-detect number type
2517
- defaultValue,
2518
- enableWarnings
2519
- }
2520
- );
2521
- const handleInputRef = useForkRef5(field.ref, inputRef);
2522
- return /* @__PURE__ */ jsx17(
2523
- TextFieldComponent,
2524
- {
2525
- ...rest,
2526
- ...restTextProps,
2527
- name: field.name,
2528
- value,
2529
- onChange: (event) => {
2530
- const input = event.target.value;
2531
- if (input === "") {
2532
- field.onChange(null);
2533
- }
2534
- onChange(event);
2535
- if (typeof customOnChange === "function") {
2536
- customOnChange(event);
2537
- }
2538
- },
2539
- onBlur: (event) => {
2540
- field.onBlur();
2541
- if (typeof onBlur === "function") {
2542
- onBlur(event);
2543
- }
2544
- },
2545
- onInput: (event) => {
2546
- if (type === "number" && maxLength && event.target.value.length > maxLength) {
2547
- event.target.value = event.target.value.slice(0, maxLength);
2548
- }
2549
- if (typeof onInput === "function") {
2550
- onInput(event);
2551
- }
2552
- },
2553
- onWheel: (e) => {
2554
- e.target.blur();
2555
- },
2556
- onKeyDown: (e) => {
2557
- if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2558
- e.preventDefault();
2559
- }
2560
- },
2561
- disabled,
2562
- label,
2563
- placeholder,
2564
- fullWidth: true,
2565
- required,
2566
- type,
2567
- error: !!error,
2568
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
2569
- inputRef: handleInputRef,
2570
- slotProps: { htmlInput: { maxLength } },
2571
- variant: variant ? variant : "outlined"
2572
- }
2573
- );
2574
- };
2575
- var NumberFieldElement2 = ({
2576
- gridProps = {},
2577
- ...props
2578
- }) => {
2579
- return /* @__PURE__ */ jsx17(Grid16, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx17(Component15, { ...props }) });
2580
- };
2581
-
2582
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2583
- import { Box as Box3, Grid as Grid17, inputBaseClasses } from "@mui/material";
2584
- import {
2585
- MuiOtpInput
2586
- } from "mui-one-time-password-input";
2587
- import { Controller } from "react-hook-form";
2588
-
2589
- // src/wrappers/OTPInputElement/HelperText.tsx
2590
- import FormHelperText6 from "@mui/material/FormHelperText";
2591
- import { jsx as jsx18 } from "react/jsx-runtime";
2592
- function HelperText({
2593
- sx,
2594
- helperText,
2595
- errorMessage,
2596
- disableGutters,
2597
- ...other
2598
- }) {
2599
- if (errorMessage || helperText) {
2600
- return /* @__PURE__ */ jsx18(
2601
- FormHelperText6,
2602
- {
2603
- error: !!errorMessage,
2604
- sx: [
2605
- {
2606
- mx: disableGutters ? 0 : 1.75
2607
- },
2608
- ...Array.isArray(sx) ? sx : [sx]
2609
- ],
2610
- ...other,
2611
- children: errorMessage || helperText
2612
- }
2613
- );
2614
- }
2615
- return null;
2616
- }
2617
-
2618
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2619
- import { jsx as jsx19, jsxs as jsxs9 } from "react/jsx-runtime";
2620
- var Component16 = function OTPInputElement(props) {
2621
- const {
2622
- // parseError,
2623
- name,
2624
- control,
2625
- slotProps,
2626
- helperText,
2627
- maxSize = 56,
2628
- placeholder = "-",
2629
- ...rest
2630
- } = props;
2631
- return /* @__PURE__ */ jsx19(
2632
- Controller,
2633
- {
2634
- name,
2635
- control,
2636
- render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs9(
2637
- Box3,
2638
- {
2639
- ...slotProps?.wrapper,
2640
- sx: [
2641
- {
2642
- display: "flex",
2643
- justifyContent: "center",
2644
- [`& .${inputBaseClasses.input}`]: {
2645
- p: 0,
2646
- height: "auto",
2647
- aspectRatio: "1/1",
2648
- maxWidth: maxSize
2649
- }
2650
- },
2651
- ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2652
- ],
2653
- children: [
2654
- /* @__PURE__ */ jsx19(
2655
- MuiOtpInput,
2656
- {
2657
- ...field,
2658
- autoFocus: true,
2659
- gap: 1.5,
2660
- length: 4,
2661
- TextFieldsProps: {
2662
- placeholder,
2663
- error: !!error,
2664
- ...slotProps?.textfield
2665
- },
2666
- ...rest
2667
- }
2668
- ),
2669
- /* @__PURE__ */ jsx19(
2670
- HelperText,
2671
- {
2672
- ...slotProps?.helperText,
2673
- errorMessage: error?.message,
2674
- helperText
2675
- }
2676
- )
2677
- ]
2678
- }
2679
- )
2680
- }
2681
- );
2682
- };
2683
- var OTPInputElement2 = ({
2684
- gridProps = {},
2685
- ...props
2686
- }) => {
2687
- return /* @__PURE__ */ jsx19(Grid17, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx19(Component16, { ...props }) });
2688
- };
2689
-
2690
- // src/wrappers/Field/index.ts
2691
- var Field = {
2692
- Text: TextFieldElement2,
2693
- Number: NumberFieldElement2,
2694
- Checkbox: CheckboxElement2,
2695
- Date: DatePickerElement,
2696
- RadioGroup: RadioButtonGroup2,
2697
- Password: PasswordElement,
2698
- Phone: PhoneNumberElement,
2699
- Time: TimePickerElement2,
2700
- Select: SelectElement2,
2701
- SelectMulti: SelectMultiElement2,
2702
- SelectCascade: SelectCascadeElement2,
2703
- AsyncSelect: AsyncSelectElement2,
2704
- AsyncMultiSelect: AsyncSelectMultiElement2,
2705
- CheckboxGroup: CheckboxGroupElement,
2706
- OTPInput: OTPInputElement2,
2707
- Slider: SliderElement,
2708
- FileUpload: FileUploadElement
2709
- };
2710
-
2711
- export {
2712
- isValidOption,
2713
- normalizeOptions,
2714
- AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2715
- CheckboxElement2 as CheckboxElement,
2716
- CheckboxGroupElement,
2717
- readDatePickerValueAsDate,
2718
- useDatePickerValue,
2719
- useDatePickerValidation,
2720
- useDatePickerStyles,
2721
- DatePickerElementCore,
2722
- DatePickerElement,
2723
- isValidDate,
2724
- isParsableDateString,
2725
- createDateInputTransform,
2726
- createDateOutputTransform,
2727
- createDefaultDatePickerConfig,
2728
- extractErrorMessage,
2729
- createStableKey,
2730
- PasswordElement,
2731
- RadioButtonGroup2 as RadioButtonGroup,
2732
- SelectCascadeElement2 as SelectCascadeElement,
2733
- SelectElement2 as SelectElement,
2734
- SelectMultiElement2 as SelectMultiElement,
2735
- TextFieldElement2 as TextFieldElement,
2736
- TimePickerElement2 as TimePickerElement,
2737
- SliderElement,
2738
- FileUploadElement,
2739
- PhoneNumberElement,
2740
- Field
2741
- };
2742
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NsaWRlckVsZW1lbnQvU2xpZGVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpbGVVcGxvYWRFbGVtZW50L0ZpbGVVcGxvYWRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvUGhvbmVOdW1iZXJFbGVtZW50L1Bob25lTnVtYmVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0FzeW5jU2VsZWN0L2luZGV4LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvTnVtYmVyRmllbGRFbGVtZW50L051bWJlckZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9PVFBJbnB1dEVsZW1lbnQvSGVscGVyVGV4dC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpZWxkL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvbW1vbiB0eXBlIGRlZmluaXRpb25zIGZvciB3cmFwcGVyIGNvbXBvbmVudHNcbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEJhc2Ugb3B0aW9uIHR5cGUgZm9yIHNlbGVjdC1iYXNlZCBjb21wb25lbnRzXG4gKlxuICogQHRlbXBsYXRlIFYgLSBUaGUgdmFsdWUgdHlwZSAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU9wdGlvbjxWID0gc3RyaW5nIHwgbnVtYmVyPiB7XG4gIC8qKlxuICAgKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvblxuICAgKi9cbiAgVmFsdWU6IFY7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZsZXhpYmxlIG9wdGlvbiB0eXBlIHRoYXQgZXh0ZW5kcyBiYXNlIG9wdGlvbiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9iamVjdFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmxleGlibGVPcHRpb248XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiA9IFQgJiBCYXNlT3B0aW9uO1xuXG4vKipcbiAqIE9wdGlvbiB0eXBlIHdpdGggY3VzdG9taXphYmxlIGtleSBuYW1lc1xuICogVXNlZnVsIGZvciBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGN1c3RvbSBsYWJlbEZpZWxkL3ZhbHVlRmllbGQgcHJvcHNcbiAqXG4gKiBAdGVtcGxhdGUgVFZhbHVlS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIHZhbHVlXG4gKiBAdGVtcGxhdGUgVExhYmVsS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGxhYmVsXG4gKiBAdGVtcGxhdGUgVERpc2FibGVkS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGRpc2FibGVkIGZsYWdcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUtleU9wdGlvbjxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiAmXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIExlZ2FjeSBvcHRpb24gdHlwZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAqIFVzZXMgVmFsdWUvTGFiZWwgbmFtaW5nIGNvbnZlbnRpb25cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQmFzZU9wdGlvbiBvciBGbGV4aWJsZU9wdGlvbiBpbnN0ZWFkXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5T3B0aW9uIHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgVmFsdWU6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBEaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBvcHRpb25cbiAqXG4gKiBAcGFyYW0gVmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBvcHRpb24gb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE9wdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJhc2VPcHRpb24ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICdMYWJlbCcgaW4gdmFsdWUgJiZcbiAgICAnVmFsdWUnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5MYWJlbCA9PT0gJ3N0cmluZycgJiZcbiAgICAodHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnYm9vbGVhbicpXG4gICk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIG5vcm1hbGl6ZSBvcHRpb25zIHRvIEJhc2VPcHRpb24gZm9ybWF0XG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGFycmF5IHRvIG5vcm1hbGl6ZVxuICogQHBhcmFtIGxhYmVsRmllbGQgLSBDdXN0b20gbGFiZWwgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHZhbHVlRmllbGQgLSBDdXN0b20gdmFsdWUgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHJldHVybnMgTm9ybWFsaXplZCBvcHRpb25zIGFycmF5XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRpb25zOiBUW10sXG4gIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJ1xuKTogQmFzZU9wdGlvbltdIHtcbiAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgIExhYmVsOiBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdID8/ICcnKSxcbiAgICBWYWx1ZTogb3B0aW9uW3ZhbHVlRmllbGRdIGFzIHN0cmluZyB8IG51bWJlcixcbiAgICBkaXNhYmxlZDogQm9vbGVhbihvcHRpb24uZGlzYWJsZWQpLFxuICB9KSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBkZWJvdW5jZSxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgbWF0Y2ggZnJvbSAnYXV0b3N1Z2dlc3QtaGlnaGxpZ2h0L21hdGNoJztcbmltcG9ydCBwYXJzZSBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvcGFyc2UnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIHVzZVN0YXRlLFxuICB1c2VSZWYsXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIEZyYWdtZW50LFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEhUTUxBdHRyaWJ1dGVzLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBUT3B0aW9uXG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9ucywgc2V0U2VsZWN0ZWRPcHRpb25zXSA9IHVzZVN0YXRlPFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3QgbG9hZGVkVmFsdWVzUmVmID0gdXNlUmVmPFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBpbml0aWFsTG9hZENvbXBsZXRlUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgLy8gU3RvcmUgc2VsZWN0ZWQgb3B0aW9ucyBpbiBhIHJlZiBzbyBFZmZlY3QgMiBjYW4gYWNjZXNzIHdpdGhvdXQgZGVwZW5kZW5jeVxuICBjb25zdCBzZWxlY3RlZE9wdGlvbnNSZWYgPSB1c2VSZWY8VE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiAob3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJyksXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiAob3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJyksXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY011bHRpU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKGMgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGMgYXMgeyBkYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuZGF0YSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAoYyBhcyB7IGRhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5kYXRhIGFzIHJlYWRvbmx5IFRPcHRpb25bXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgYyAmJlxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KChjIGFzIHsgRGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLkRhdGEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgKGMgYXMgeyBEYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuRGF0YSBhcyByZWFkb25seSBUT3B0aW9uW11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIC8vIFN5bmMgcmVmIHdoZW5ldmVyIHNlbGVjdGVkT3B0aW9ucyBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQgPSBzZWxlY3RlZE9wdGlvbnM7XG4gIH0sIFtzZWxlY3RlZE9wdGlvbnNdKTtcblxuICAvLyBFZmZlY3QgMTogU3luYyB3aXRoIGV4dGVybmFsIGZpZWxkLnZhbHVlIGNoYW5nZXMgZnJvbSByZWFjdC1ob29rLWZvcm0gKElOSVRJQUwgTE9BRCBPTkxZKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW107XG5cbiAgICAvLyBDaGVjayBpZiBpbml0aWFsIGxvYWQgaXMgY29tcGxldGUgYW5kIGN1cnJlbnQgZm9ybSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGxvYWRlZCBvbmVzLlxuICAgIC8vIElmIHNvLCBubyBuZWVkIHRvIHJlZmV0Y2ggZm9yIGluaXRpYWwgcG9wdWxhdGlvbi5cbiAgICBpZiAoXG4gICAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGZvcm1WYWx1ZXMpID09PSBKU09OLnN0cmluZ2lmeShsb2FkZWRWYWx1ZXNSZWYuY3VycmVudClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZm9ybSB2YWx1ZXMsIHJlc2V0IGFuZCBtYXJrIGluaXRpYWwgbG9hZCBhcyBjb21wbGV0ZS5cbiAgICBpZiAoZm9ybVZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9ucyhbXSk7XG4gICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gW107XG4gICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgPSB0cnVlOyAvLyBNYXJrIGFzIGNvbXBsZXRlIGFzIHRoZXJlJ3Mgbm90aGluZyB0byBmZXRjaFxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZWVkIGlmIGZvcm1WYWx1ZXMgYXJlIHByZXNlbnQgYW5kIHdlIGhhdmVuJ3QgY29tcGxldGVkIHRoZSBpbml0aWFsIGxvYWQgZm9yIHRoZXNlIHNwZWNpZmljIHZhbHVlc1xuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgPSB0cnVlO1xuICAgIC8vIFNldCBsb2FkZWRWYWx1ZXNSZWYgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByZS10cmlnZ2VyaW5nIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBmb3JtVmFsdWVzO1xuICAgIC8vIE1hcmsgaW5pdGlhbCBsb2FkIGFzIGNvbXBsZXRlIHByb2FjdGl2ZWx5IGJlZm9yZSBmZXRjaGluZyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzXG4gICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBudWxsLCBTZWxlY3RlZFZhbHVlOiBmb3JtVmFsdWVzIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBjb25zdCBmZXRjaGVkT3B0aW9ucyA9IHJlc3VsdHMgfHwgW107XG5cbiAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFsuLi5mZXRjaGVkT3B0aW9uc10pO1xuICAgICAgICBzZXRPcHRpb25zKGZldGNoZWRPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbZmllbGQudmFsdWUsIGZldGNoRGF0YV0pO1xuXG4gIC8vIEVmZmVjdCAyOiBIYW5kbGUgdXNlciBzZWFyY2ggaW5wdXRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBEb24ndCBzZWFyY2ggZHVyaW5nIGluaXRpYWwgcG9wdWxhdGlvblxuICAgIGlmIChpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGlucHV0IGlzIGVtcHR5LCBqdXN0IHNob3cgdGhlIHNlbGVjdGVkIG9wdGlvbnNcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIC8vIElmIG5vIG9wdGlvbnMgYXJlIHNlbGVjdGVkLCBjbGVhciB0aGUgb3B0aW9ucyB0byBkaXNwbGF5IFwibm9PcHRpb25zVGV4dFwiXG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzaG93IHRoZSBzZWxlY3RlZCBvcHRpb25zXG4gICAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQpO1xuICAgICAgfVxuXG4gICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZldGNoIGlmIHRoZSBpbnB1dCB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIGlmIChpbnB1dFZhbHVlID09PSBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHNlYXJjaFJlc3VsdHMgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoUmVzdWx0cyB8fCBbXTtcbiAgICAgICAgLy8gVXNlIHJlZiB0byBnZXQgY3VycmVudCBzZWxlY3RlZCBvcHRpb25zIHdpdGhvdXQgYWRkaW5nIHRvIGRlcGVuZGVuY2llc1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZC5tYXAob3B0ID0+IGdldE9wdGlvblZhbHVlKG9wdCkpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gWy4uLmN1cnJlbnRTZWxlY3RlZF07XG5cbiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFzZWxlY3RlZE9wdGlvbklkcy5oYXMoZ2V0T3B0aW9uVmFsdWUocmVzdWx0KSkpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZXRPcHRpb25zKGNvbWJpbmVkKTtcbiAgICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBpbnB1dFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8vIENSSVRJQ0FMOiBSZW1vdmVkIHNlbGVjdGVkT3B0aW9ucyBmcm9tIGRlcGVuZGVuY2llcyAtIHVzZSByZWYgaW5zdGVhZFxuICB9LCBbaW5wdXRWYWx1ZSwgZmV0Y2hEYXRhLCBnZXRPcHRpb25WYWx1ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChfOiBTeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10pID0+IHtcbiAgICBzZXRTZWxlY3RlZE9wdGlvbnMobmV3U2VsZWN0ZWRPcHRpb25zKTtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXdTZWxlY3RlZE9wdGlvbnMubWFwKGMgPT4gY1t2YWx1ZUZpZWxkXSk7XG5cbiAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IG5ld1ZhbHVlcyk7XG4gICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBuZXdWYWx1ZXMgYXMgdW5rbm93biBhcyBUT3B0aW9uW107XG4gICAgc2V0T3B0aW9ucyhuZXdTZWxlY3RlZE9wdGlvbnMpO1xuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIC8vIENsZWFyIGxhc3Qgc2VhcmNoIHRlcm0gd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xuICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgfTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGRpc2FibGVkID8/IGZhbHNlO1xuICB9LCBbZGlzYWJsZWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbCkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsKVxuICAgICAgfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbnN9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGZpbHRlck9wdGlvbnM9e3ggPT4geH1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4gc2V0SW5wdXRWYWx1ZShuZXdJbnB1dFZhbHVlKX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIElucHV0UHJvcHM9e3tcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzLCBvcHRpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID1cbiAgICAgICAgICBwcm9wcyBhcyBIVE1MQXR0cmlidXRlczxIVE1MTElFbGVtZW50PiAmIHsga2V5OiBzdHJpbmcgfTtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBnZXRPcHRpb25MYWJlbChvcHRpb24pO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gbWF0Y2gob3B0aW9uTGFiZWwsIHN0YXRlLmlucHV0VmFsdWUsIHtcbiAgICAgICAgICBpbnNpZGVXb3JkczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2Uob3B0aW9uTGFiZWwsIG1hdGNoZXMpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3BhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHBhcnQuaGlnaGxpZ2h0ID8gNzAwIDogNDAwLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7cGFydC50ZXh0fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY1NlbGVjdE11bHRpRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzLFxuICAuLi5wcm9wc1xufTogQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+IHsuLi5wcm9wc30gLz5cbiAgKTtcbn07XG5cbkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0TXVsdGknO1xuXG5leHBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9O1xuIiwgImltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcywgUGF0aFZhbHVlIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGlmIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIGZpZWxkLm9uQ2hhbmdlKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9IHRyYW5zZm9ybT8ub3V0cHV0O1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgYm9vbGVhbj4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4gISF2YWx1ZSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU91dHB1dFRyYW5zZm9ybShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGNoZWNrZWQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgb25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtsYWJlbCB8fCAnJ31cbiAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lPiB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgQ2hlY2tib3hFbGVtZW50IH07XG5cbmV4cG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIENoZWNrYm94UHJvcHMsXG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBDaGVja2JveEdyb3VwIGNvbXBvbmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSBhcnJheSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5cbi8vIFR5cGUgZm9yIHByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyByYWRpbyBidXR0b24gdmFsdWVzXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gQ29uc3RyYWludCB0byBlbnN1cmUgb3B0aW9uIG9iamVjdHMgaGF2ZSB0aGUgcmVxdWlyZWQga2V5c1xudHlwZSBPcHRpb25PYmplY3Q8XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgUHJpbWl0aXZlVmFsdWU+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+O1xuXG5leHBvcnQgdHlwZSBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPiA9IE9taXQ8Q2hlY2tib3hQcm9wcywgJ25hbWUnPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcblxuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICAvKipcbiAgICogTGFiZWwgZm9yIHRoZSBjaGVja2JveCBncm91cFxuICAgKi9cbiAgbGFiZWw/OiBGb3JtQ29udHJvbExhYmVsUHJvcHNbJ2xhYmVsJ107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIEZvcm1Db250cm9sTGFiZWxcbiAgICovXG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJz47XG5cbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlclxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcblxuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgZm9ybUxhYmVsUHJvcHM/OiBPbWl0PEZvcm1MYWJlbFByb3BzLCAncmVxdWlyZWQnIHwgJ2Vycm9yJz47XG5cbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94R3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICByZXF1aXJlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICBsYWJlbFByb3BzLFxuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICBvcHRpb25zLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWVzQXNTdHJpbmcgPSAoXG4gICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgPyBmaWVsZC52YWx1ZSA6IFtdXG4gICkubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZFZhbHVlU3RyaW5nID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cbiAgICAgIGNvbnN0IG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nID0gaXNDaGVja2VkXG4gICAgICAgID8gWy4uLnNlbGVjdGVkVmFsdWVzQXNTdHJpbmcsIGNoYW5nZWRWYWx1ZVN0cmluZ11cbiAgICAgICAgOiBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nLmZpbHRlcih2ID0+IHYgIT09IGNoYW5nZWRWYWx1ZVN0cmluZyk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnNBcmVOdW1lcmljID1cbiAgICAgICAgb3B0aW9ucy5sZW5ndGggPiAwICYmIHR5cGVvZiBvcHRpb25zWzBdW3ZhbHVlS2V5XSA9PT0gJ251bWJlcic7XG5cbiAgICAgIGlmIChvcHRpb25zQXJlTnVtZXJpYykge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXNBc051bWJlcnMgPSBuZXdTZWxlY3RlZFZhbHVlc1N0cmluZ1xuICAgICAgICAgIC5tYXAodiA9PiBwYXJzZUludCh2LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcih2ID0+ICFpc05hTih2KSk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzQXNOdW1iZXJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgb3B0aW9ucywgdmFsdWVLZXksIHNlbGVjdGVkVmFsdWVzQXNTdHJpbmddXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIHtvcHRpb25zICYmXG4gICAgICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17YCR7b3B0aW9uW3ZhbHVlS2V5XX1gfVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uW3ZhbHVlS2V5XX1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVmFsdWVzQXNTdHJpbmcuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZyhvcHRpb25bdmFsdWVLZXldKVxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94R3JvdXAgY29tcG9uZW50IGZvciBtdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBncm91cCBvZiBjaGVja2JveGVzIHRoYXQgd29yayBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogbWFuYWdpbmcgYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgdmFsdWVzIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBNdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24gd2l0aCBhcnJheSB2YWx1ZSBtYW5hZ2VtZW50XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKiAtIE5hTiB2YWxpZGF0aW9uIGZvciBudW1lcmljIHZhbHVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInNlbGVjdGVkQ2F0ZWdvcmllc1wiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IFZhbHVlOiAxLCBMYWJlbDogJ0NhdGVnb3J5IDEnIH0sXG4gKiAgICAgeyBWYWx1ZTogMiwgTGFiZWw6ICdDYXRlZ29yeSAyJyB9LFxuICogICAgIHsgVmFsdWU6IDMsIExhYmVsOiAnQ2F0ZWdvcnkgMycgfSxcbiAqICAgXX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwZXJtaXNzaW9uc1wiXG4gKiAgIG9wdGlvbnM9e3Blcm1pc3Npb25PcHRpb25zfVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgZGlzYWJsZWQ9eyFoYXNFZGl0UGVybWlzc2lvbn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hHcm91cEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVERpc2FibGVkS2V5XG4+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQ2hlY2tib3hHcm91cEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQ2hlY2tib3hHcm91cCc7XG5cbmV4cG9ydCB7IENoZWNrYm94R3JvdXBFbGVtZW50IH07XG4iLCAiaW1wb3J0IHsgR3JpZCB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH0gZnJvbSBcIi4vRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50UHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEEgZnVsbHktZmVhdHVyZWQsIHR5cGUtc2FmZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgZm9yIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBjb21iaW5lcyB0aGUgY29yZSBkYXRlIHBpY2tlciBmdW5jdGlvbmFsaXR5IHdpdGggb3B0aW9uYWwgR3JpZCBsYXlvdXQgd3JhcHBpbmcsXG4gKiBwcm92aWRpbmcgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgZm9ybS1iYXNlZCBkYXRlIHNlbGVjdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0LlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gXHVEODNDXHVERkFGICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlcyBhbmQgZGF0ZSB2YWx1ZXNcbiAqIC0gXHVEODNEXHVERDI3ICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0gXHVEODNDXHVERkE4ICoqVGhlbWluZyoqOiBBdXRvbWF0aWMgYWRhcHRhdGlvbiB0byBNVUkgdGhlbWUgd2l0aCBjdXN0b21pemFibGUgc3R5bGVzXG4gKiAtIFx1MjY3RiAqKkFjY2Vzc2liaWxpdHkqKjogV0NBRy1jb21wbGlhbnQgd2l0aCBwcm9wZXIgQVJJQSBhdHRyaWJ1dGVzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gKiAtIFx1RDgzRFx1REU4MCAqKlBlcmZvcm1hbmNlKio6IE9wdGltaXplZCB3aXRoIG1lbW9pemF0aW9uIGFuZCBlZmZpY2llbnQgcmUtcmVuZGVyaW5nXG4gKiAtIFx1RDgzRFx1RENGMSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0gXHVEODNEXHVERUUxXHVGRTBGICoqVmFsaWRhdGlvbioqOiBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gXHVEODNEXHVERDA0ICoqVHJhbnNmb3JtYXRpb24qKjogRmxleGlibGUgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBcdUQ4M0RcdURDREEgKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsICJpbXBvcnQgeyB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGggfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQge1xuICB1c2VEYXRlUGlja2VyVmFsdWUsXG4gIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uLFxuICB1c2VEYXRlUGlja2VyU3R5bGVzLFxufSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgY29yZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aG91dCBHcmlkIHdyYXBwZXIuXG4gKlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0LCBwZXJmb3JtYW50IGRhdGUgcGlja2VyIGNvbXBvbmVudCB0aGF0IGludGVncmF0ZXMgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0gd2hpbGUgcHJvdmlkaW5nIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0IGFuZFxuICogYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlc1xuICogLSBBdXRvbWF0aWMgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gVGhlbWUtYXdhcmUgc3R5bGluZyB3aXRoIGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgd2l0aCBwcm9wZXIgbWVtb2l6YXRpb25cbiAqIC0gRm9yd2FyZCByZWYgc3VwcG9ydCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICByZXF1aXJlZFxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJTdGFydCBEYXRlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH19XG4gKiAgIHZhbGlkYXRpb249e3tcbiAqICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInXG4gKiAgICAgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnRDb3JlID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oXG4gIDxcbiAgICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICAgIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgPihcbiAgICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8XG4gICAgICBURmllbGRWYWx1ZXMsXG4gICAgICBUTmFtZSxcbiAgICAgIFRWYWx1ZSxcbiAgICAgIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmVcbiAgICA+LFxuICAgIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuICApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIGxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICB0ZXh0UmVhZE9ubHkgPSBmYWxzZSxcbiAgICAgIGhlbHBlclRleHQsXG4gICAgICBpbnB1dFByb3BzID0ge30sXG4gICAgICBzbG90UHJvcHMgPSB7fSxcbiAgICAgIGRhdGVQaWNrZXJQcm9wcyA9IHt9LFxuICAgICAgdmFyaWFudCA9ICdvdXRsaW5lZCcsXG4gICAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgICAgLi4ucmVzdFByb3BzXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICAgIG9uQ2xvc2UsXG4gICAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gICAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAgIC8vIFNldCB1cCBmb3JtIGNvbnRyb2xsZXJcbiAgICBjb25zdCB7IGZpZWxkLCBmaWVsZFN0YXRlIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250cm9sLFxuICAgICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIGFueSwgLy8gTGV0IHJlYWN0LWhvb2stZm9ybSBoYW5kbGUgdGhlIGRlZmF1bHQgdmFsdWUgdHlwaW5nXG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2U6IG9uVmFsdWVDaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gICAgICBmaWVsZCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRpb24gaG9va1xuICAgIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgICAgZmllbGRTdGF0ZSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG5cbiAgICAvLyBTdHlsaW5nIGhvb2tcbiAgICBjb25zdCB7IGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGhhc0Vycm9yLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHRleHRSZWFkT25seSxcbiAgICB9KTtcblxuICAgIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAgIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKFxuICAgICAgICBuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgICAgICkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBbb25WYWx1ZUNoYW5nZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgQXJyYXk8XG4gICAgICAgICAgICAnYWNjZXB0JyB8ICdjYW5jZWwnIHwgJ2NsZWFyJyB8ICduZXh0JyB8ICduZXh0T3JBY2NlcHQnIHwgJ3RvZGF5J1xuICAgICAgICAgID4sXG4gICAgICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgJ2FyaWEtaW52YWxpZCc6IGludmFsaWQsXG4gICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLi4uKGxvYWRpbmcgJiZcbiAgICAgICAgICAgIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIHNsb3RQcm9wcyxcbiAgICAgICAgaW5wdXRQcm9wcyxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICBoYXNFcnJvcixcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBoZWxwZXJUZXh0LFxuICAgICAgICB0ZXh0UmVhZE9ubHksXG4gICAgICAgIGludmFsaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAvLyBTcHJlYWQgcmVzdCBwcm9wcyBmaXJzdCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuXG4gICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuICAgICAgICAvLyBDb3JlIHByb3BzXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICAgIC8vIFVJIHByb3BzXG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgLy8gU2xvdCBwcm9wc1xuICAgICAgICBzbG90UHJvcHM9e21lbW9pemVkU2xvdFByb3BzfVxuICAgICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICAgIGFyaWEtaW52YWxpZD17aW52YWxpZH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17aGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbik7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZ1xuRGF0ZVBpY2tlckVsZW1lbnRDb3JlLmRpc3BsYXlOYW1lID0gJ0RhdGVQaWNrZXJFbGVtZW50Q29yZSc7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudENvcmU7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVRyYW5zZm9ybSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIFR5cGUtc2FmZSBkYXRlIHZhbHVlIHJlYWRlciB0aGF0IGhhbmRsZXMgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSBmcm9tIHRoZSBkYXRlIGFkYXB0ZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGxvY2FsaXphdGlvbiBjb250ZXh0IGZyb20gTVVJIGRhdGUgcGlja2Vyc1xuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKHN0cmluZywgZGF0ZSwgb3IgbnVsbClcbiAqIEByZXR1cm5zIFByb3Blcmx5IHR5cGVkIGRhdGUgdmFsdWUgb3IgbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERhdGVQaWNrZXJWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlIHwgdW5kZWZpbmVkXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBhZGFwdGVyIHRvIHBhcnNlIHRoZSBzdHJpbmcgaW50byBhIGRhdGVcbiAgICBjb25zdCBwYXJzZWREYXRlID0gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKTtcblxuICAgIHJldHVybiBwYXJzZWREYXRlIGFzIFREYXRlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVPcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIGNvbnRyb2xsZXIgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cbiAgZmllbGQ6IFVzZUNvbnRyb2xsZXJSZXR1cm48VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJmaWVsZFwiXTtcbiAgLyoqIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyAqL1xuICB0cmFuc2Zvcm0/OiBEYXRlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4ge1xuICAvKiogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXIgKi9cbiAgdmFsdWU6IFRWYWx1ZSB8IG51bGw7XG4gIC8qKiBDaGFuZ2UgaGFuZGxlciBmb3IgcGlja2VyIHZhbHVlIHVwZGF0ZXMgKi9cbiAgb25DaGFuZ2U6IChcbiAgICB2YWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPlxuICApID0+IHZvaWQ7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsdWUgdHJhbnNmb3JtYXRpb25zIHdpdGggdHlwZSBzYWZldHlcbiAqIFxuICogVGhpcyBob29rIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBmb3JtIGZpZWxkIHZhbHVlcyBhbmQgZGF0ZSBwaWNrZXIgdmFsdWVzLFxuICogYXBwbHlpbmcgY3VzdG9tIHRyYW5zZm9ybWF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBzdHJpY3QgVHlwZVNjcmlwdCB0eXBpbmcuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb246XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICogICBmaWVsZCxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIERheS5qcyBkYXRlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBkYXlqcyhkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdmFsdWUgdHJhbnNmb3JtYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYW5zZm9ybWVkIHZhbHVlIGFuZCBjaGFuZ2UgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclZhbHVlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZT4ge1xuICBjb25zdCB7IGZpZWxkLCB0cmFuc2Zvcm0gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFkYXB0ZXIgPSB1c2VMb2NhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgLy8gVHJhbnNmb3JtIHRoZSBmaWVsZCB2YWx1ZSBmb3IgZGlzcGxheSBpbiB0aGUgcGlja2VyXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKTogVFZhbHVlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm0uaW5wdXQoZmllbGQudmFsdWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBoYW5kbGUgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICAgIHJldHVybiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlKGFkYXB0ZXIsIGZpZWxkLnZhbHVlKSBhcyBUVmFsdWUgfCBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZpZWxkLnZhbHVlLCB0cmFuc2Zvcm0/LmlucHV0LCBhZGFwdGVyXSk7XG5cbiAgLy8gQ3JlYXRlIGEgc3RhYmxlIGNoYW5nZSBoYW5kbGVyXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLCBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm0ub3V0cHV0KG5ld1ZhbHVlLCBjb250ZXh0KTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZSh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IHN0b3JlIHRoZSBkYXRlIGFzLWlzXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIHN0YXRlIGZyb20gcmVhY3QtaG9vay1mb3JtIGNvbnRyb2xsZXIgKi9cbiAgZmllbGRTdGF0ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkU3RhdGVcIl07XG4gIC8qKiBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkYXRlIHBpY2tlciAqL1xuICB2YWxpZGF0aW9uPzogRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWc8VFZhbHVlPjtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogVGhlIGN1cnJlbnQgZGF0ZSB2YWx1ZSBmb3IgdmFsaWRhdGlvbiAqL1xuICB2YWx1ZT86IFRWYWx1ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycyAqL1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3IgKGZvcm0gb3IgZGF0ZS1zcGVjaWZpYykgKi9cbiAgZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkO1xuICAvKiogRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlOiBSZWFjdE5vZGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlICovXG4gIGludmFsaWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGRhdGUgdmFsaWRhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gIHJlcXVpcmVkOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsaWRhdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIFxuICogVGhpcyBob29rIGNlbnRyYWxpemVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGRhdGUgcGlja2VycywgaGFuZGxpbmcgYm90aFxuICogcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzXG4gKiBmcm9tIE1VSSBkYXRlIHBpY2tlcnMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGZvcm0gdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHZhbGlkYXRpb246IHtcbiAqICAgICBtaW5EYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICd5ZWFyJyksXG4gKiAgICAgbWF4RGF0ZTogZGF5anMoKS5hZGQoMSwgJ3llYXInKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnRGF0ZSBtdXN0IGJlIHdpdGhpbiB0aGUgbGFzdCB5ZWFyJyxcbiAqICAgICAgIG1heERhdGU6ICdEYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMSB5ZWFyIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBjdXN0b20gZXJyb3IgcGFyc2VyOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgcGFyc2VFcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAqICAgICAgIHJldHVybiBgRGF0ZSBFcnJvcjogJHtlcnJvcn1gO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gc3RhdGUgYW5kIGVycm9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICBjb25zdCB7IGZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHBhcnNlRXJyb3IsIHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE1lbW9pemUgdmFsaWRhdGlvbiByZXN1bHRzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvcjogZmllbGRFcnJvciwgaW52YWxpZCB9ID0gZmllbGRTdGF0ZTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGZvcm0gdmFsaWRhdGlvbiBlcnJvclxuICAgIGxldCBjdXJyZW50RXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkID0gZmllbGRFcnJvcjtcbiAgICBcbiAgICAvLyBDaGVjayBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb25zIGlmIG5vIGZvcm0gZXJyb3IgYW5kIHdlIGhhdmUgYSB2YWx1ZVxuICAgIGlmICghZmllbGRFcnJvciAmJiB2YWx1ZSAmJiB2YWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUsIHNob3VsZERpc2FibGVEYXRlLCBlcnJvck1lc3NhZ2VzIH0gPSB2YWxpZGF0aW9uO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBtaW5pbXVtIGRhdGVcbiAgICAgIGlmIChtaW5EYXRlICYmIHZhbHVlIDwgbWluRGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21pbkRhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1pbkRhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWF4aW11bSBkYXRlXG4gICAgICBlbHNlIGlmIChtYXhEYXRlICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21heERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1heERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZGlzYWJsZWQgZGF0ZVxuICAgICAgZWxzZSBpZiAoc2hvdWxkRGlzYWJsZURhdGUgJiYgc2hvdWxkRGlzYWJsZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnZGlzYWJsZWREYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5kaXNhYmxlZERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNFcnJvciA9IEJvb2xlYW4oY3VycmVudEVycm9yKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3IsXG4gICAgICBlcnJvcjogY3VycmVudEVycm9yLFxuICAgICAgaW52YWxpZDogaW52YWxpZCB8fCBoYXNFcnJvcixcbiAgICB9O1xuICB9LCBbZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgdmFsdWVdKTtcblxuICAvLyBNZW1vaXplIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZ1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB1c2VNZW1vKCgpOiBSZWFjdE5vZGUgPT4ge1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciBwYXJzZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyc2VFcnJvcikge1xuICAgICAgcmV0dXJuIHBhcnNlRXJyb3IodmFsaWRhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlIGhhbmRsaW5nXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCdtZXNzYWdlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgaWYgKCd0eXBlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5yZXF1aXJlZDtcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZTtcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZTtcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGU7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgfSwgW3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IsIHBhcnNlRXJyb3JdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgZXJyb3JNZXNzYWdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjsiLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGEgdmFsaWRhdGlvbiBlcnJvciAqL1xuICBoYXNFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZSAqL1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgaW5wdXQgaXMgcmVhZC1vbmx5ICovXG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gc3R5bGVzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMgKi9cbiAgc3g/OiBTeFByb3BzPFRoZW1lPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICAvKiogQ29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50ICovXG4gIHN4OiBTeFByb3BzPFRoZW1lPjtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIHN0eWxpbmcgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIHRoZW1lLWF3YXJlIGRhdGUgcGlja2VyIHN0eWxlcyB3aXRoIGNvbnNpc3RlbnQgZGVzaWduIHN5c3RlbSBpbnRlZ3JhdGlvblxuICogXG4gKiBUaGlzIGhvb2sgcHJvdmlkZXMgb3B0aW1pemVkLCBtZW1vaXplZCBzdHlsZXMgZm9yIGRhdGUgcGlja2VyIGNvbXBvbmVudHMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhZGFwdCB0byB0aGUgY3VycmVudCBNVUkgdGhlbWUgYW5kIGNvbXBvbmVudCBzdGF0ZSAoZGlzYWJsZWQsIGVycm9yLCBsb2FkaW5nLCBldGMuKS5cbiAqIEl0IGVuc3VyZXMgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBhbGwgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzIHdoaWxlIGFsbG93aW5nIGN1c3RvbWl6YXRpb24uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgbG9hZGluZzogaXNMb2FkaW5nXG4gKiB9KTtcbiAqIFxuICogcmV0dXJuIDxEYXRlUGlja2VyIHN4PXtzeH0gLi4uIC8+O1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgc3g6IHtcbiAqICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgY29sb3I6ICdwcmltYXJ5Lm1haW4nXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFN0eWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29tcHV0ZWQgc3R5bGVzIGFuZCBjbGFzcyBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclN0eWxlcyhcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMgPSB7fVxuKTogVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHksIHN4OiBjdXN0b21TeCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIE1lbW9pemUgY29tcHV0ZWQgc3R5bGVzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCBjb21wdXRlZFN4ID0gdXNlTWVtbygoKTogU3hQcm9wczxUaGVtZT4gPT4ge1xuICAgIGNvbnN0IGJhc2VTdHlsZXM6IFN4UHJvcHM8VGhlbWU+ID0ge1xuICAgICAgLy8gSW5wdXQgZmllbGQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kIFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmb3Igc21vb3RoIHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICAgICAgJ2JvcmRlci1jb2xvcicsXG4gICAgICAgICAgJ2NvbG9yJ1xuICAgICAgICBdLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBFcnJvciBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZm9jdXNlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAycHggJHt0aGVtZS5wYWxldHRlLmVycm9yLm1haW59MjVgLCAvLyAyNSBpcyAxNSUgb3BhY2l0eSBpbiBoZXhcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSW5wdXQgZWxlbWVudCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgIGN1cnNvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyBcIm5vdC1hbGxvd2VkXCIgXG4gICAgICAgICAgOiB0ZXh0UmVhZE9ubHkgXG4gICAgICAgICAgICA/IFwicG9pbnRlclwiIFxuICAgICAgICAgICAgOiBcInRleHRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFJlYWQtb25seSBzcGVjaWZpYyBzdHlsaW5nXG4gICAgICAgIC4uLih0ZXh0UmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnRcIiwgLy8gSGlkZSB0ZXh0IGN1cnNvciBpbiByZWFkLW9ubHkgbW9kZVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwid2FpdFwiLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZpZWxkIGFzdGVyaXNrIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICBmb250U2l6ZTogXCIxLjJlbVwiLFxuICAgICAgfSxcblxuICAgICAgLy8gTGFiZWwgc3R5bGluZyB3aXRoIGJldHRlciBjb250cmFzdFxuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogaGFzRXJyb3IgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgOiB0aGVtZS5wYWxldHRlLnRleHQuc2Vjb25kYXJ5LFxuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciBjb250cmFzdCBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICAgICAgLi4uKGRpc2FibGVkICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEhlbHBlciB0ZXh0IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpRm9ybUhlbHBlclRleHQtcm9vdFwiOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBcbiAgICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIENhbGVuZGFyIGljb24gc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEFkb3JubWVudC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQgXG4gICAgICAgICAgOiBoYXNFcnJvciBcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5hY3RpdmUsXG4gICAgICB9LFxuXG4gICAgICAvLyBGb2N1cyByaW5nIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZm9jdXNlZFwiOiB7XG4gICAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbn01MGAsIC8vIDUwIGlzIDMxJSBvcGFjaXR5XG4gICAgICAgIG91dGxpbmVPZmZzZXQ6IFwiMnB4XCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBFbmhhbmNlZCBjb250cmFzdCBmb3IgZGFyayB0aGVtZXNcbiAgICAgIC4uLih0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdkYXJrJyAmJiB7XG4gICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICAvLyBNZXJnZSB3aXRoIGN1c3RvbSBzdHlsZXNcbiAgICByZXR1cm4gY3VzdG9tU3ggPyBbYmFzZVN0eWxlcywgY3VzdG9tU3hdIGFzIFN4UHJvcHM8VGhlbWU+IDogYmFzZVN0eWxlcztcbiAgfSwgW1xuICAgIHRoZW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGN1c3RvbVN4LFxuICBdKTtcblxuICAvLyBHZW5lcmF0ZSBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBleHRlcm5hbCBzdHlsaW5nIGhvb2tzXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgaWYgKGRpc2FibGVkKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1kaXNhYmxlZCcpO1xuICAgIGlmIChoYXNFcnJvcikgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZXJyb3InKTtcbiAgICBpZiAobG9hZGluZykgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tbG9hZGluZycpO1xuICAgIGlmICh0ZXh0UmVhZE9ubHkpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLXJlYWRPbmx5Jyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMubGVuZ3RoID4gMCA/IGNsYXNzZXMuam9pbignICcpIDogdW5kZWZpbmVkO1xuICB9LCBbZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHldKTtcblxuICByZXR1cm4ge1xuICAgIHN4OiBjb21wdXRlZFN4LFxuICAgIGNsYXNzTmFtZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclN0eWxlczsiLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCAiaW1wb3J0IFZpc2liaWxpdHkgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5JztcbmltcG9ydCBWaXNpYmlsaXR5T2ZmIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eU9mZic7XG5pbXBvcnQgdHlwZSB7IEljb25CdXR0b25Qcm9wcywgVGV4dEZpZWxkUHJvcHMsIEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IE1vdXNlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgUGFzc3dvcmRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+ID0gT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnIHwgJ3NpemUnPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwicGFzc3dvcmRcIiB8IFwidXNlci5jdXJyZW50UGFzc3dvcmRcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb24gYnV0dG9uXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJkZWZhdWx0XCJcbiAgICovXG4gIGljb25Db2xvcj86IEljb25CdXR0b25Qcm9wc1snY29sb3InXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IHBhc3N3b3JkID0+IChwYXNzd29yZCA/IDxWaXNpYmlsaXR5IC8+IDogPFZpc2liaWxpdHlPZmYgLz4pLFxuICAgIHNsb3RQcm9wcyxcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17J2VuZCd9PlxuICAgICAgPEljb25CdXR0b25cbiAgICAgICAgb25Nb3VzZURvd249eyhlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYXNzd29yZCghcGFzc3dvcmQpfVxuICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgIGNvbG9yPXtpY29uQ29sb3IgPz8gJ2RlZmF1bHQnfVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J31cbiAgICAgIHZhbHVlPXtmaWVsZC52YWx1ZSA/PyAnJ31cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgdmFyaWFudD17cmVzdC52YXJpYW50ID8/ICdvdXRsaW5lZCd9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlc3Qub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09ICd1bmRlZmluZWQnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LmlucHV0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1snc2xvdFByb3BzJ10sXG4gICAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgcGFzc3dvcmQgVGV4dEZpZWxkIHdpdGggc2hvdy9oaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHBhc3N3b3JkIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBhIGJ1aWx0LWluIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvbi4gVGhlIHBhc3N3b3JkXG4gKiBjYW4gYmUgc2hvd24gb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBleWUgaWNvbiBpbiB0aGUgaW5wdXQncyBlbmQgYWRvcm5tZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBQYXNzd29yZCB2aXNpYmlsaXR5IHRvZ2dsZVxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgdmlzaWJpbGl0eSBpY29uc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGFzc3dvcmRcIlxuICogICBsYWJlbD1cIlBhc3N3b3JkXCJcbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAqICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IDgsIG1lc3NhZ2U6ICdNaW5pbXVtIDggY2hhcmFjdGVycycgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBpY29uIGNvbG9yOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICogICBsYWJlbD1cIkNvbmZpcm0gUGFzc3dvcmRcIlxuICogICBpY29uQ29sb3I9XCJwcmltYXJ5XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJSZS1lbnRlciB5b3VyIHBhc3N3b3JkXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdQYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiTmV3IFBhc3N3b3JkXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJlbmRlckljb249eyhoaWRkZW4pID0+IGhpZGRlbiA/IDxDdXN0b21IaWRlSWNvbiAvPiA6IDxDdXN0b21TaG93SWNvbiAvPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IFBhc3N3b3JkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcblxuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IFBhc3N3b3JkRWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgUmFkaW9Hcm91cFByb3BzLFxuICBSYWRpb1Byb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIFJhZGlvLFxuICBSYWRpb0dyb3VwLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+IHtcbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogJ251bWJlcicgfCAnc3RyaW5nJyB8ICdib29sZWFuJztcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJyB8ICd2YWx1ZSc+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcbiAgcmFkaW9Qcm9wcz86IFJhZGlvUHJvcHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG5hbWUsXG4gICAgbGFiZWxLZXkgPSAnbGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9ICdpZCcgYXMgVFZhbHVlS2V5LFxuICAgIGRpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyBhcyBURGlzYWJsZWRLZXksXG4gICAgcmVxdWlyZWQsXG4gICAgZW1wdHlPcHRpb25MYWJlbCxcbiAgICByZXR1cm5PYmplY3QsXG4gICAgcm93ID0gdHJ1ZSxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uXG4gID4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgKCcnIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1snb25DaGFuZ2UnXSA9IChldmVudCwgcmFkaW9WYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gcmV0dXJuT2JqZWN0XG4gICAgICA/IChvcHRpb25zIGFzIFRPcHRpb25bXSkuZmluZChvcHRpb24gPT4gb3B0aW9uW3ZhbHVlS2V5XSA9PT0gcmFkaW9WYWx1ZSlcbiAgICAgIDogKHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgIG9uQ2hhbmdlKGV2ZW50LCByZXR1cm5WYWx1ZSk7XG4gICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXN0Lm9uQ2hhbmdlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPFJhZGlvR3JvdXAgb25DaGFuZ2U9e29uUmFkaW9DaGFuZ2V9IG5hbWU9e25hbWV9IHJvdz17cm93fSB2YWx1ZT17dmFsdWV9PlxuICAgICAgICB7ZW1wdHlPcHRpb25MYWJlbCAmJiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxSYWRpb1xuICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9eyF2YWx1ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhYmVsPXtlbXB0eU9wdGlvbkxhYmVsfVxuICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHtvcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvblt2YWx1ZUtleV07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSBvcHRpb25bZGlzYWJsZWRLZXldIHx8IGZhbHNlO1xuICAgICAgICAgIGxldCB2YWw6IFRPcHRpb25bVFZhbHVlS2V5XSB8IHVuZGVmaW5lZCA9IHJldHVybk9iamVjdFxuICAgICAgICAgICAgPyAodmFsdWUgYXMgVE9wdGlvbik/Llt2YWx1ZUtleV1cbiAgICAgICAgICAgIDogKHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbCA9IE51bWJlcih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBvcHRpb25EaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25LZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgIHtlcnJvciAmJiA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD59XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IFJhZGlvQnV0dG9uR3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdsYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzICBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVERpc2FibGVkS2V5XG4+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxcbiAgICAgICAgVEZpZWxkVmFsdWVzLFxuICAgICAgICBUTmFtZSxcbiAgICAgICAgVE9wdGlvbixcbiAgICAgICAgVFZhbHVlS2V5LFxuICAgICAgICBUTGFiZWxLZXksXG4gICAgICAgIFREaXNhYmxlZEtleVxuICAgICAgPlxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblJhZGlvQnV0dG9uR3JvdXAuZGlzcGxheU5hbWUgPSAnUmFkaW9CdXR0b25Hcm91cCc7XG5cbmV4cG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBkZXBlbmRzT246IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0Q2FzY2FkZUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICBjb25zdCB7XG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScsXG4gICAgbmFtZSxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgaXNOdWxsYWJsZSA9IGZhbHNlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkLCAuLi5yZXN0VGV4dFByb3BzIH0gPSB0ZXh0RmllbGRQcm9wcztcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBvcHRpb247XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleSAhPT0gbnVsbCA/IFN0cmluZyhrZXkpIDogJyc7XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gKG9wdGlvbjogVE9wdGlvbiwgdmFsdWU6IFRPcHRpb24pID0+XG4gICAgZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGdldE9wdGlvbktleSh2YWx1ZSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgeyBmaWVsZDogZGVwZW5kZW50RmllbGQgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWU6IGRlcGVuZHNPbixcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBwYXJlbnRWYWx1ZVJlZiA9IHVzZVJlZihkZXBlbmRlbnRGaWVsZC52YWx1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocGFyZW50VmFsdWVSZWYuY3VycmVudCAhPT0gZGVwZW5kZW50RmllbGQudmFsdWUpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgcGFyZW50VmFsdWVSZWYuY3VycmVudCA9IGRlcGVuZGVudEZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfSwgW2RlcGVuZGVudEZpZWxkLnZhbHVlLCBmaWVsZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGlzYWJsZURlZmF1bHRTZWxlY3RlZCwgb3B0aW9ucy5sZW5ndGhdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID1cbiAgICAgIGZpZWxkLnZhbHVlICE9PSBudWxsICYmIGZpZWxkLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGQudmFsdWUgIT09ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFoYXNWYWx1ZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGRpc2FibGVkLFxuICAgIGdldE9wdGlvbktleSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09ICcnXG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWlzTnVsbGFibGUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW1xuICAgIGRpc2FibGVkLFxuICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlLFxuICAgIG9wdGlvbnMubGVuZ3RoLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIC5tYXAob3B0aW9uID0+IChnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZmllbGQudmFsdWUgPyBvcHRpb24gOiBudWxsKSlcbiAgICAgICAgICAuZmluZChCb29sZWFuKSB8fCBudWxsXG4gICAgICB9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uS2V5fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSA/IGdldE9wdGlvbktleShuZXdWYWx1ZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdENhc2NhZGVFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVWYWx1ZSxcbiAgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmcsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAnb3B0aW9ucydcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgbGFiZWxGaWVsZD86IHN0cmluZztcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oXG4gIHByb3BzOiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID5cbikge1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25DaGFuZ2UsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGxhYmVsLFxuICAgIHZhcmlhbnQsXG4gICAgZGlzYWJsZWQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcgYXMga2V5b2YgVE9wdGlvbixcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBrZXlvZiBUT3B0aW9uLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgaXNOdWxsYWJsZSA9IGZhbHNlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkLCAuLi5yZXN0VGV4dFByb3BzIH0gPSB0ZXh0RmllbGRQcm9wcztcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IG51bGw7XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGlzYWJsZURlZmF1bHRTZWxlY3RlZCwgb3B0aW9ucy5sZW5ndGhdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID1cbiAgICAgIGZpZWxkLnZhbHVlICE9PSBudWxsICYmIGZpZWxkLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGQudmFsdWUgIT09ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFoYXNWYWx1ZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25WYWx1ZShvcHRpb25zWzBdKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0T3B0aW9uVmFsdWUsXG4gICAgZmllbGQub25DaGFuZ2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCxcbiAgXSk7XG5cbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWlzTnVsbGFibGUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkLCBvcHRpb25zLmxlbmd0aCwgaXNOdWxsYWJsZSwgZGlzYWJsZURlZmF1bHRTZWxlY3RlZF0pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBmaWVsZC52YWx1ZSkgPz8gbnVsbCxcbiAgICBbZmllbGQudmFsdWUsIG9wdGlvbnMsIGdldE9wdGlvblZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnM9e2ZhbHNlfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgYXV0b2NvbXBsZXRlVmFsdWUgYXMgQXV0b2NvbXBsZXRlVmFsdWU8XG4gICAgICAgICAgVE9wdGlvbixcbiAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgICAgICAgIEZyZWVTb2xvXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gbmV3VmFsdWUgYXMgVE9wdGlvbiB8IG51bGw7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2Uob3B0aW9uID8gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA6IG51bGwpO1xuICAgICAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e29wdGlvbiA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBBdXRvY29tcGxldGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgZnJvbSBwcmVkZWZpbmVkIG9wdGlvbnMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHNlbGVjdC9hdXRvY29tcGxldGUgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSwgaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICogZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy4gSXQgc3VwcG9ydHMgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b2NvbXBsZXRlIHdpdGggZmlsdGVyaW5nXG4gKiAtIFNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIHN1cHBvcnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG9wdGlvbiBkaXNwbGF5IChsYWJlbEtleS92YWx1ZUtleSlcbiAqIC0gQXV0by1zZWxlY3Rpb24gd2hlbiBvbmx5IG9uZSBvcHRpb24gZXhpc3RzXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY2F0ZWdvcnlcIlxuICogICBsYWJlbD1cIkNhdGVnb3J5XCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgTGFiZWw6ICdUZWNobm9sb2d5JywgVmFsdWU6ICd0ZWNoJyB9XG4gKiAgIF19XG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5JyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBrZXlzOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcklkXCJcbiAqICAgbGFiZWw9XCJBc3NpZ24gdG8gVXNlclwiXG4gKiAgIG9wdGlvbnM9e3VzZXJzfVxuICogICBsYWJlbEtleT1cImZ1bGxOYW1lXCJcbiAqICAgdmFsdWVLZXk9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0RWxlbWVudCc7XG4iLCAiaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94JztcbmltcG9ydCBDaGVja0JveE91dGxpbmVCbGFua0ljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEdyaWQsXG4gIENoZWNrYm94LFxuICBUZXh0RmllbGQsXG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50LCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbnR5cGUgQmFzZUF1dG9jb21wbGV0ZVByb3BzPFxuICBUT3B0aW9uLFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICAnbmFtZScgfCAncmVuZGVySW5wdXQnIHwgJ211bHRpcGxlJyB8ICdvbkNoYW5nZScgfCAndmFsdWUnXG4+O1xuXG5leHBvcnQgdHlwZSBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdE11bHRpRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBpc051bGxhYmxlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgPSB0cnVlLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgfTtcbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWlzTnVsbGFibGUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkLCBvcHRpb25zLmxlbmd0aCwgaXNOdWxsYWJsZSwgZGlzYWJsZURlZmF1bHRTZWxlY3RlZF0pO1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBmaWVsZC52YWx1ZS5pbmNsdWRlcyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSlcbiAgICAgIDogW107XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSAmJiBmaWVsZC52YWx1ZS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgICFoYXNWYWx1ZSAmJlxuICAgICAgIWlzTnVsbGFibGUgJiZcbiAgICAgICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkXG4gICAgKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShbZ2V0T3B0aW9uVmFsdWUob3B0aW9uc1swXSldKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBpc051bGxhYmxlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBfOiBTeW50aGV0aWNFdmVudCxcbiAgICBzZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnY2xlYXInKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ3NlbGVjdE9wdGlvbicgfHwgcmVhc29uID09PSAncmVtb3ZlT3B0aW9uJykge1xuICAgICAgY29uc3QgbmV3VmFsdWVzID0gc2VsZWN0ZWRPcHRpb25zLm1hcChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSk7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcy5sZW5ndGggPT09IDAgPyBudWxsIDogbmV3VmFsdWVzKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaWNvbiA9IDxDaGVja0JveE91dGxpbmVCbGFua0ljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuICBjb25zdCBjaGVja2VkSWNvbiA9IDxDaGVja0JveEljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIHZhbHVlPXtzZWxlY3RlZFZhbHVlfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wczEsIG9wdGlvbiwgeyBzZWxlY3RlZCB9KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIHsuLi5wcm9wczF9PlxuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIGljb249e2ljb259XG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIElucHV0UHJvcHM9e3tcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZVxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICAvLyBVc2UgdGhlIGVuaGFuY2VkIHRyYW5zZm9ybSBob29rIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPihcbiAgICB7XG4gICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0OiB0cmFuc2Zvcm0uaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHRyYW5zZm9ybS5vdXRwdXQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybVxuICAgICAgICA/IHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtcbiAgICAgICAgZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0XG4gICAgICB9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0XG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBUaW1lUGlja2VyUHJvcHMsXG4gIFRpbWVQaWNrZXJTbG90UHJvcHMsXG4gIFRpbWVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHsgVGltZVBpY2tlciB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzJztcbmltcG9ydCB7IHJlbmRlclRpbWVWaWV3Q2xvY2sgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzL3RpbWVWaWV3UmVuZGVyZXJzJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIFBhdGhWYWx1ZSxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnQC9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJ0AvdHlwZXMnO1xuaW1wb3J0IHsgcmVhZFZhbHVlQXNEYXRlIH0gZnJvbSAnQC91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVBpY2tlckVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+IHtcbiAgbmFtZTogVE5hbWU7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvciB8IFRpbWVWYWxpZGF0aW9uRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgaW5wdXRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIGhlbHBlclRleHQ/OiBUZXh0RmllbGRQcm9wc1snaGVscGVyVGV4dCddO1xuICBsYWJlbD86IFJlYWN0Tm9kZTtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIHNsb3RQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclNsb3RQcm9wczxURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgICAndGV4dEZpZWxkJ1xuICA+O1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlIHwgbnVsbDtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICB0aW1lUGlja2VyUHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJQcm9wczxURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgICAndmFsdWUnIHwgJ3Nsb3RQcm9wcydcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KHByb3BzOiBUaW1lUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgcmVxdWlyZWQsXG4gICAgaW5wdXRQcm9wcyxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGlucHV0UmVmLCBvbkNsb3NlLCAuLi5yZXN0VGltZVBpY2tlclByb3BzIH0gPVxuICAgIHRpbWVQaWNrZXJQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlIHwgbnVsbD4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogbmV3VmFsdWUgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogZGF0YSA9PiB7XG4gICAgICAgIGlmICghZGF5anMuaXNEYXlqcyhkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRpbWVQaWNrZXJcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUaW1lUGlja2VyUHJvcHN9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBvcGVuPXtvcGVufVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmlld1JlbmRlcmVycz17e1xuICAgICAgICBob3VyczogcmVuZGVyVGltZVZpZXdDbG9jayxcbiAgICAgICAgbWludXRlczogcmVuZGVyVGltZVZpZXdDbG9jayxcbiAgICAgICAgc2Vjb25kczogcmVuZGVyVGltZVZpZXdDbG9jayxcbiAgICAgIH19XG4gICAgICBvbk9wZW49eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIG9uQ2xvc2U/LiguLi5hcmdzKTtcbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KG5ld1ZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgICAgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlPy4obmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgfX1cbiAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFsnY2xlYXInLCAnY2FuY2VsJywgJ2FjY2VwdCddLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICBzeDoge1xuICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIHNldE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkJsdXI6IChcbiAgICAgICAgICAgIGV2ZW50OiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgICAgICBpbnB1dFByb3BzPy5vbkJsdXI/LihldmVudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICBoZWxwZXJUZXh0OiBlcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IGlucHV0UHJvcHM/LmhlbHBlclRleHQgfHwgcmVzdC5oZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgaW5wdXRNb2RlOiAnbm9uZScsXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuVGltZVBpY2tlckVsZW1lbnQuZGlzcGxheU5hbWUgPSAnVGltZVBpY2tlckVsZW1lbnQnO1xuIiwgImltcG9ydCB7XHJcbiAgQm94LFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1IZWxwZXJUZXh0LFxyXG4gIEZvcm1MYWJlbCxcclxuICBHcmlkLFxyXG4gIFNsaWRlcixcclxuICB0eXBlIEdyaWRQcm9wcyxcclxuICB0eXBlIFNsaWRlclByb3BzLFxyXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkRXJyb3IsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuXHJcbi8qKlxyXG4gKiBQcm9wcyBmb3IgdGhlIFNsaWRlckVsZW1lbnQgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcclxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbGlkZXJFbGVtZW50UHJvcHM8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4ge1xyXG4gIC8qKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybSAqL1xyXG4gIG5hbWU6IFROYW1lO1xyXG4gIC8qKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtICovXHJcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcclxuICAvKiogVGhlIGlucHV0IGxhYmVsIHRleHQgKi9cclxuICBsYWJlbD86IFJlYWN0Tm9kZTtcclxuICAvKiogSGVscGVyIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgc2xpZGVyICovXHJcbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcclxuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXHJcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xyXG4gIC8qKiBNaW5pbXVtIHZhbHVlICovXHJcbiAgbWluPzogbnVtYmVyO1xyXG4gIC8qKiBNYXhpbXVtIHZhbHVlICovXHJcbiAgbWF4PzogbnVtYmVyO1xyXG4gIC8qKiBTdGVwIGluY3JlbWVudCAqL1xyXG4gIHN0ZXA/OiBudW1iZXI7XHJcbiAgLyoqIFNob3cgbWFya3Mgb24gdGhlIHNsaWRlciAqL1xyXG4gIG1hcmtzPzogYm9vbGVhbiB8IHsgdmFsdWU6IG51bWJlcjsgbGFiZWw/OiBzdHJpbmcgfVtdO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZCAqL1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgZGlzYWJsZWQgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciAqL1xyXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcclxuICAvKiogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIFNsaWRlciBjb21wb25lbnQgKi9cclxuICBzbGlkZXJQcm9wcz86IE9taXQ8U2xpZGVyUHJvcHMsICd2YWx1ZScgfCAnb25DaGFuZ2UnIHwgJ21pbicgfCAnbWF4JyB8ICdzdGVwJyB8ICdtYXJrcycgfCAnZGlzYWJsZWQnPjtcclxufVxyXG5cclxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2xpZGVyRWxlbWVudENvcmU8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4ocHJvcHM6IE9taXQ8U2xpZGVyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+LCAnZ3JpZFByb3BzJz4pIHtcclxuICBjb25zdCB7XHJcbiAgICBuYW1lLFxyXG4gICAgY29udHJvbCxcclxuICAgIGxhYmVsLFxyXG4gICAgaGVscGVyVGV4dCxcclxuICAgIHBhcnNlRXJyb3IsXHJcbiAgICBtaW4gPSAwLFxyXG4gICAgbWF4ID0gMTAwLFxyXG4gICAgc3RlcCA9IDEsXHJcbiAgICBtYXJrcyA9IGZhbHNlLFxyXG4gICAgcmVxdWlyZWQgPSBmYWxzZSxcclxuICAgIGRpc2FibGVkID0gZmFsc2UsXHJcbiAgICBzbGlkZXJQcm9wcyA9IHt9LFxyXG4gIH0gPSBwcm9wcztcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgZmllbGQsXHJcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXHJcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xyXG4gICAgbmFtZSxcclxuICAgIGNvbnRyb2wsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogbnVsbDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxGb3JtQ29udHJvbFxyXG4gICAgICBmdWxsV2lkdGhcclxuICAgICAgbWFyZ2luPVwibm9ybWFsXCJcclxuICAgICAgZXJyb3I9eyEhZXJyb3J9XHJcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cclxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgPlxyXG4gICAgICB7bGFiZWwgJiYgPEZvcm1MYWJlbCBzeD17eyBtYjogMiB9fT57bGFiZWx9PC9Gb3JtTGFiZWw+fVxyXG4gICAgICA8Qm94IHN4PXt7IHB4OiAyIH19PlxyXG4gICAgICAgIDxTbGlkZXJcclxuICAgICAgICAgIHsuLi5zbGlkZXJQcm9wc31cclxuICAgICAgICAgIHJlZj17ZmllbGQucmVmfVxyXG4gICAgICAgICAgbmFtZT17ZmllbGQubmFtZX1cclxuICAgICAgICAgIHZhbHVlPXt0eXBlb2YgZmllbGQudmFsdWUgPT09ICdudW1iZXInID8gZmllbGQudmFsdWUgOiBtaW59XHJcbiAgICAgICAgICBvbkNoYW5nZT17KF8sIG5ld1ZhbHVlKSA9PiBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSl9XHJcbiAgICAgICAgICBvbkJsdXI9e2ZpZWxkLm9uQmx1cn1cclxuICAgICAgICAgIG1pbj17bWlufVxyXG4gICAgICAgICAgbWF4PXttYXh9XHJcbiAgICAgICAgICBzdGVwPXtzdGVwfVxyXG4gICAgICAgICAgbWFya3M9e21hcmtzfVxyXG4gICAgICAgICAgdmFsdWVMYWJlbERpc3BsYXk9XCJhdXRvXCJcclxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAvPlxyXG4gICAgICA8L0JveD5cclxuICAgICAgeyhlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkgJiYgKFxyXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dD57ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9PC9Gb3JtSGVscGVyVGV4dD5cclxuICAgICAgKX1cclxuICAgIDwvRm9ybUNvbnRyb2w+XHJcbiAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFNsaWRlciBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEZlYXR1cmVzOlxyXG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXHJcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcclxuICogLSBDdXN0b21pemFibGUgbWluL21heC9zdGVwIHZhbHVlc1xyXG4gKiAtIE9wdGlvbmFsIG1hcmtzIGRpc3BsYXlcclxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXHJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c3hcclxuICogPFNsaWRlckVsZW1lbnRcclxuICogICBuYW1lPVwicmF0aW5nXCJcclxuICogICBjb250cm9sPXtjb250cm9sfVxyXG4gKiAgIGxhYmVsPVwiUmF0aW5nXCJcclxuICogICBtaW49ezB9XHJcbiAqICAgbWF4PXsxMH1cclxuICogICBzdGVwPXsxfVxyXG4gKiAgIG1hcmtzXHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNsaWRlckVsZW1lbnQgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4oe1xyXG4gIGdyaWRQcm9wcyA9IHt9LFxyXG4gIC4uLnByb3BzXHJcbn06IFNsaWRlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0RWxlbWVudCA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cclxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XHJcbiAgICA8L0dyaWQ+XHJcbiAgKTtcclxufTtcclxuXHJcblNsaWRlckVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2xpZGVyRWxlbWVudCc7XHJcbiIsICJpbXBvcnQge1xyXG4gIEJveCxcclxuICBCdXR0b24sXHJcbiAgQ2hpcCxcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtSGVscGVyVGV4dCxcclxuICBGb3JtTGFiZWwsXHJcbiAgR3JpZCxcclxuICBTdGFjayxcclxuICB0eXBlIEdyaWRQcm9wcyxcclxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IENsb3VkVXBsb2FkSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0Nsb3VkVXBsb2FkJztcclxuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRFcnJvciwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIsIHVzZUZvcm1Db250ZXh0IH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuXHJcbi8qKlxyXG4gKiBQcm9wcyBmb3IgdGhlIEZpbGVVcGxvYWRFbGVtZW50IGNvbXBvbmVudC5cclxuICpcclxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXHJcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVVwbG9hZEVsZW1lbnRQcm9wczxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPiB7XHJcbiAgLyoqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtICovXHJcbiAgbmFtZTogVE5hbWU7XHJcbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cclxuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xyXG4gIC8qKiBUaGUgaW5wdXQgbGFiZWwgdGV4dCAqL1xyXG4gIGxhYmVsPzogUmVhY3ROb2RlO1xyXG4gIC8qKiBIZWxwZXIgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSB1cGxvYWQgKi9cclxuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xyXG4gIC8qKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXIgKi9cclxuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XHJcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGFsbG93ZWQgKi9cclxuICBtYXhGaWxlcz86IG51bWJlcjtcclxuICAvKiogTWF4aW11bSBmaWxlIHNpemUgaW4gTUIgKi9cclxuICBtYXhTaXplTUI/OiBudW1iZXI7XHJcbiAgLyoqIEFsbG93ZWQgZmlsZSBleHRlbnNpb25zIChlLmcuLCBbJy5qcGcnLCAnLnBuZycsICcucGRmJ10pICovXHJcbiAgYWxsb3dlZEV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdWlyZWQgKi9cclxuICByZXF1aXJlZD86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkICovXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgKi9cclxuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XHJcbiAgLyoqIEJ1dHRvbiB0ZXh0ICovXHJcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gRmlsZVVwbG9hZEVsZW1lbnRDb3JlPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHByb3BzOiBPbWl0PEZpbGVVcGxvYWRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4sICdncmlkUHJvcHMnPikge1xyXG4gIGNvbnN0IHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gICAgbGFiZWwsXHJcbiAgICBoZWxwZXJUZXh0LFxyXG4gICAgcGFyc2VFcnJvcixcclxuICAgIG1heEZpbGVzID0gNSxcclxuICAgIG1heFNpemVNQiA9IDEwLFxyXG4gICAgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5qcGcnLCAnLmpwZWcnLCAnLnBuZycsICcucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnhscycsICcueGxzeCddLFxyXG4gICAgcmVxdWlyZWQgPSBmYWxzZSxcclxuICAgIGRpc2FibGVkID0gZmFsc2UsXHJcbiAgICBidXR0b25UZXh0ID0gJ0Nob29zZSBGaWxlcycsXHJcbiAgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB7IHNldEVycm9yLCBjbGVhckVycm9ycyB9ID0gdXNlRm9ybUNvbnRleHQoKTtcclxuICBjb25zdCBmaWxlSW5wdXRSZWYgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbCk7XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIGZpZWxkLFxyXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxyXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBmaWxlczogRmlsZVtdID0gQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgPyBmaWVsZC52YWx1ZSA6IFtdO1xyXG5cclxuICBjb25zdCB2YWxpZGF0ZUZpbGVzID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoZmlsZUxpc3Q6IEZpbGVMaXN0IHwgbnVsbCk6IEZpbGVbXSB8IHN0cmluZyA9PiB7XHJcbiAgICAgIGlmICghZmlsZUxpc3QgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gbWF4RmlsZXMpIHtcclxuICAgICAgICByZXR1cm4gYE1heGltdW0gJHttYXhGaWxlc30gZmlsZXMgYWxsb3dlZGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1heFNpemVCeXRlcyA9IG1heFNpemVNQiAqIDEwMjQgKiAxMDI0O1xyXG4gICAgICBjb25zdCB2YWxpZEZpbGVzOiBGaWxlW10gPSBbXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaWxlID0gZmlsZUxpc3RbaV07XHJcblxyXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhTaXplQnl0ZXMpIHtcclxuICAgICAgICAgIHJldHVybiBgRmlsZSBcIiR7ZmlsZS5uYW1lfVwiIGV4Y2VlZHMgJHttYXhTaXplTUJ9TUIgc2l6ZSBsaW1pdGA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dGVuc2lvbikpIHtcclxuICAgICAgICAgIHJldHVybiBgRmlsZSBcIiR7ZmlsZS5uYW1lfVwiIGhhcyBpbnZhbGlkIGV4dGVuc2lvbi4gQWxsb3dlZDogJHthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsICcpfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB2YWxpZEZpbGVzO1xyXG4gICAgfSxcclxuICAgIFttYXhGaWxlcywgbWF4U2l6ZU1CLCBhbGxvd2VkRXh0ZW5zaW9uc11cclxuICApO1xyXG5cclxuICBjb25zdCBoYW5kbGVGaWxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHNldEVycm9yKG5hbWUsIHsgdHlwZTogJ3ZhbGlkYXRpb24nLCBtZXNzYWdlOiByZXN1bHQgfSk7XHJcbiAgICAgICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNsZWFyRXJyb3JzKG5hbWUpO1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHQpO1xyXG4gICAgfSxcclxuICAgIFt2YWxpZGF0ZUZpbGVzLCBzZXRFcnJvciwgY2xlYXJFcnJvcnMsIG5hbWUsIGZpZWxkXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUZpbGUgPSB1c2VDYWxsYmFjayhcclxuICAgIChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0ZpbGVzID0gZmlsZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XHJcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld0ZpbGVzKTtcclxuXHJcbiAgICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBbZmlsZXMsIGZpZWxkXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogbnVsbDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxGb3JtQ29udHJvbFxyXG4gICAgICBmdWxsV2lkdGhcclxuICAgICAgbWFyZ2luPVwibm9ybWFsXCJcclxuICAgICAgZXJyb3I9eyEhZXJyb3J9XHJcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cclxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgPlxyXG4gICAgICB7bGFiZWwgJiYgPEZvcm1MYWJlbCBzeD17eyBtYjogMSB9fT57bGFiZWx9PC9Gb3JtTGFiZWw+fVxyXG4gICAgICA8Qm94PlxyXG4gICAgICAgIDxCdXR0b25cclxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICBjb21wb25lbnQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICBzdGFydEljb249ezxDbG91ZFVwbG9hZEljb24gLz59XHJcbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgZmlsZXMubGVuZ3RoID49IG1heEZpbGVzfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIHtidXR0b25UZXh0fVxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxyXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgICAgICAgIG11bHRpcGxlXHJcbiAgICAgICAgICAgIGFjY2VwdD17YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCcpfVxyXG4gICAgICAgICAgICBoaWRkZW5cclxuICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUZpbGVDaGFuZ2V9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgIHtmaWxlcy5sZW5ndGggPiAwICYmIChcclxuICAgICAgICAgIDxTdGFjayBkaXJlY3Rpb249XCJyb3dcIiBzcGFjaW5nPXsxfSBmbGV4V3JhcD1cIndyYXBcIiBzeD17eyBtdDogMiB9fT5cclxuICAgICAgICAgICAge2ZpbGVzLm1hcCgoZmlsZTogRmlsZSwgaW5kZXg6IG51bWJlcikgPT4gKFxyXG4gICAgICAgICAgICAgIDxDaGlwXHJcbiAgICAgICAgICAgICAgICBrZXk9e2Ake2ZpbGUubmFtZX0tJHtpbmRleH1gfVxyXG4gICAgICAgICAgICAgICAgbGFiZWw9e2Ake2ZpbGUubmFtZX0gKCR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCKWB9XHJcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZT17ZGlzYWJsZWQgPyB1bmRlZmluZWQgOiAoKSA9PiBoYW5kbGVSZW1vdmVGaWxlKGluZGV4KX1cclxuICAgICAgICAgICAgICAgIHN4PXt7IG1iOiAxIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICA8L1N0YWNrPlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvQm94PlxyXG4gICAgICB7KGVycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0KSAmJiAoXHJcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0PntlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dH08L0Zvcm1IZWxwZXJUZXh0PlxyXG4gICAgICApfVxyXG4gICAgPC9Gb3JtQ29udHJvbD5cclxuICApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgRmlsZSBVcGxvYWQgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBGZWF0dXJlczpcclxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxyXG4gKiAtIE11bHRpcGxlIGZpbGUgc3VwcG9ydFxyXG4gKiAtIEZpbGUgc2l6ZSB2YWxpZGF0aW9uXHJcbiAqIC0gRmlsZSB0eXBlIHZhbGlkYXRpb25cclxuICogLSBWaXN1YWwgZmlsZSBsaXN0IHdpdGggcmVtb3ZlIGNhcGFiaWxpdHlcclxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXHJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c3hcclxuICogPEZpbGVVcGxvYWRFbGVtZW50XHJcbiAqICAgbmFtZT1cImRvY3VtZW50c1wiXHJcbiAqICAgY29udHJvbD17Y29udHJvbH1cclxuICogICBsYWJlbD1cIlVwbG9hZCBEb2N1bWVudHNcIlxyXG4gKiAgIG1heEZpbGVzPXszfVxyXG4gKiAgIG1heFNpemVNQj17NX1cclxuICogICBhbGxvd2VkRXh0ZW5zaW9ucz17WycucGRmJywgJy5kb2MnLCAnLmRvY3gnXX1cclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRmlsZVVwbG9hZEVsZW1lbnQgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4oe1xyXG4gIGdyaWRQcm9wcyA9IHt9LFxyXG4gIC4uLnByb3BzXHJcbn06IEZpbGVVcGxvYWRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xyXG4gIHJldHVybiAoXHJcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XHJcbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxyXG4gICAgPC9HcmlkPlxyXG4gICk7XHJcbn07XHJcblxyXG5GaWxlVXBsb2FkRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdGaWxlVXBsb2FkRWxlbWVudCc7XHJcbiIsICJpbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHR5cGUgeyBUZXh0RmllbGRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IEdyaWQgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZEVycm9yLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IE11aVRlbElucHV0IH0gZnJvbSAnbXVpLXRlbC1pbnB1dCc7XHJcbmltcG9ydCB0eXBlIHsgTXVpVGVsSW5wdXRDb3VudHJ5LCBNdWlUZWxJbnB1dFByb3BzIH0gZnJvbSAnbXVpLXRlbC1pbnB1dCc7XHJcblxyXG4vLyBDYXN0IHJlcXVpcmVkOiBNdWlUZWxJbnB1dFByb3BzIGlzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiB0aGF0IGNvbmZsaWN0cyB3aXRoIEpTWCBpbmZlcmVuY2VcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuY29uc3QgVGVsSW5wdXQgPSBNdWlUZWxJbnB1dCBhcyBSZWFjdC5Db21wb25lbnRUeXBlPGFueT47XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyRWxlbWVudFByb3BzPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+IHtcclxuICBuYW1lOiBUTmFtZTtcclxuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xyXG4gIGxhYmVsPzogc3RyaW5nO1xyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gIC8qKiBEZWZhdWx0IGNvdW50cnkgSVNPIDMxNjYtMSBhbHBoYS0yIGNvZGUgKGUuZy4gJ1VTJywgJ0lOJykuIEBkZWZhdWx0VmFsdWUgJ1VTJyAqL1xyXG4gIGRlZmF1bHRDb3VudHJ5Pzogc3RyaW5nO1xyXG4gIHByZWZlcnJlZENvdW50cmllcz86IHN0cmluZ1tdO1xyXG4gIG9ubHlDb3VudHJpZXM/OiBzdHJpbmdbXTtcclxuICBleGNsdWRlQ291bnRyaWVzPzogc3RyaW5nW107XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XHJcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xyXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnIHwgJ3R5cGUnPjtcclxufVxyXG5cclxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGhvbmVOdW1iZXJFbDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihwcm9wczogUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcclxuICBjb25zdCB7XHJcbiAgICBuYW1lLFxyXG4gICAgY29udHJvbCxcclxuICAgIGxhYmVsLFxyXG4gICAgcGxhY2Vob2xkZXIsXHJcbiAgICBkZWZhdWx0Q291bnRyeSA9ICdVUycsXHJcbiAgICBwcmVmZXJyZWRDb3VudHJpZXMsXHJcbiAgICBvbmx5Q291bnRyaWVzLFxyXG4gICAgZXhjbHVkZUNvdW50cmllcyxcclxuICAgIGRpc2FibGVkID0gZmFsc2UsXHJcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxyXG4gICAgcGFyc2VFcnJvcixcclxuICAgIHRleHRGaWVsZFByb3BzLFxyXG4gIH0gPSBwcm9wcztcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgZmllbGQsXHJcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXHJcbiAgfSA9IHVzZUNvbnRyb2xsZXIoeyBuYW1lLCBjb250cm9sIH0pO1xyXG5cclxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvclxyXG4gICAgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSlcclxuICAgIDogdGV4dEZpZWxkUHJvcHM/LmhlbHBlclRleHQ7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8VGVsSW5wdXRcclxuICAgICAgdmFsdWU9eyhmaWVsZC52YWx1ZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/ICcnfVxyXG4gICAgICBvbkNoYW5nZT17KHZhbDogc3RyaW5nKSA9PiBmaWVsZC5vbkNoYW5nZSh2YWwpfVxyXG4gICAgICBvbkJsdXI9eygpID0+IGZpZWxkLm9uQmx1cigpfVxyXG4gICAgICBpbnB1dFJlZj17ZmllbGQucmVmIGFzIFJlYWN0LlJlZjxIVE1MSW5wdXRFbGVtZW50Pn1cclxuICAgICAgbGFiZWw9e2xhYmVsfVxyXG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XHJcbiAgICAgIGRlZmF1bHRDb3VudHJ5PXtkZWZhdWx0Q291bnRyeSBhcyBNdWlUZWxJbnB1dENvdW50cnl9XHJcbiAgICAgIHByZWZlcnJlZENvdW50cmllcz17cHJlZmVycmVkQ291bnRyaWVzIGFzIE11aVRlbElucHV0Q291bnRyeVtdIHwgdW5kZWZpbmVkfVxyXG4gICAgICBvbmx5Q291bnRyaWVzPXtvbmx5Q291bnRyaWVzIGFzIE11aVRlbElucHV0Q291bnRyeVtdIHwgdW5kZWZpbmVkfVxyXG4gICAgICBleGNsdWRlZENvdW50cmllcz17ZXhjbHVkZUNvdW50cmllcyBhcyBNdWlUZWxJbnB1dENvdW50cnlbXSB8IHVuZGVmaW5lZH1cclxuICAgICAgZm9yY2VDYWxsaW5nQ29kZVxyXG4gICAgICBmb2N1c09uU2VsZWN0RmxhZ1xyXG4gICAgICBmdWxsV2lkdGhcclxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxyXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICAgIGVycm9yPXshIWVycm9yfVxyXG4gICAgICBoZWxwZXJUZXh0PXtlcnJvck1lc3NhZ2V9XHJcbiAgICAgIHNpemU9e3RleHRGaWVsZFByb3BzPy5zaXplfVxyXG4gICAgLz5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFBob25lTnVtYmVyRWxlbWVudCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPih7XHJcbiAgZ3JpZFByb3BzID0ge30sXHJcbiAgLi4ucHJvcHNcclxufTogUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxyXG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cclxuICAgIDwvR3JpZD5cclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnQG11aS9tYXRlcmlhbC91dGlscyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPihcbiAgcHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgLy8gaW5pdGlhbFZhbHVlLFxuICAgIC8vIGlzTnVsbGFibGUsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxUT3B0aW9uIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBUcmFjayB3aGF0IHZhbHVlIHdlJ3ZlIGxvYWRlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBBUEkgY2FsbHNcbiAgY29uc3QgbG9hZGVkVmFsdWVSZWYgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IGNhbGxiYWNrKGMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIC8vIEVmZmVjdDogSGFuZGxlIHNlYXJjaCBxdWVyeSBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZpZWxkLnZhbHVlO1xuXG4gICAgLy8gQ29uZGl0aW9uIDE6IEEgdmFsdWUgaXMgc2V0IGZyb20gdGhlIGZvcm0sIGFuZCB3ZSBoYXZlbid0IGxvYWRlZCBpdCB5ZXQuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIERvbid0IGZldGNoIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgYWxyZWFkeSBjb3JyZWN0XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRPcHRpb24pID09PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gY3VycmVudFZhbHVlO1xuXG4gICAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogY3VycmVudFZhbHVlIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbiA9IHJlc3VsdHM/LmZpbmQoXG4gICAgICAgICAgb3B0aW9uID0+IFN0cmluZyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSA9PT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgICAgIHNldE9wdGlvbnMoW21hdGNoZWRPcHRpb25dKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihtYXRjaGVkT3B0aW9uKTtcbiAgICAgICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKG1hdGNoZWRPcHRpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjsgLy8gRW5kIG9mIGVmZmVjdFxuICAgIH1cblxuICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgdXNlciBpcyB0eXBpbmcgYSBzZWFyY2ggcXVlcnksIG9yIHRoZSBpbnB1dCBpcyBjbGVhcmVkLlxuICAgIC8vIFRoaXMgcnVucyBpZiB0aGUgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbC5cbiAgICBpZiAoaW5wdXRWYWx1ZSAhPT0gKHNlbGVjdGVkT3B0aW9uID8gZ2V0T3B0aW9uTGFiZWwoc2VsZWN0ZWRPcHRpb24pIDogJycpKSB7XG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgZW1wdHksIGNsZWFyIG9wdGlvbnMgaW1tZWRpYXRlbHkgd2l0aG91dCBhbiBBUEkgY2FsbC5cbiAgICAgIGlmIChpbnB1dFZhbHVlID09PSAnJykge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGZldGNoIG5ldyBvcHRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgc2V0T3B0aW9ucyhyZXN1bHRzIHx8IFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47IC8vIEVuZCBvZiBlZmZlY3RcbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb24gMzogVGhlIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgZm9ybS5cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZSAmJiBzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBpbnB1dFZhbHVlLFxuICAgIGZldGNoRGF0YSxcbiAgICBnZXRPcHRpb25MYWJlbCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBzZWxlY3RlZE9wdGlvbixcbiAgICBsYWJlbEZpZWxkLFxuICAgIHZhbHVlRmllbGQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChfOiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsKSA9PiB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld1NlbGVjdGVkT3B0aW9uXG4gICAgICAgID8gZ2V0T3B0aW9uVmFsdWUobmV3U2VsZWN0ZWRPcHRpb24pXG4gICAgICAgIDogbnVsbDtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IG5ld1ZhbHVlIGFzXG4gICAgICAgIHwgVE9wdGlvbltUVmFsdWVLZXldXG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDsgLy8gVHJhY2sgY2hhbmdlXG5cbiAgICAgIC8vIFN5bmMgaW5wdXQgdmFsdWUgd2l0aCB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmV3U2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChuZXdTZWxlY3RlZE9wdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICAgIHNldE9wdGlvbnMoW10pOyAvLyBDbGVhciBvcHRpb25zIHdoZW4gc2VsZWN0aW9uIGlzIGNsZWFyZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgZ2V0T3B0aW9uVmFsdWUsIGdldE9wdGlvbkxhYmVsXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gV2hlbiBmb2N1cyBpcyBsb3N0LCBzeW5jIHRoZSBpbnB1dCB2YWx1ZSBiYWNrIHRvIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbFxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub3RoaW5nIGlzIHNlbGVjdGVkLCBjbGVhciB0aGUgaW5wdXRcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGVkT3B0aW9uLCBnZXRPcHRpb25MYWJlbF0pO1xuXG4gIGNvbnN0IGhhbmRsZU9wZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0T3Blbih0cnVlKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgb3Blbj17b3Blbn1cbiAgICAgIG9uT3Blbj17aGFuZGxlT3Blbn1cbiAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgb25CbHVyPXtoYW5kbGVCbHVyfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIGluY2x1ZGVJbnB1dEluTGlzdFxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHJlbmRlclByb3BzLCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSByZW5kZXJQcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIHtvcHRpb25bbGFiZWxGaWVsZF19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0RWxlbWVudCc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnQC9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICdAL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlckZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVtYmVyRmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBtYXhMZW5ndGgsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUgPSAnbnVtYmVyJyxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IG1heExlbmd0aCAmJiBtYXhMZW5ndGggPiA1XG4gICAgICAgICAgICA/ICd0ZXh0J1xuICAgICAgICAgICAgOiAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIG1heExlbmd0aCAmJlxuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uV2hlZWw9e2UgPT4ge1xuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH19XG4gICAgICBvbktleURvd249e2UgPT4ge1xuICAgICAgICBpZiAoWydlJywgJ0UnLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHRcbiAgICAgIH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHNsb3RQcm9wcz17eyBodG1sSW5wdXQ6IHsgbWF4TGVuZ3RoIH0gfX1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1iZXJGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEJveFByb3BzLCBGb3JtSGVscGVyVGV4dFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJveCwgR3JpZCwgaW5wdXRCYXNlQ2xhc3NlcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgTXVpT3RwSW5wdXQsXG4gIHR5cGUgTXVpT3RwSW5wdXRQcm9wcyxcbn0gZnJvbSAnbXVpLW9uZS10aW1lLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgSGVscGVyVGV4dCB9IGZyb20gJy4vSGVscGVyVGV4dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1RQSW5wdXRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG5cbiAgc2xvdFByb3BzPzoge1xuICAgIHdyYXBwZXI/OiBCb3hQcm9wcztcbiAgICBoZWxwZXJUZXh0PzogRm9ybUhlbHBlclRleHRQcm9wcztcbiAgICB0ZXh0ZmllbGQ/OiBNdWlPdHBJbnB1dFByb3BzWydUZXh0RmllbGRzUHJvcHMnXTtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBPVFBJbnB1dEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICAvLyBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBzbG90UHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBtYXhTaXplID0gNTYsXG4gICAgcGxhY2Vob2xkZXIgPSAnLScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gY29uc3Qge1xuICAvLyAgIGZpZWxkLFxuICAvLyAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgLy8gfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAvLyAgIG5hbWUsXG4gIC8vICAgY29udHJvbCxcbiAgLy8gfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udHJvbGxlclxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICByZW5kZXI9eyh7IGZpZWxkLCBmaWVsZFN0YXRlOiB7IGVycm9yIH0gfSkgPT4gKFxuICAgICAgICA8Qm94XG4gICAgICAgICAgey4uLnNsb3RQcm9wcz8ud3JhcHBlcn1cbiAgICAgICAgICBzeD17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgW2AmIC4ke2lucHV0QmFzZUNsYXNzZXMuaW5wdXR9YF06IHtcbiAgICAgICAgICAgICAgICBwOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvOiAnMS8xJyxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4U2l6ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzbG90UHJvcHM/LndyYXBwZXI/LnN4KVxuICAgICAgICAgICAgICA/IChzbG90UHJvcHM/LndyYXBwZXI/LnN4ID8/IFtdKVxuICAgICAgICAgICAgICA6IFtzbG90UHJvcHM/LndyYXBwZXI/LnN4XSksXG4gICAgICAgICAgXX1cbiAgICAgICAgPlxuICAgICAgICAgIDxNdWlPdHBJbnB1dFxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICBnYXA9ezEuNX1cbiAgICAgICAgICAgIGxlbmd0aD17NH1cbiAgICAgICAgICAgIFRleHRGaWVsZHNQcm9wcz17e1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8udGV4dGZpZWxkLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8SGVscGVyVGV4dFxuICAgICAgICAgICAgey4uLnNsb3RQcm9wcz8uaGVscGVyVGV4dH1cbiAgICAgICAgICAgIGVycm9yTWVzc2FnZT17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgICAgICBoZWxwZXJUZXh0PXtoZWxwZXJUZXh0fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IE9UUElucHV0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogT1RQSW5wdXRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBGb3JtSGVscGVyVGV4dFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5pbXBvcnQgRm9ybUhlbHBlclRleHQgZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgSGVscGVyVGV4dFByb3BzID0gRm9ybUhlbHBlclRleHRQcm9wcyAmIHtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBkaXNhYmxlR3V0dGVycz86IGJvb2xlYW47XG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSGVscGVyVGV4dCh7XG4gIHN4LFxuICBoZWxwZXJUZXh0LFxuICBlcnJvck1lc3NhZ2UsXG4gIGRpc2FibGVHdXR0ZXJzLFxuICAuLi5vdGhlclxufTogSGVscGVyVGV4dFByb3BzKSB7XG4gIGlmIChlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybUhlbHBlclRleHRcbiAgICAgICAgZXJyb3I9eyEhZXJyb3JNZXNzYWdlfVxuICAgICAgICBzeD17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG14OiBkaXNhYmxlR3V0dGVycyA/IDAgOiAxLjc1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgXX1cbiAgICAgICAgey4uLm90aGVyfVxuICAgICAgPlxuICAgICAgICB7ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9XG4gICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gJy4uL0FzeW5jTXVsdGlTZWxlY3QvQXN5bmNNdWx0aVNlbGVjdCc7XG5pbXBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY1NlbGVjdCc7XG5pbXBvcnQgeyBDaGVja2JveEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEVsZW1lbnQnO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEdyb3VwJztcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vRGF0ZVBpY2tlckVsZW1lbnQnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVsZW1lbnQgfSBmcm9tICcuLi9GaWxlVXBsb2FkRWxlbWVudCc7XG5pbXBvcnQgeyBOdW1iZXJGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9OdW1iZXJGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tICcuLi9QYXNzd29yZEVsZW1lbnQnO1xuaW1wb3J0IHsgUGhvbmVOdW1iZXJFbGVtZW50IH0gZnJvbSAnLi4vUGhvbmVOdW1iZXJFbGVtZW50JztcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tICcuLi9SYWRpb0J1dHRvbkdyb3VwJztcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdEVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0TXVsdGlFbGVtZW50JztcbmltcG9ydCB7IFNsaWRlckVsZW1lbnQgfSBmcm9tICcuLi9TbGlkZXJFbGVtZW50JztcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9UZXh0RmllbGRFbGVtZW50JztcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vVGltZVBpY2tlckVsZW1lbnQnO1xuXG5jb25zdCBGaWVsZCA9IHtcbiAgVGV4dDogVGV4dEZpZWxkRWxlbWVudCxcbiAgTnVtYmVyOiBOdW1iZXJGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBQaG9uZTogUGhvbmVOdW1iZXJFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3Q6IEFzeW5jU2VsZWN0RWxlbWVudCxcbiAgQXN5bmNNdWx0aVNlbGVjdDogQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIENoZWNrYm94R3JvdXA6IENoZWNrYm94R3JvdXBFbGVtZW50LFxuICBPVFBJbnB1dDogT1RQSW5wdXRFbGVtZW50LFxuICBTbGlkZXI6IFNsaWRlckVsZW1lbnQsXG4gIEZpbGVVcGxvYWQ6IEZpbGVVcGxvYWRFbGVtZW50LFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQTRGTyxTQUFTLGNBQWMsT0FBcUM7QUFDakUsU0FDRSxPQUFPLFVBQVUsWUFDakIsVUFBVSxRQUNWLFdBQVcsU0FDWCxXQUFXLFNBQ1gsT0FBUSxNQUFx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LFFBQVFDO0FBQUEsRUFDUixhQUFhQztBQUFBLEVBQ2IsZUFBZUM7QUFBQSxFQUNmLGFBQWFDO0FBQUEsRUFDYixrQkFBa0JDO0FBQUEsRUFDbEIsZUFBZTtBQUFBLEVBQ2YsVUFBVUM7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFsicHJvcHMiLCAiQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgIkNoZWNrYm94RWxlbWVudCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIkZvcm1Db250cm9sIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUdyb3VwIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkdyaWQiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiR3JpZCIsICJmb3J3YXJkUmVmIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZU1lbW8iLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJqc3giLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgImpzeCIsICJmb3J3YXJkUmVmIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAiR3JpZCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAicGFzc3dvcmQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJGb3JtTGFiZWwiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgIkZvcm1Db250cm9sIiwgIkZvcm1MYWJlbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlVGhlbWUiLCAidXNlUmVmIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAidXNlVGhlbWUiLCAiRnJhZ21lbnQiLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAidXNlRm9ya1JlZiIsICJ1c2VMb2NhbGl6YXRpb25Db250ZXh0IiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJ1c2VMb2NhbGl6YXRpb25Db250ZXh0IiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUaW1lUGlja2VyRWxlbWVudCIsICJHcmlkIiwgIkZvcm1Db250cm9sIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkJveCIsICJGb3JtQ29udHJvbCIsICJGb3JtSGVscGVyVGV4dCIsICJGb3JtTGFiZWwiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlVGhlbWUiLCAiZGVib3VuY2UiLCAiRnJhZ21lbnQiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlUmVmIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkJveCIsICJHcmlkIiwgIkZvcm1IZWxwZXJUZXh0IiwgImpzeCIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQm94IiwgIk9UUElucHV0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJPVFBJbnB1dEVsZW1lbnQiXQp9Cg==