@updevs/components 1.0.0-alpha.42 → 1.0.0-alpha.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  # UpDevs Components Library for Angular
2
2
 
3
- After updating tabler
4
- Replace all "tblr" to "upd"
3
+ # Tabler Upgrade
4
+
5
+ After every Tabler update, perform the following operations:
6
+
7
+ - Replace all "tblr" to "upd"
8
+
9
+ # Library References
5
10
 
6
11
  LOCAL: "@updevs/icons": "file:../icons", "@updevs/sdk": "file:../sdk",
7
12
 
@@ -11,3 +11,15 @@
11
11
  .upd-right-login-cover-image {
12
12
  background-image: var(--upd-right-login-cover-image-bg);
13
13
  }
14
+
15
+ // TODO: Workaround. Wait for resolution of bug: https://github.com/tabler/tabler/issues/2271
16
+ @media (min-width: 992px) {
17
+ :host,
18
+ :root {
19
+ margin-left: 0;
20
+ }
21
+ }
22
+
23
+ body {
24
+ overflow-y: scroll;
25
+ }
@@ -56,6 +56,9 @@ export class DynamicFieldComponent extends BaseComponent {
56
56
  get fileUploadField() {
57
57
  return this.field();
58
58
  }
59
+ get maskedField() {
60
+ return this.field();
61
+ }
59
62
  get checkboxGroupOptionsKeys() {
60
63
  return Object.keys(this.checkboxGroupField.options);
61
64
  }
@@ -113,15 +116,15 @@ export class DynamicFieldComponent extends BaseComponent {
113
116
  this.wrapperClasses = ColumnSizeHelper.getSizeClasses(this.field().colSize);
114
117
  }
115
118
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DynamicFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
116
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: DynamicFieldComponent, selector: "upd-dynamic-field", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { submitForm: "submitForm" }, host: { properties: { "class": "this.wrapperClasses" } }, usesInheritance: true, ngImport: i0, template: "@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n}\n", styles: [""], dependencies: [{ kind: "component", type: i1.InputComponent, selector: "upd-input", inputs: ["type", "mask", "maskConfig", "value", "size", "customClasses", "wrapperClasses", "maxLength", "isPlainText", "isReadOnly", "isLoading", "isRound", "isFlush", "isInputGroupFlat", "isPrependButton", "isAppendButton", "isFloating", "loaderPosition", "prependIconModel", "appendIconModel", "isValidationStatusLight", "layout"], outputs: ["valueChange", "blurred", "keyDown", "keyDownEsc", "keyUpEnter"] }, { kind: "directive", type: i1.InputAppendDirective, selector: "ng-template[updInputAppend]" }, { kind: "directive", type: i1.InputPrependDirective, selector: "ng-template[updInputPrepend]" }, { kind: "component", type: i2.CheckboxComponent, selector: "upd-checkbox", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline", "isSwitch", "isIndeterminate"], outputs: ["changed", "isCheckedChange", "isIndeterminateChange"] }, { kind: "component", type: i3.RadioComponent, selector: "upd-radio", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline"], outputs: ["selected"] }, { kind: "component", type: i4.SelectComponent, selector: "upd-select", inputs: ["useSystemStyle", "shouldShowClearButton", "isCompact", "selected"], outputs: ["selectedItem"] }, { kind: "component", type: i4.SelectMultipleComponent, selector: "upd-select-multiple", outputs: ["selectedItems", "selectedIds"] }, { kind: "component", type: i5.TextareaComponent, selector: "upd-textarea", inputs: ["value", "customClasses", "wrapperClasses", "maxLength", "rows", "displayCharactersCount"], outputs: ["valueChange"] }, { kind: "component", type: i6.FileUploadComponent, selector: "upd-file-upload", inputs: ["fileName", "title", "allowFilesDrop", "isMultiple", "allowedExtensions", "minFileSize", "maxFileSize", "layout"], outputs: ["fileChanged"] }] }); }
119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: DynamicFieldComponent, selector: "upd-dynamic-field", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { submitForm: "submitForm" }, host: { properties: { "class": "this.wrapperClasses" } }, usesInheritance: true, ngImport: i0, template: "@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n @case (DynamicFieldType.MaskedInput) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [mask]=\"maskedField.mask\"\n [maskConfig]=\"maskedField.maskConfig\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\"\n [isDisabled]=\"field().isDisabled || false\" [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\"\n [value]=\"formControl.value\" (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n}\n", styles: [""], dependencies: [{ kind: "component", type: i1.InputComponent, selector: "upd-input", inputs: ["type", "mask", "maskConfig", "value", "size", "customClasses", "wrapperClasses", "maxLength", "isPlainText", "isReadOnly", "isLoading", "isRound", "isFlush", "isInputGroupFlat", "isPrependButton", "isAppendButton", "isFloating", "loaderPosition", "prependIconModel", "appendIconModel", "isValidationStatusLight", "layout"], outputs: ["valueChange", "blurred", "keyDown", "keyDownEsc", "keyUpEnter"] }, { kind: "directive", type: i1.InputAppendDirective, selector: "ng-template[updInputAppend]" }, { kind: "directive", type: i1.InputPrependDirective, selector: "ng-template[updInputPrepend]" }, { kind: "component", type: i2.CheckboxComponent, selector: "upd-checkbox", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline", "isSwitch", "isIndeterminate"], outputs: ["changed", "isCheckedChange", "isIndeterminateChange"] }, { kind: "component", type: i3.RadioComponent, selector: "upd-radio", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline"], outputs: ["selected"] }, { kind: "component", type: i4.SelectComponent, selector: "upd-select", inputs: ["useSystemStyle", "shouldShowClearButton", "isCompact", "selected"], outputs: ["selectedItem"] }, { kind: "component", type: i4.SelectMultipleComponent, selector: "upd-select-multiple", outputs: ["selectedItems", "selectedIds"] }, { kind: "component", type: i5.TextareaComponent, selector: "upd-textarea", inputs: ["value", "customClasses", "wrapperClasses", "maxLength", "rows", "displayCharactersCount"], outputs: ["valueChange"] }, { kind: "component", type: i6.FileUploadComponent, selector: "upd-file-upload", inputs: ["fileName", "title", "allowFilesDrop", "isMultiple", "allowedExtensions", "minFileSize", "maxFileSize", "layout"], outputs: ["fileChanged"] }] }); }
117
120
  }
118
121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DynamicFieldComponent, decorators: [{
119
122
  type: Component,
120
- args: [{ selector: 'upd-dynamic-field', template: "@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n}\n" }]
123
+ args: [{ selector: 'upd-dynamic-field', template: "@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n @case (DynamicFieldType.MaskedInput) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [mask]=\"maskedField.mask\"\n [maskConfig]=\"maskedField.maskConfig\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\"\n [isDisabled]=\"field().isDisabled || false\" [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\"\n [value]=\"formControl.value\" (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n}\n" }]
121
124
  }], propDecorators: { wrapperClasses: [{
122
125
  type: HostBinding,
123
126
  args: ['class']
124
127
  }], submitForm: [{
125
128
  type: Output
126
129
  }] } });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybS9zcmMvY29tcG9uZW50cy9keW5hbWljLWZpZWxkL2R5bmFtaWMtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm0vc3JjL2NvbXBvbmVudHMvZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFFLE1BQU0sRUFBZSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqSCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsSUFBSSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUtyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7O0FBZXpFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxhQUFhO0lBTHhEOztRQU0wQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUV2QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUNwQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUVoQyxjQUFTLEdBQTJCLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyRCxVQUFLLEdBQW1DLEtBQUssQ0FBQyxR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QUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDUixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEYsQ0FBQzs4R0EvR1EscUJBQXFCO2tHQUFyQixxQkFBcUIsaWpCQzNCbEMsMjFQQXdHQTs7MkZEN0VhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDSSxtQkFBbUI7OEJBS1AsY0FBYztzQkFBbkMsV0FBVzt1QkFBQyxPQUFPO2dCQUVELFVBQVU7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIGluamVjdCwgSW5wdXRTaWduYWwsIGlucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRleHRNb2RlbCwgVGV4dFNlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkayc7XG5pbXBvcnQgeyBPcHRpb25hbFR5cGUgfSBmcm9tICdAdXBkZXZzL3Nkay90eXBlcyc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHVwZGV2cy9zZGsvbGF5b3V0JztcbmltcG9ydCB7IENvbHVtblNpemVIZWxwZXIsIEhvcml6b250YWxWZXJ0aWNhbFR5cGUsIFZhbGlkYXRpb25TdGF0dXNUeXBlIH0gZnJvbSAnQHVwZGV2cy9jb21wb25lbnRzJztcbmltcG9ydCB7IERlZmF1bHRzIGFzIFNlbGVjdERlZmF1bHRzIH0gZnJvbSAnQHVwZGV2cy9jb21wb25lbnRzL2Zvcm0tY29udHJvbHMvc2VsZWN0JztcbmltcG9ydCB7IEZpbGVVcGxvYWRDaGFuZ2VkRXZlbnQgfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMvZm9ybS1jb250cm9scy9maWxlLXVwbG9hZCc7XG5cbmltcG9ydCB7IEZpbGVVcGxvYWRGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpbGUtdXBsb2FkLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IElucHV0RmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9pbnB1dC1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBFcnJvcnNIZWxwZXIgfSBmcm9tICcuLi8uLi90b29scy9lcnJvcnMtaGVscGVyJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZW51bXMvZHluYW1pYy1maWVsZC50eXBlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2R5bmFtaWMtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgQ2hlY2tib3hGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NoZWNrYm94LWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFJhZGlvRmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9yYWRpby1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3RGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NlbGVjdC1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3RGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NpbmdsZS1zZWxlY3QtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cEZpZWxkTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2hlY2tib3gtZ3JvdXAtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgUmFkaW9Hcm91cEZpZWxkTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvcmFkaW8tZ3JvdXAtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgVGV4dGFyZWFGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RleHRhcmVhLWZpZWxkLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGQtZHluYW1pYy1maWVsZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9keW5hbWljLWZpZWxkLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRmllbGRDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgd3JhcHBlckNsYXNzZXMgPSAnJztcblxuICAgIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgRHluYW1pY0ZpZWxkVHlwZSA9IER5bmFtaWNGaWVsZFR5cGU7XG4gICAgU2VsZWN0RGVmYXVsdHMgPSBTZWxlY3REZWZhdWx0cztcblxuICAgIGZvcm1Hcm91cDogSW5wdXRTaWduYWw8Rm9ybUdyb3VwPiA9IGlucHV0LnJlcXVpcmVkKCk7XG4gICAgZmllbGQ6IElucHV0U2lnbmFsPER5bmFtaWNGaWVsZE1vZGVsPiA9IGlucHV0LnJlcXVpcmVkKCk7XG4gICAgbGF5b3V0OiBJbnB1dFNpZ25hbDxIb3Jpem9udGFsVmVydGljYWxUeXBlPiA9IGlucHV0LnJlcXVpcmVkKCk7XG4gICAgdmFsaWRhdGlvblN0YXR1cz86IFZhbGlkYXRpb25TdGF0dXNUeXBlO1xuICAgIHZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnM6IFRleHRNb2RlbFtdID0gW107XG4gICAgZ2V0IGZvcm1Db250cm9sKCk6IEZvcm1Db250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwKCkuY29udHJvbHNbdGhpcy5maWVsZCgpLm5hbWVdIGFzIEZvcm1Db250cm9sO1xuICAgIH1cbiAgICBnZXQgaW5wdXRGaWVsZCgpOiBJbnB1dEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIElucHV0RmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IGNoZWNrYm94RmllbGQoKTogQ2hlY2tib3hGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBDaGVja2JveEZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCBjaGVja2JveEdyb3VwRmllbGQoKTogQ2hlY2tib3hHcm91cEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIENoZWNrYm94R3JvdXBGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgcmFkaW9GaWVsZCgpOiBDaGVja2JveEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIFJhZGlvRmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IHJhZGlvR3JvdXBGaWVsZCgpOiBSYWRpb0dyb3VwRmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgUmFkaW9Hcm91cEZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCBzZWxlY3RGaWVsZCgpOiBTZWxlY3RGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBTZWxlY3RGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgc2luZ2xlU2VsZWN0RmllbGQoKTogU2luZ2xlU2VsZWN0RmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgU2luZ2xlU2VsZWN0RmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IHRleHRhcmVhRmllbGQoKTogVGV4dGFyZWFGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBUZXh0YXJlYUZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCBmaWxlVXBsb2FkRmllbGQoKTogRmlsZVVwbG9hZEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIEZpbGVVcGxvYWRGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgY2hlY2tib3hHcm91cE9wdGlvbnNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hHcm91cEZpZWxkLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgcmFkaW9Hcm91cE9wdGlvbnNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmFkaW9Hcm91cEZpZWxkLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgZmlsZU5hbWVDb250cm9sKCk6IE9wdGlvbmFsVHlwZTxGb3JtQ29udHJvbD4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5maWxlTmFtZUZvcm1Qcm9wZXJ0eVxuICAgICAgICAgICAgPyB0aGlzLmZvcm1Hcm91cCgpLmNvbnRyb2xzW3RoaXMuZmlsZVVwbG9hZEZpZWxkLmZpbGVOYW1lRm9ybVByb3BlcnR5XSBhcyBGb3JtQ29udHJvbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgdGV4dFNlcnZpY2UgPSBpbmplY3QoVGV4dFNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvcnNIZWxwZXIgPSBpbmplY3QoRXJyb3JzSGVscGVyKTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGF0dXNTdWIgPSB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnMgPSB0aGlzLmVycm9yc0hlbHBlci5nZXRNZXNzYWdlcyh0aGlzLmZvcm1Db250cm9sKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHQgPT4gKHsgdGV4dDogdCwgaXNUcmFuc2xhdGVkOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0dXMgPSAnaW52YWxpZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXR1cyA9IHRoaXMuZmllbGQoKS5zaG93VmFsaWRTdGF0dXMgPyAndmFsaWQnIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNldHVwV3JhcHBlckNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5hZGRTdWJzY3JpcHRpb25zKHN0YXR1c1N1Yik7XG4gICAgfVxuXG4gICAgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWVsZCgpLnNob3VsZFZhbGlkYXRlT25CbHVyKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbnRyb2xWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuXG4gICAgZ2V0VGV4dCh0ZXh0TW9kZWw/OiBUZXh0TW9kZWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0U2VydmljZS5nZXRUZXh0KHRleHRNb2RlbCk7XG4gICAgfVxuXG4gICAgZ2V0T3B0aW9uRGVzY3JpcHRpb24oa2V5OiBzdHJpbmcsIHR5cGU6ICdjaGVja2JveCcgfCAncmFkaW8nKTogT3B0aW9uYWxUeXBlPFRleHRNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ2NoZWNrYm94JyA/IHRoaXMuY2hlY2tib3hHcm91cEZpZWxkLm9wdGlvbnNba2V5XSA6IHRoaXMucmFkaW9Hcm91cEZpZWxkLm9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBoYW5kbGVGaWxlU2VsZWN0ZWQoZXZlbnQ/OiBGaWxlVXBsb2FkQ2hhbmdlZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5zYXZlQXNEYXRhVXJsID8gZXZlbnQ/LmRhdGFVcmwgOiBldmVudD8uZmlsZSk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcblxuICAgICAgICBpZiAoISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5maWxlTmFtZUZvcm1Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTmFtZUNvbnRyb2whLnNldFZhbHVlKGV2ZW50Py5maWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dEVudGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoISF0aGlzLmlucHV0RmllbGQuc2hvdWxkU3VibWl0T25FbnRlcikge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRGb3JtLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBXcmFwcGVyQ2xhc3NlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cmFwcGVyQ2xhc3NlcyA9IENvbHVtblNpemVIZWxwZXIuZ2V0U2l6ZUNsYXNzZXModGhpcy5maWVsZCgpLmNvbFNpemUpO1xuICAgIH1cbn1cbiIsIkBzd2l0Y2ggKGZpZWxkKCkudHlwZSkge1xuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLklucHV0KSB7XG4gICAgICAgIDx1cGQtaW5wdXQgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQoKS5wbGFjZWhvbGRlclwiIFtoaW50XT1cImZpZWxkKCkuaGludFwiXG4gICAgICAgICAgICBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIiBbdmFsaWRhdGlvblN0YXR1c109XCJ2YWxpZGF0aW9uU3RhdHVzXCJcbiAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbbGF5b3V0XT1cImxheW91dCgpXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFt0eXBlXT1cImlucHV0RmllbGQuaW5wdXRUeXBlIHx8ICd0ZXh0J1wiIFtsYWJlbENvbFNpemVdPVwiZmllbGQoKS5sYWJlbENvbFNpemVcIiBbdmFsdWVdPVwiZm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNldENvbnRyb2xWYWx1ZSgkZXZlbnQpXCIgKGJsdXJyZWQpPVwib25CbHVyKClcIiAoa2V5VXBFbnRlcik9XCJvbklucHV0RW50ZXIoKVwiPlxuICAgICAgICAgICAgQGlmICghIWlucHV0RmllbGQucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHVwZElucHV0UHJlcGVuZD5cbiAgICAgICAgICAgICAgICAgICAge3sgdGV4dFNlcnZpY2UuZ2V0VGV4dChpbnB1dEZpZWxkLnByZWZpeCkgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKCEhaW5wdXRGaWVsZC5zdWZmaXgpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdXBkSW5wdXRBcHBlbmQ+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQoaW5wdXRGaWVsZC5zdWZmaXgpIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC91cGQtaW5wdXQ+XG4gICAgfVxuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLkNoZWNrYm94KSB7XG4gICAgICAgIDx1cGQtY2hlY2tib3ggW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIiBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJmaWVsZCgpLmlzRGlzYWJsZWQgfHwgZmFsc2VcIiBbaXNDaGVja2VkXT1cImZvcm1Db250cm9sLnZhbHVlXCIgW2lzSW5saW5lXT1cImNoZWNrYm94RmllbGQuaXNJbmxpbmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW2lzU3dpdGNoXT1cImNoZWNrYm94RmllbGQuaXNTd2l0Y2ggfHwgZmFsc2VcIiAoY2hhbmdlZCk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPjwvdXBkLWNoZWNrYm94PlxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5DaGVja2JveEdyb3VwKSB7XG4gICAgICAgIEBpZiAoISFmaWVsZCgpLmxhYmVsKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgZ2V0VGV4dChmaWVsZCgpLmxhYmVsKSB9fTwvbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAZm9yIChvcHRpb24gb2YgY2hlY2tib3hHcm91cE9wdGlvbnNLZXlzOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDx1cGQtY2hlY2tib3ggW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImdldE9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiwgJ2NoZWNrYm94JylcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIlxuICAgICAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbaXNDaGVja2VkXT1cImZvcm1Db250cm9sLnZhbHVlXCIgW2lzSW5saW5lXT1cImNoZWNrYm94RmllbGQuaXNJbmxpbmUgfHwgZmFsc2VcIiBbaXNTd2l0Y2hdPVwiY2hlY2tib3hGaWVsZC5pc1N3aXRjaCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZWQpPVwic2V0Q29udHJvbFZhbHVlKG9wdGlvbilcIj48L3VwZC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5SYWRpbykge1xuICAgICAgICA8dXBkLXJhZGlvIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJmaWVsZCgpLmxhYmVsXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCIgW2hpbnRBc1Rvb2x0aXBdPVwiZmllbGQoKS5oaW50QXNUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIiBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW3ZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJmb3JtQ29udHJvbC52YWx1ZVwiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiIFtpc0lubGluZV09XCJyYWRpb0ZpZWxkLmlzSW5saW5lIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L3VwZC1yYWRpbz5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuUmFkaW9Hcm91cCkge1xuICAgICAgICBAaWYgKCEhZmllbGQoKS5sYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IGdldFRleHQoZmllbGQoKS5sYWJlbCkgfX08L2xhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGZvciAob3B0aW9uIG9mIHJhZGlvR3JvdXBPcHRpb25zS2V5czsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgICAgICA8dXBkLXJhZGlvIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJnZXRPcHRpb25EZXNjcmlwdGlvbihvcHRpb24sICdyYWRpbycpXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCJcbiAgICAgICAgICAgICAgICBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIiBbdmFsaWRhdGlvblN0YXR1c109XCJ2YWxpZGF0aW9uU3RhdHVzXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJmb3JtQ29udHJvbC52YWx1ZVwiIFtpc0lubGluZV09XCJjaGVja2JveEZpZWxkLmlzSW5saW5lIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2V0Q29udHJvbFZhbHVlKG9wdGlvbilcIj48L3VwZC1yYWRpbz5cbiAgICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5TZWxlY3QpIHtcbiAgICAgICAgPHVwZC1zZWxlY3QgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIiBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIlxuICAgICAgICAgICAgW3VzZVN5c3RlbVN0eWxlXT1cInNpbmdsZVNlbGVjdEZpZWxkLnVzZVN5c3RlbVN0eWxlIHx8IGZhbHNlXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RGaWVsZC5pdGVtc1wiIFtsYXlvdXRdPVwibGF5b3V0KClcIiBbbGFiZWxDb2xTaXplXT1cImZpZWxkKCkubGFiZWxDb2xTaXplXCIgW3N0b3JlXT1cInNlbGVjdEZpZWxkLnN0b3JlIVwiXG4gICAgICAgICAgICBbb2JzZXJ2YWJsZV09XCJzZWxlY3RGaWVsZC5vYnNlcnZhYmxlXCIgW2l0ZW1LZXldPVwic2VsZWN0RmllbGQuaXRlbUtleVwiIFtpdGVtVmFsdWVdPVwic2VsZWN0RmllbGQuaXRlbVZhbHVlXCJcbiAgICAgICAgICAgIFtkcm9wZG93bk1heEhlaWdodF09XCJzZWxlY3RGaWVsZC5kcm9wZG93bk1heEhlaWdodCB8fCBTZWxlY3REZWZhdWx0cy5kcm9wZG93bk1heEhlaWdodFwiXG4gICAgICAgICAgICBbdHlwZWFoZWFkRGVib3VuY2VdPVwic2VsZWN0RmllbGQudHlwZWFoZWFkRGVib3VuY2UgfHwgU2VsZWN0RGVmYXVsdHMudHlwZWFoZWFkRGVib3VuY2VcIlxuICAgICAgICAgICAgW3Nob3VsZEF1dG9TZWFyY2hdPVwic2VsZWN0RmllbGQuc2hvdWxkQXV0b1NlYXJjaCB8fCBTZWxlY3REZWZhdWx0cy5zaG91bGRBdXRvU2VhcmNoXCJcbiAgICAgICAgICAgIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInNlbGVjdEZpZWxkLnNob3VsZENsb3NlT25PdXRzaWRlQ2xpY2sgfHwgU2VsZWN0RGVmYXVsdHMuc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJdGVtKT1cInNldENvbnRyb2xWYWx1ZSgkZXZlbnQ/LnZhbHVlKVwiPjwvdXBkLXNlbGVjdD5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuU2VsZWN0TXVsdGlwbGUpIHtcbiAgICAgICAgPHVwZC1zZWxlY3QtbXVsdGlwbGUgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIlxuICAgICAgICAgICAgW2hpbnRBc1Rvb2x0aXBdPVwiZmllbGQoKS5oaW50QXNUb29sdGlwIHx8IGZhbHNlXCIgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiXG4gICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RGaWVsZC5pdGVtc1wiIFtsYXlvdXRdPVwibGF5b3V0KClcIiBbbGFiZWxDb2xTaXplXT1cImZpZWxkKCkubGFiZWxDb2xTaXplXCIgW3N0b3JlXT1cInNlbGVjdEZpZWxkLnN0b3JlIVwiXG4gICAgICAgICAgICBbb2JzZXJ2YWJsZV09XCJzZWxlY3RGaWVsZC5vYnNlcnZhYmxlXCIgW2l0ZW1LZXldPVwic2VsZWN0RmllbGQuaXRlbUtleVwiIFtpdGVtVmFsdWVdPVwic2VsZWN0RmllbGQuaXRlbVZhbHVlXCJcbiAgICAgICAgICAgIFtkcm9wZG93bk1heEhlaWdodF09XCJzZWxlY3RGaWVsZC5kcm9wZG93bk1heEhlaWdodCB8fCBTZWxlY3REZWZhdWx0cy5kcm9wZG93bk1heEhlaWdodFwiXG4gICAgICAgICAgICBbdHlwZWFoZWFkRGVib3VuY2VdPVwic2VsZWN0RmllbGQudHlwZWFoZWFkRGVib3VuY2UgfHwgU2VsZWN0RGVmYXVsdHMudHlwZWFoZWFkRGVib3VuY2VcIlxuICAgICAgICAgICAgW3Nob3VsZEF1dG9TZWFyY2hdPVwic2VsZWN0RmllbGQuc2hvdWxkQXV0b1NlYXJjaCB8fCBTZWxlY3REZWZhdWx0cy5zaG91bGRBdXRvU2VhcmNoXCJcbiAgICAgICAgICAgIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInNlbGVjdEZpZWxkLnNob3VsZENsb3NlT25PdXRzaWRlQ2xpY2sgfHwgU2VsZWN0RGVmYXVsdHMuc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJZHMpPVwic2V0Q29udHJvbFZhbHVlKCRldmVudClcIj48L3VwZC1zZWxlY3QtbXVsdGlwbGU+XG4gICAgfVxuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLkxhYmVsKSB7XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBnZXRUZXh0KGZpZWxkKCkubGFiZWwpIH19PC9sYWJlbD5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuVGV4dEFyZWEpIHtcbiAgICAgICAgPHVwZC10ZXh0YXJlYSBbbmFtZV09XCJmaWVsZCgpLm5hbWVcIiBbbGFiZWxdPVwiZmllbGQoKS5sYWJlbFwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZCgpLnBsYWNlaG9sZGVyXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCJcbiAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNdPVwidmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc1wiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybUNvbnRyb2wudmFsdWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJ0ZXh0YXJlYUZpZWxkLmN1c3RvbUNsYXNzZXNcIiBbd3JhcHBlckNsYXNzZXNdPVwidGV4dGFyZWFGaWVsZC53cmFwcGVyQ2xhc3Nlc1wiXG4gICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInRleHRhcmVhRmllbGQubWF4TGVuZ3RoXCIgW3Jvd3NdPVwidGV4dGFyZWFGaWVsZC5yb3dzXCJcbiAgICAgICAgICAgIFtkaXNwbGF5Q2hhcmFjdGVyc0NvdW50XT1cInRleHRhcmVhRmllbGQuZGlzcGxheUNoYXJhY3RlcnNDb3VudCB8fCBmYWxzZVwiICh2YWx1ZUNoYW5nZSk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L3VwZC10ZXh0YXJlYT5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuRmlsZVVwbG9hZCkge1xuICAgICAgICA8dXBkLWZpbGUtdXBsb2FkIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJmaWVsZCgpLmxhYmVsXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIiBbZmlsZU5hbWVdPVwiZmlsZU5hbWVDb250cm9sPy52YWx1ZVwiXG4gICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW2FsbG93RmlsZXNEcm9wXT1cImZpbGVVcGxvYWRGaWVsZC5hbGxvd0ZpbGVzRHJvcCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZmlsZVVwbG9hZEZpZWxkLnRpdGxlXCIgW2xhYmVsQ29sU2l6ZV09XCJmaWVsZCgpLmxhYmVsQ29sU2l6ZVwiIFttaW5GaWxlU2l6ZV09XCJmaWxlVXBsb2FkRmllbGQubWluRmlsZVNpemVcIlxuICAgICAgICAgICAgW2lzTXVsdGlwbGVdPVwiZmlsZVVwbG9hZEZpZWxkLmlzTXVsdGlwbGUgfHwgZmFsc2VcIiBbYWxsb3dlZEV4dGVuc2lvbnNdPVwiZmlsZVVwbG9hZEZpZWxkLmFsbG93ZWRFeHRlbnNpb25zIHx8ICcqJ1wiXG4gICAgICAgICAgICBbbWF4RmlsZVNpemVdPVwiZmlsZVVwbG9hZEZpZWxkLm1heEZpbGVTaXplXCIgW2xheW91dF09XCJsYXlvdXQoKVwiIChmaWxlQ2hhbmdlZCk9XCJoYW5kbGVGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPjwvdXBkLWZpbGUtdXBsb2FkPlxuICAgIH1cbn1cbiJdfQ==
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybS9zcmMvY29tcG9uZW50cy9keW5hbWljLWZpZWxkL2R5bmFtaWMtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm0vc3JjL2NvbXBvbmVudHMvZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFFLE1BQU0sRUFBZSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqSCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsSUFBSSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQU1yRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7O0FBZXpFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxhQUFhO0lBTHhEOztRQU0wQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUV2QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUNwQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUVoQyxjQUFTLEdBQTJCLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyRCxVQUFLLEdBQW1DLEtBQUssQ0FBQyxR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QzlDLElBQUksQ0FBQyxlQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDOzhHQWxIUSxxQkFBcUI7a0dBQXJCLHFCQUFxQixpakJDNUJsQyxtK1JBMkhBOzsyRkQvRmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNJLG1CQUFtQjs4QkFLUCxjQUFjO3NCQUFuQyxXQUFXO3VCQUFDLE9BQU87Z0JBRUQsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBIb3N0QmluZGluZywgaW5qZWN0LCBJbnB1dFNpZ25hbCwgaW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGV4dE1vZGVsLCBUZXh0U2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrJztcbmltcG9ydCB7IE9wdGlvbmFsVHlwZSB9IGZyb20gJ0B1cGRldnMvc2RrL3R5cGVzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICdAdXBkZXZzL3Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgQ29sdW1uU2l6ZUhlbHBlciwgSG9yaXpvbnRhbFZlcnRpY2FsVHlwZSwgVmFsaWRhdGlvblN0YXR1c1R5cGUgfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgRGVmYXVsdHMgYXMgU2VsZWN0RGVmYXVsdHMgfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMvZm9ybS1jb250cm9scy9zZWxlY3QnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZENoYW5nZWRFdmVudCB9IGZyb20gJ0B1cGRldnMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2xzL2ZpbGUtdXBsb2FkJztcblxuaW1wb3J0IHsgRmlsZVVwbG9hZEZpZWxkTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmlsZS11cGxvYWQtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgSW5wdXRGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2lucHV0LWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE1hc2tlZElucHV0RmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9tYXNrZWQtaW5wdXQtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgRXJyb3JzSGVscGVyIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXJyb3JzLWhlbHBlcic7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VudW1zL2R5bmFtaWMtZmllbGQudHlwZSc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9keW5hbWljLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IENoZWNrYm94RmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9jaGVja2JveC1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBSYWRpb0ZpZWxkTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvcmFkaW8tZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgU2VsZWN0RmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zZWxlY3QtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0RmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zaW5nbGUtc2VsZWN0LWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IENoZWNrYm94R3JvdXBGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NoZWNrYm94LWdyb3VwLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFJhZGlvR3JvdXBGaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JhZGlvLWdyb3VwLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFRleHRhcmVhRmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy90ZXh0YXJlYS1maWVsZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBkLWR5bmFtaWMtZmllbGQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZHluYW1pYy1maWVsZC5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0ZpZWxkQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIHdyYXBwZXJDbGFzc2VzID0gJyc7XG5cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc3VibWl0Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIER5bmFtaWNGaWVsZFR5cGUgPSBEeW5hbWljRmllbGRUeXBlO1xuICAgIFNlbGVjdERlZmF1bHRzID0gU2VsZWN0RGVmYXVsdHM7XG5cbiAgICBmb3JtR3JvdXA6IElucHV0U2lnbmFsPEZvcm1Hcm91cD4gPSBpbnB1dC5yZXF1aXJlZCgpO1xuICAgIGZpZWxkOiBJbnB1dFNpZ25hbDxEeW5hbWljRmllbGRNb2RlbD4gPSBpbnB1dC5yZXF1aXJlZCgpO1xuICAgIGxheW91dDogSW5wdXRTaWduYWw8SG9yaXpvbnRhbFZlcnRpY2FsVHlwZT4gPSBpbnB1dC5yZXF1aXJlZCgpO1xuICAgIHZhbGlkYXRpb25TdGF0dXM/OiBWYWxpZGF0aW9uU3RhdHVzVHlwZTtcbiAgICB2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zOiBUZXh0TW9kZWxbXSA9IFtdO1xuICAgIGdldCBmb3JtQ29udHJvbCgpOiBGb3JtQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cCgpLmNvbnRyb2xzW3RoaXMuZmllbGQoKS5uYW1lXSBhcyBGb3JtQ29udHJvbDtcbiAgICB9XG4gICAgZ2V0IGlucHV0RmllbGQoKTogSW5wdXRGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBJbnB1dEZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCBjaGVja2JveEZpZWxkKCk6IENoZWNrYm94RmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgQ2hlY2tib3hGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgY2hlY2tib3hHcm91cEZpZWxkKCk6IENoZWNrYm94R3JvdXBGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBDaGVja2JveEdyb3VwRmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IHJhZGlvRmllbGQoKTogQ2hlY2tib3hGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBSYWRpb0ZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwRmllbGQoKTogUmFkaW9Hcm91cEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIFJhZGlvR3JvdXBGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0RmllbGQoKTogU2VsZWN0RmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgU2VsZWN0RmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IHNpbmdsZVNlbGVjdEZpZWxkKCk6IFNpbmdsZVNlbGVjdEZpZWxkTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZCgpIGFzIFNpbmdsZVNlbGVjdEZpZWxkTW9kZWw7XG4gICAgfVxuICAgIGdldCB0ZXh0YXJlYUZpZWxkKCk6IFRleHRhcmVhRmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgVGV4dGFyZWFGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgZmlsZVVwbG9hZEZpZWxkKCk6IEZpbGVVcGxvYWRGaWVsZE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQoKSBhcyBGaWxlVXBsb2FkRmllbGRNb2RlbDtcbiAgICB9XG4gICAgZ2V0IG1hc2tlZEZpZWxkKCk6IE1hc2tlZElucHV0RmllbGRNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkKCkgYXMgTWFza2VkSW5wdXRGaWVsZE1vZGVsO1xuICAgIH1cbiAgICBnZXQgY2hlY2tib3hHcm91cE9wdGlvbnNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hHcm91cEZpZWxkLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgcmFkaW9Hcm91cE9wdGlvbnNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmFkaW9Hcm91cEZpZWxkLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgZmlsZU5hbWVDb250cm9sKCk6IE9wdGlvbmFsVHlwZTxGb3JtQ29udHJvbD4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5maWxlTmFtZUZvcm1Qcm9wZXJ0eVxuICAgICAgICAgICAgPyB0aGlzLmZvcm1Hcm91cCgpLmNvbnRyb2xzW3RoaXMuZmlsZVVwbG9hZEZpZWxkLmZpbGVOYW1lRm9ybVByb3BlcnR5XSBhcyBGb3JtQ29udHJvbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgdGV4dFNlcnZpY2UgPSBpbmplY3QoVGV4dFNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvcnNIZWxwZXIgPSBpbmplY3QoRXJyb3JzSGVscGVyKTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGF0dXNTdWIgPSB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnMgPSB0aGlzLmVycm9yc0hlbHBlci5nZXRNZXNzYWdlcyh0aGlzLmZvcm1Db250cm9sKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHQgPT4gKHsgdGV4dDogdCwgaXNUcmFuc2xhdGVkOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0dXMgPSAnaW52YWxpZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXR1cyA9IHRoaXMuZmllbGQoKS5zaG93VmFsaWRTdGF0dXMgPyAndmFsaWQnIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNldHVwV3JhcHBlckNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5hZGRTdWJzY3JpcHRpb25zKHN0YXR1c1N1Yik7XG4gICAgfVxuXG4gICAgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWVsZCgpLnNob3VsZFZhbGlkYXRlT25CbHVyKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbnRyb2xWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuXG4gICAgZ2V0VGV4dCh0ZXh0TW9kZWw/OiBUZXh0TW9kZWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0U2VydmljZS5nZXRUZXh0KHRleHRNb2RlbCk7XG4gICAgfVxuXG4gICAgZ2V0T3B0aW9uRGVzY3JpcHRpb24oa2V5OiBzdHJpbmcsIHR5cGU6ICdjaGVja2JveCcgfCAncmFkaW8nKTogT3B0aW9uYWxUeXBlPFRleHRNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ2NoZWNrYm94JyA/IHRoaXMuY2hlY2tib3hHcm91cEZpZWxkLm9wdGlvbnNba2V5XSA6IHRoaXMucmFkaW9Hcm91cEZpZWxkLm9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBoYW5kbGVGaWxlU2VsZWN0ZWQoZXZlbnQ/OiBGaWxlVXBsb2FkQ2hhbmdlZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5zYXZlQXNEYXRhVXJsID8gZXZlbnQ/LmRhdGFVcmwgOiBldmVudD8uZmlsZSk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcblxuICAgICAgICBpZiAoISF0aGlzLmZpbGVVcGxvYWRGaWVsZC5maWxlTmFtZUZvcm1Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTmFtZUNvbnRyb2whLnNldFZhbHVlKGV2ZW50Py5maWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dEVudGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoISF0aGlzLmlucHV0RmllbGQuc2hvdWxkU3VibWl0T25FbnRlcikge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRGb3JtLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBXcmFwcGVyQ2xhc3NlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cmFwcGVyQ2xhc3NlcyA9IENvbHVtblNpemVIZWxwZXIuZ2V0U2l6ZUNsYXNzZXModGhpcy5maWVsZCgpLmNvbFNpemUpO1xuICAgIH1cbn1cbiIsIkBzd2l0Y2ggKGZpZWxkKCkudHlwZSkge1xuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLklucHV0KSB7XG4gICAgICAgIDx1cGQtaW5wdXQgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQoKS5wbGFjZWhvbGRlclwiIFtoaW50XT1cImZpZWxkKCkuaGludFwiXG4gICAgICAgICAgICBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIiBbdmFsaWRhdGlvblN0YXR1c109XCJ2YWxpZGF0aW9uU3RhdHVzXCJcbiAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbbGF5b3V0XT1cImxheW91dCgpXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFt0eXBlXT1cImlucHV0RmllbGQuaW5wdXRUeXBlIHx8ICd0ZXh0J1wiIFtsYWJlbENvbFNpemVdPVwiZmllbGQoKS5sYWJlbENvbFNpemVcIiBbdmFsdWVdPVwiZm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNldENvbnRyb2xWYWx1ZSgkZXZlbnQpXCIgKGJsdXJyZWQpPVwib25CbHVyKClcIiAoa2V5VXBFbnRlcik9XCJvbklucHV0RW50ZXIoKVwiPlxuICAgICAgICAgICAgQGlmICghIWlucHV0RmllbGQucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHVwZElucHV0UHJlcGVuZD5cbiAgICAgICAgICAgICAgICAgICAge3sgdGV4dFNlcnZpY2UuZ2V0VGV4dChpbnB1dEZpZWxkLnByZWZpeCkgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKCEhaW5wdXRGaWVsZC5zdWZmaXgpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdXBkSW5wdXRBcHBlbmQ+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQoaW5wdXRGaWVsZC5zdWZmaXgpIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC91cGQtaW5wdXQ+XG4gICAgfVxuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLkNoZWNrYm94KSB7XG4gICAgICAgIDx1cGQtY2hlY2tib3ggW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIiBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJmaWVsZCgpLmlzRGlzYWJsZWQgfHwgZmFsc2VcIiBbaXNDaGVja2VkXT1cImZvcm1Db250cm9sLnZhbHVlXCIgW2lzSW5saW5lXT1cImNoZWNrYm94RmllbGQuaXNJbmxpbmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW2lzU3dpdGNoXT1cImNoZWNrYm94RmllbGQuaXNTd2l0Y2ggfHwgZmFsc2VcIiAoY2hhbmdlZCk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPjwvdXBkLWNoZWNrYm94PlxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5DaGVja2JveEdyb3VwKSB7XG4gICAgICAgIEBpZiAoISFmaWVsZCgpLmxhYmVsKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgZ2V0VGV4dChmaWVsZCgpLmxhYmVsKSB9fTwvbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAZm9yIChvcHRpb24gb2YgY2hlY2tib3hHcm91cE9wdGlvbnNLZXlzOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDx1cGQtY2hlY2tib3ggW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImdldE9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiwgJ2NoZWNrYm94JylcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIlxuICAgICAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbaXNDaGVja2VkXT1cImZvcm1Db250cm9sLnZhbHVlXCIgW2lzSW5saW5lXT1cImNoZWNrYm94RmllbGQuaXNJbmxpbmUgfHwgZmFsc2VcIiBbaXNTd2l0Y2hdPVwiY2hlY2tib3hGaWVsZC5pc1N3aXRjaCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZWQpPVwic2V0Q29udHJvbFZhbHVlKG9wdGlvbilcIj48L3VwZC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5SYWRpbykge1xuICAgICAgICA8dXBkLXJhZGlvIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJmaWVsZCgpLmxhYmVsXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCIgW2hpbnRBc1Rvb2x0aXBdPVwiZmllbGQoKS5oaW50QXNUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIiBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW3ZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJmb3JtQ29udHJvbC52YWx1ZVwiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiIFtpc0lubGluZV09XCJyYWRpb0ZpZWxkLmlzSW5saW5lIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L3VwZC1yYWRpbz5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuUmFkaW9Hcm91cCkge1xuICAgICAgICBAaWYgKCEhZmllbGQoKS5sYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IGdldFRleHQoZmllbGQoKS5sYWJlbCkgfX08L2xhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGZvciAob3B0aW9uIG9mIHJhZGlvR3JvdXBPcHRpb25zS2V5czsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgICAgICA8dXBkLXJhZGlvIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJnZXRPcHRpb25EZXNjcmlwdGlvbihvcHRpb24sICdyYWRpbycpXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCJcbiAgICAgICAgICAgICAgICBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIiBbdmFsaWRhdGlvblN0YXR1c109XCJ2YWxpZGF0aW9uU3RhdHVzXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJmb3JtQ29udHJvbC52YWx1ZVwiIFtpc0lubGluZV09XCJjaGVja2JveEZpZWxkLmlzSW5saW5lIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2V0Q29udHJvbFZhbHVlKG9wdGlvbilcIj48L3VwZC1yYWRpbz5cbiAgICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5TZWxlY3QpIHtcbiAgICAgICAgPHVwZC1zZWxlY3QgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIiBbaGludEFzVG9vbHRpcF09XCJmaWVsZCgpLmhpbnRBc1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIlxuICAgICAgICAgICAgW3VzZVN5c3RlbVN0eWxlXT1cInNpbmdsZVNlbGVjdEZpZWxkLnVzZVN5c3RlbVN0eWxlIHx8IGZhbHNlXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RGaWVsZC5pdGVtc1wiIFtsYXlvdXRdPVwibGF5b3V0KClcIiBbbGFiZWxDb2xTaXplXT1cImZpZWxkKCkubGFiZWxDb2xTaXplXCIgW3N0b3JlXT1cInNlbGVjdEZpZWxkLnN0b3JlIVwiXG4gICAgICAgICAgICBbb2JzZXJ2YWJsZV09XCJzZWxlY3RGaWVsZC5vYnNlcnZhYmxlXCIgW2l0ZW1LZXldPVwic2VsZWN0RmllbGQuaXRlbUtleVwiIFtpdGVtVmFsdWVdPVwic2VsZWN0RmllbGQuaXRlbVZhbHVlXCJcbiAgICAgICAgICAgIFtkcm9wZG93bk1heEhlaWdodF09XCJzZWxlY3RGaWVsZC5kcm9wZG93bk1heEhlaWdodCB8fCBTZWxlY3REZWZhdWx0cy5kcm9wZG93bk1heEhlaWdodFwiXG4gICAgICAgICAgICBbdHlwZWFoZWFkRGVib3VuY2VdPVwic2VsZWN0RmllbGQudHlwZWFoZWFkRGVib3VuY2UgfHwgU2VsZWN0RGVmYXVsdHMudHlwZWFoZWFkRGVib3VuY2VcIlxuICAgICAgICAgICAgW3Nob3VsZEF1dG9TZWFyY2hdPVwic2VsZWN0RmllbGQuc2hvdWxkQXV0b1NlYXJjaCB8fCBTZWxlY3REZWZhdWx0cy5zaG91bGRBdXRvU2VhcmNoXCJcbiAgICAgICAgICAgIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInNlbGVjdEZpZWxkLnNob3VsZENsb3NlT25PdXRzaWRlQ2xpY2sgfHwgU2VsZWN0RGVmYXVsdHMuc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJdGVtKT1cInNldENvbnRyb2xWYWx1ZSgkZXZlbnQ/LnZhbHVlKVwiPjwvdXBkLXNlbGVjdD5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuU2VsZWN0TXVsdGlwbGUpIHtcbiAgICAgICAgPHVwZC1zZWxlY3QtbXVsdGlwbGUgW25hbWVdPVwiZmllbGQoKS5uYW1lXCIgW2xhYmVsXT1cImZpZWxkKCkubGFiZWxcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIlxuICAgICAgICAgICAgW2hpbnRBc1Rvb2x0aXBdPVwiZmllbGQoKS5oaW50QXNUb29sdGlwIHx8IGZhbHNlXCIgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiXG4gICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RGaWVsZC5pdGVtc1wiIFtsYXlvdXRdPVwibGF5b3V0KClcIiBbbGFiZWxDb2xTaXplXT1cImZpZWxkKCkubGFiZWxDb2xTaXplXCIgW3N0b3JlXT1cInNlbGVjdEZpZWxkLnN0b3JlIVwiXG4gICAgICAgICAgICBbb2JzZXJ2YWJsZV09XCJzZWxlY3RGaWVsZC5vYnNlcnZhYmxlXCIgW2l0ZW1LZXldPVwic2VsZWN0RmllbGQuaXRlbUtleVwiIFtpdGVtVmFsdWVdPVwic2VsZWN0RmllbGQuaXRlbVZhbHVlXCJcbiAgICAgICAgICAgIFtkcm9wZG93bk1heEhlaWdodF09XCJzZWxlY3RGaWVsZC5kcm9wZG93bk1heEhlaWdodCB8fCBTZWxlY3REZWZhdWx0cy5kcm9wZG93bk1heEhlaWdodFwiXG4gICAgICAgICAgICBbdHlwZWFoZWFkRGVib3VuY2VdPVwic2VsZWN0RmllbGQudHlwZWFoZWFkRGVib3VuY2UgfHwgU2VsZWN0RGVmYXVsdHMudHlwZWFoZWFkRGVib3VuY2VcIlxuICAgICAgICAgICAgW3Nob3VsZEF1dG9TZWFyY2hdPVwic2VsZWN0RmllbGQuc2hvdWxkQXV0b1NlYXJjaCB8fCBTZWxlY3REZWZhdWx0cy5zaG91bGRBdXRvU2VhcmNoXCJcbiAgICAgICAgICAgIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInNlbGVjdEZpZWxkLnNob3VsZENsb3NlT25PdXRzaWRlQ2xpY2sgfHwgU2VsZWN0RGVmYXVsdHMuc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJZHMpPVwic2V0Q29udHJvbFZhbHVlKCRldmVudClcIj48L3VwZC1zZWxlY3QtbXVsdGlwbGU+XG4gICAgfVxuICAgIEBjYXNlIChEeW5hbWljRmllbGRUeXBlLkxhYmVsKSB7XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBnZXRUZXh0KGZpZWxkKCkubGFiZWwpIH19PC9sYWJlbD5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuVGV4dEFyZWEpIHtcbiAgICAgICAgPHVwZC10ZXh0YXJlYSBbbmFtZV09XCJmaWVsZCgpLm5hbWVcIiBbbGFiZWxdPVwiZmllbGQoKS5sYWJlbFwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZCgpLnBsYWNlaG9sZGVyXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCJcbiAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIlxuICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNdPVwidmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc1wiIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybUNvbnRyb2wudmFsdWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJ0ZXh0YXJlYUZpZWxkLmN1c3RvbUNsYXNzZXNcIiBbd3JhcHBlckNsYXNzZXNdPVwidGV4dGFyZWFGaWVsZC53cmFwcGVyQ2xhc3Nlc1wiXG4gICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInRleHRhcmVhRmllbGQubWF4TGVuZ3RoXCIgW3Jvd3NdPVwidGV4dGFyZWFGaWVsZC5yb3dzXCJcbiAgICAgICAgICAgIFtkaXNwbGF5Q2hhcmFjdGVyc0NvdW50XT1cInRleHRhcmVhRmllbGQuZGlzcGxheUNoYXJhY3RlcnNDb3VudCB8fCBmYWxzZVwiICh2YWx1ZUNoYW5nZSk9XCJzZXRDb250cm9sVmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L3VwZC10ZXh0YXJlYT5cbiAgICB9XG4gICAgQGNhc2UgKER5bmFtaWNGaWVsZFR5cGUuRmlsZVVwbG9hZCkge1xuICAgICAgICA8dXBkLWZpbGUtdXBsb2FkIFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJmaWVsZCgpLmxhYmVsXCIgW2hpbnRdPVwiZmllbGQoKS5oaW50XCIgW2lzRGlzYWJsZWRdPVwiZmllbGQoKS5pc0Rpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtoaW50QXNUb29sdGlwXT1cImZpZWxkKCkuaGludEFzVG9vbHRpcCB8fCBmYWxzZVwiIFt2YWxpZGF0aW9uU3RhdHVzXT1cInZhbGlkYXRpb25TdGF0dXNcIiBbZmlsZU5hbWVdPVwiZmlsZU5hbWVDb250cm9sPy52YWx1ZVwiXG4gICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Rlc2NyaXB0aW9uc109XCJ2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXCIgW2FsbG93RmlsZXNEcm9wXT1cImZpbGVVcGxvYWRGaWVsZC5hbGxvd0ZpbGVzRHJvcCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZmlsZVVwbG9hZEZpZWxkLnRpdGxlXCIgW2xhYmVsQ29sU2l6ZV09XCJmaWVsZCgpLmxhYmVsQ29sU2l6ZVwiIFttaW5GaWxlU2l6ZV09XCJmaWxlVXBsb2FkRmllbGQubWluRmlsZVNpemVcIlxuICAgICAgICAgICAgW2lzTXVsdGlwbGVdPVwiZmlsZVVwbG9hZEZpZWxkLmlzTXVsdGlwbGUgfHwgZmFsc2VcIiBbYWxsb3dlZEV4dGVuc2lvbnNdPVwiZmlsZVVwbG9hZEZpZWxkLmFsbG93ZWRFeHRlbnNpb25zIHx8ICcqJ1wiXG4gICAgICAgICAgICBbbWF4RmlsZVNpemVdPVwiZmlsZVVwbG9hZEZpZWxkLm1heEZpbGVTaXplXCIgW2xheW91dF09XCJsYXlvdXQoKVwiIChmaWxlQ2hhbmdlZCk9XCJoYW5kbGVGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPjwvdXBkLWZpbGUtdXBsb2FkPlxuICAgIH1cbiAgICBAY2FzZSAoRHluYW1pY0ZpZWxkVHlwZS5NYXNrZWRJbnB1dCkge1xuICAgICAgICA8dXBkLWlucHV0IFtuYW1lXT1cImZpZWxkKCkubmFtZVwiIFtsYWJlbF09XCJmaWVsZCgpLmxhYmVsXCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkKCkucGxhY2Vob2xkZXJcIiBbaGludF09XCJmaWVsZCgpLmhpbnRcIlxuICAgICAgICAgICAgW2hpbnRBc1Rvb2x0aXBdPVwiZmllbGQoKS5oaW50QXNUb29sdGlwIHx8IGZhbHNlXCIgW3ZhbGlkYXRpb25TdGF0dXNdPVwidmFsaWRhdGlvblN0YXR1c1wiIFttYXNrXT1cIm1hc2tlZEZpZWxkLm1hc2tcIlxuICAgICAgICAgICAgW21hc2tDb25maWddPVwibWFza2VkRmllbGQubWFza0NvbmZpZ1wiIFt2YWxpZGF0aW9uU3RhdHVzRGVzY3JpcHRpb25zXT1cInZhbGlkYXRpb25TdGF0dXNEZXNjcmlwdGlvbnNcIiBbbGF5b3V0XT1cImxheW91dCgpXCJcbiAgICAgICAgICAgIFtpc0Rpc2FibGVkXT1cImZpZWxkKCkuaXNEaXNhYmxlZCB8fCBmYWxzZVwiIFt0eXBlXT1cImlucHV0RmllbGQuaW5wdXRUeXBlIHx8ICd0ZXh0J1wiIFtsYWJlbENvbFNpemVdPVwiZmllbGQoKS5sYWJlbENvbFNpemVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1Db250cm9sLnZhbHVlXCIgKHZhbHVlQ2hhbmdlKT1cInNldENvbnRyb2xWYWx1ZSgkZXZlbnQpXCIgKGJsdXJyZWQpPVwib25CbHVyKClcIiAoa2V5VXBFbnRlcik9XCJvbklucHV0RW50ZXIoKVwiPlxuICAgICAgICAgICAgQGlmICghIWlucHV0RmllbGQucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHVwZElucHV0UHJlcGVuZD5cbiAgICAgICAgICAgICAgICAgICAge3sgdGV4dFNlcnZpY2UuZ2V0VGV4dChpbnB1dEZpZWxkLnByZWZpeCkgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKCEhaW5wdXRGaWVsZC5zdWZmaXgpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdXBkSW5wdXRBcHBlbmQ+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQoaW5wdXRGaWVsZC5zdWZmaXgpIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC91cGQtaW5wdXQ+XG4gICAgfVxufVxuIl19
@@ -10,5 +10,6 @@ export var DynamicFieldType;
10
10
  DynamicFieldType[DynamicFieldType["RadioGroup"] = 8] = "RadioGroup";
11
11
  DynamicFieldType[DynamicFieldType["TextArea"] = 9] = "TextArea";
12
12
  DynamicFieldType[DynamicFieldType["FileUpload"] = 10] = "FileUpload";
13
+ DynamicFieldType[DynamicFieldType["MaskedInput"] = 11] = "MaskedInput";
13
14
  })(DynamicFieldType || (DynamicFieldType = {}));
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm0vc3JjL21vZGVscy9lbnVtcy9keW5hbWljLWZpZWxkLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZ0JBV1g7QUFYRCxXQUFZLGdCQUFnQjtJQUN4Qix5REFBUyxDQUFBO0lBQ1QsMkRBQVUsQ0FBQTtJQUNWLDJFQUFrQixDQUFBO0lBQ2xCLHlEQUFTLENBQUE7SUFDVCwrREFBWSxDQUFBO0lBQ1oseUVBQWlCLENBQUE7SUFDakIseURBQVMsQ0FBQTtJQUNULG1FQUFjLENBQUE7SUFDZCwrREFBWSxDQUFBO0lBQ1osb0VBQWUsQ0FBQTtBQUNuQixDQUFDLEVBWFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQVczQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIER5bmFtaWNGaWVsZFR5cGUge1xuICAgIElucHV0ID0gMSxcbiAgICBTZWxlY3QgPSAyLFxuICAgIFNlbGVjdE11bHRpcGxlID0gMyxcbiAgICBMYWJlbCA9IDQsXG4gICAgQ2hlY2tib3ggPSA1LFxuICAgIENoZWNrYm94R3JvdXAgPSA2LFxuICAgIFJhZGlvID0gNyxcbiAgICBSYWRpb0dyb3VwID0gOCxcbiAgICBUZXh0QXJlYSA9IDksXG4gICAgRmlsZVVwbG9hZCA9IDEwXG59XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm0vc3JjL21vZGVscy9lbnVtcy9keW5hbWljLWZpZWxkLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZ0JBWVg7QUFaRCxXQUFZLGdCQUFnQjtJQUN4Qix5REFBUyxDQUFBO0lBQ1QsMkRBQVUsQ0FBQTtJQUNWLDJFQUFrQixDQUFBO0lBQ2xCLHlEQUFTLENBQUE7SUFDVCwrREFBWSxDQUFBO0lBQ1oseUVBQWlCLENBQUE7SUFDakIseURBQVMsQ0FBQTtJQUNULG1FQUFjLENBQUE7SUFDZCwrREFBWSxDQUFBO0lBQ1osb0VBQWUsQ0FBQTtJQUNmLHNFQUFnQixDQUFBO0FBQ3BCLENBQUMsRUFaVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBWTNCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRHluYW1pY0ZpZWxkVHlwZSB7XG4gICAgSW5wdXQgPSAxLFxuICAgIFNlbGVjdCA9IDIsXG4gICAgU2VsZWN0TXVsdGlwbGUgPSAzLFxuICAgIExhYmVsID0gNCxcbiAgICBDaGVja2JveCA9IDUsXG4gICAgQ2hlY2tib3hHcm91cCA9IDYsXG4gICAgUmFkaW8gPSA3LFxuICAgIFJhZGlvR3JvdXAgPSA4LFxuICAgIFRleHRBcmVhID0gOSxcbiAgICBGaWxlVXBsb2FkID0gMTAsXG4gICAgTWFza2VkSW5wdXQgPSAxMVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFza2VkLWlucHV0LWZpZWxkLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm0vc3JjL21vZGVscy9tYXNrZWQtaW5wdXQtZmllbGQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVwZE1hc2tDb25maWcgfSBmcm9tICdAdXBkZXZzL3Nkay9tYXNrJztcblxuaW1wb3J0IHsgSW5wdXRGaWVsZE1vZGVsIH0gZnJvbSAnLi9pbnB1dC1maWVsZC5tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFza2VkSW5wdXRGaWVsZE1vZGVsIGV4dGVuZHMgSW5wdXRGaWVsZE1vZGVsIHtcbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIG1hc2tDb25maWc/OiBVcGRNYXNrQ29uZmlnO1xufVxuIl19
@@ -6,10 +6,11 @@ export * from './file-upload-field.model';
6
6
  export * from './form-config';
7
7
  export * from './form-row.model';
8
8
  export * from './input-field.model';
9
+ export * from './masked-input-field.model';
9
10
  export * from './radio-field.model';
10
11
  export * from './radio-field.model';
11
12
  export * from './radio-group-field.model';
12
13
  export * from './select-field.model';
13
14
  export * from './single-select-field.model';
14
15
  export * from './textarea-field.model';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3JtL3NyYy9tb2RlbHMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9lbnVtcy9wdWJsaWMtYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2tib3gtZmllbGQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGVja2JveC1ncm91cC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2R5bmFtaWMtZmllbGQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9maWxlLXVwbG9hZC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm0tY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS1yb3cubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnB1dC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3JhZGlvLWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vcmFkaW8tZmllbGQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWRpby1ncm91cC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3NlbGVjdC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3NpbmdsZS1zZWxlY3QtZmllbGQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXh0YXJlYS1maWVsZC5tb2RlbCc7XG4iXX0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3JtL3NyYy9tb2RlbHMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudW1zL3B1YmxpYy1hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9jaGVja2JveC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2NoZWNrYm94LWdyb3VwLWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vZHluYW1pYy1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkLWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtLXJvdy5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2lucHV0LWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbWFza2VkLWlucHV0LWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vcmFkaW8tZmllbGQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWRpby1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3JhZGlvLWdyb3VwLWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vc2VsZWN0LWZpZWxkLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vc2luZ2xlLXNlbGVjdC1maWVsZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3RleHRhcmVhLWZpZWxkLm1vZGVsJztcbiJdfQ==
@@ -66,6 +66,7 @@ export class HeaderComponent extends BaseComponent {
66
66
  ].slice(0, this.coreLayoutConfigService.config.numberOfLastNotificationsDisplayed);
67
67
  });
68
68
  this.textService = inject(TextService);
69
+ this.isSidebarMobileOpen = signal(false);
69
70
  this.securityStorage = inject(SecurityStorage);
70
71
  this.coreLayoutConfigService = inject(UpdCoreLayoutConfigService);
71
72
  this.layoutService = inject(LayoutService);
@@ -117,14 +118,17 @@ export class HeaderComponent extends BaseComponent {
117
118
  removeNotification(notification) {
118
119
  this.notificationsService.removeNotifications(notification.id);
119
120
  }
121
+ toggleSidebarOnMobile() {
122
+ this.isSidebarMobileOpen.set(!this.isSidebarMobileOpen());
123
+ }
120
124
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block ps-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
125
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
122
126
  }
123
127
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, decorators: [{
124
128
  type: Component,
125
- args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block ps-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
129
+ args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
126
130
  }], propDecorators: { classes: [{
127
131
  type: HostBinding,
128
132
  args: ['class']
129
133
  }] } });
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sYXlvdXQvc3JjL3BhcnRpYWxzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xheW91dC9zcmMvcGFydGlhbHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixXQUFXLEVBRVgsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFBRSxLQUFLLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFVdkQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQU5sRDs7UUFXSSx3QkFBbUIsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RSxxQkFBZ0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUVqRSxtQ0FBOEIsR0FBRyxLQUFLLENBQUM7UUFDdkMsZ0NBQTJCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUV4QixVQUFLLEdBQUcsS0FBSyxDQUFrQixPQUFPLENBQUMsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLFFBQVEsQ0FBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9HLDZCQUF3QixHQUFHLFFBQVEsQ0FBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakgsd0JBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekYscUJBQWdCLEdBQUcsUUFBUSxDQUFpQixHQUFHLEVBQUU7WUFDdEQsTUFBTSxtQkFBbUIsR0FBbUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTFGLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztvQkFDckIsRUFBRSxFQUFFLEdBQUc7b0JBQ1AsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztvQkFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLEdBQUc7aUJBQzlDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxtQkFBbUIsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNNLHNCQUFpQixHQUFHLFFBQVEsQ0FBaUIsR0FBRyxFQUFFO1lBQ3ZELE1BQU0sV0FBVyxHQUFtQixFQUFFLENBQUM7WUFFdkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN0RixFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUcsRUFBRTtnQkFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUssRUFBRTtnQkFDakIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRTthQUMxQixDQUFDLENBQUMsQ0FBQztZQUVKLE9BQU8sV0FBVyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ00sYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDOUQsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM3RixDQUFDO1FBQ08sb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUM7WUFDMUUsQ0FBQyxDQUFDLEVBQUUsQ0FDWCxDQUFDO1FBQ08sa0NBQTZCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDcEgsd0JBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN6QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtpQkFDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2lCQUN4QixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUN2RixLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN0RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtpQkFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7aUJBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ3ZGLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBRXRGLE9BQU87Z0JBQ0gsR0FBRyxtQkFBbUI7Z0JBQ3RCLEdBQUcsaUJBQWlCO2FBQ3ZCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLENBQUM7UUFDTSxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM3RCxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoRCx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCx1QkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDOUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUMvRCx1QkFBa0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsZ0VBQWdFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakksOERBQThEO1FBQ3JELFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7S0ErQzNFO0lBaklHLElBQTBCLE9BQU87UUFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQWtGRCxRQUFRO1FBQ0osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUcsQ0FBQyxtQkFBb0IsQ0FBQztZQUU3RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQWtCO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVELHdCQUF3QixDQUFDLElBQWtCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLGFBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsWUFBK0I7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxZQUErQjtRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7OEdBaklRLGVBQWU7a0dBQWYsZUFBZSxnVkFLdUMsVUFBVSwrSEFDaEIsVUFBVSx5SEFDaEIsVUFBVSxvRUNsQ2pFLCs5T0EwSEE7OzJGRC9GYSxlQUFlO2tCQU4zQixTQUFTOytCQUNJLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSTs4QkFHWCxPQUFPO3NCQUFoQyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBPbkluaXQsXG4gICAgaW5qZWN0LFxuICAgIGNvbXB1dGVkLFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZiwgaW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZXJJY29uc1R5cGUgfSBmcm9tICdAdXBkZXZzL2ljb25zJztcbmltcG9ydCB7IFRleHRTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgTGF5b3V0U2VydmljZSwgUHJlZmVyZW5jZXNTdG9yYWdlLCBVcGRDb3JlTGF5b3V0Q29uZmlnU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW0gfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25Nb2RlbCwgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkay9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IFNlY3VyaXR5U3RvcmFnZSB9IGZyb20gJ0B1cGRldnMvc2RrL3NlY3VyaXR5JztcblxuaW1wb3J0IHsgSGVhZGVyU3R5bGVUeXBlIH0gZnJvbSAnLi9oZWFkZXItc3R5bGUudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlckNsYXNzZXMoKTtcbiAgICB9XG5cbiAgICBsYW5ndWFnZVN3aXRjaGVyUmVmID0gdmlld0NoaWxkKCdsYW5ndWFnZVN3aXRjaGVyQnRuJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIG5vdGlmaWNhdGlvbnNSZWYgPSB2aWV3Q2hpbGQoJ25vdGlmaWNhdGlvbnNCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgbG9nZ2VkVXNlclJlZiA9IHZpZXdDaGlsZCgnbG9nZ2VkVXNlckJ0bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIGlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTm90aWZpY2F0aW9uc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTG9nZ2VkVXNlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgcmVhZG9ubHkgc3R5bGUgPSBpbnB1dDxIZWFkZXJTdHlsZVR5cGU+KCdsaWdodCcpO1xuICAgIHJlYWRvbmx5IG5leHRUaGVtZUljb24gPSBjb21wdXRlZDxUYWJsZXJJY29uc1R5cGU+KCgpID0+IHRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lID8gJ3N1bicgOiAnbW9vbi1zdGFycycpO1xuICAgIHJlYWRvbmx5IGN1cnJlbnROb3RpZmljYXRpb25zSWNvbiA9IGNvbXB1dGVkPFRhYmxlckljb25zVHlwZT4oKCkgPT4gdGhpcy5oYXNOZXdOb3RpZmljYXRpb25zKCkgPyAnYmVsbC1yaW5naW5nJyA6ICdiZWxsJyk7XG4gICAgcmVhZG9ubHkgaGFzTmV3Tm90aWZpY2F0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbnMoKS5zb21lKG4gPT4gIW4uZGF0ZVJlYWQpKTtcbiAgICByZWFkb25seSBsYW5ndWFnZXNPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25JdGVtW10+KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTGFuZ3VhZ2VzT3B0aW9uczogRHJvcGRvd25JdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gKHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB7fSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoYXZhaWxhYmxlTGFuZ3VhZ2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBhbGxMYW5ndWFnZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgIHRleHQ6IGF2YWlsYWJsZUxhbmd1YWdlc1trZXldLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUtleSgpID09PSBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzT3B0aW9ucztcbiAgICB9KTtcbiAgICByZWFkb25seSBsb2dnZWRVc2VyT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duSXRlbVtdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJBY3Rpb25zOiBEcm9wZG93bkl0ZW1bXSA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmxvZ2dlZFVzZXJNZW51QWN0aW9ucy5mb3JFYWNoKGFjdCA9PiB1c2VyQWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBhY3QuaWQhKCksXG4gICAgICAgICAgICB0ZXh0OiBhY3QudGV4dCEoKSxcbiAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIGljb246IGFjdC5pY29uTW9kZWw/LigpXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gdXNlckFjdGlvbnM7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgdXNlckluZm8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlY3VyaXR5U3RvcmFnZS5nZXRVc2VySW5mbygpKTtcbiAgICByZWFkb25seSB1c2VySWRlbnRpZmljYXRpb24gPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICAhIXRoaXMudXNlckluZm8oKSA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJOYW1lKHRoaXMudXNlckluZm8oKSEpIDogJydcbiAgICApO1xuICAgIHJlYWRvbmx5IHVzZXJEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICEhdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcuZ2V0VXNlckRlc2NyaXB0aW9uXG4gICAgICAgICAgICA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJEZXNjcmlwdGlvbih0aGlzLnVzZXJJbmZvKCkhKVxuICAgICAgICAgICAgOiAnJ1xuICAgICk7XG4gICAgcmVhZG9ubHkgc2hvdWxkQmxpbmtJZk5ld05vdGlmaWNhdGlvbnMgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLnNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKTtcbiAgICByZWFkb25seSBsYXRlc3ROb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1bnJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gIW4uZGF0ZVJlYWQpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYi5kYXRlUmVjZWl2ZWQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcubnVtYmVyT2ZMYXN0Tm90aWZpY2F0aW9uc0Rpc3BsYXllZCk7XG4gICAgICAgIGNvbnN0IHJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gISFuLmRhdGVSZWFkKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGIuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmRhdGVSZWNlaXZlZCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLm51bWJlck9mTGFzdE5vdGlmaWNhdGlvbnNEaXNwbGF5ZWQpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi51bnJlYWROb3RpZmljYXRpb25zLFxuICAgICAgICAgICAgLi4ucmVhZE5vdGlmaWNhdGlvbnNcbiAgICAgICAgXS5zbGljZSgwLCB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5udW1iZXJPZkxhc3ROb3RpZmljYXRpb25zRGlzcGxheWVkKTtcbiAgICB9KTtcbiAgICByZWFkb25seSB0ZXh0U2VydmljZSA9IGluamVjdChUZXh0U2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5U3RvcmFnZSA9IGluamVjdChTZWN1cml0eVN0b3JhZ2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29yZUxheW91dENvbmZpZ1NlcnZpY2UgPSBpbmplY3QoVXBkQ29yZUxheW91dENvbmZpZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0U2VydmljZSA9IGluamVjdChMYXlvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2UgPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJlbmNlc1N0b3JhZ2UgPSBpbmplY3QoUHJlZmVyZW5jZXNTdG9yYWdlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRQcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLmdldFByZWZlcmVuY2VzKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50Tm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9ucztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5ndWFnZUtleSA9IHNpZ25hbCgnJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IGBuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBkLW5vbmUgZC1sZy1mbGV4IGQtcHJpbnQtbm9uZSBuYXZiYXItJHt0aGlzLnN0eWxlKCl9YCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHJlYWRvbmx5IGNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGF5b3V0U2VydmljZS5tYWluSGVhZGVyQ29uZmlnKCkpO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uuc2V0RGFya01vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmN1cnJlbnRMYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmN1cnJlbnRQcmVmZXJlbmNlcygpIS5jdXJyZW50TGFuZ3VhZ2VDb2RlITtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VLZXkuc2V0KGNvZGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUaGVtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLnRvZ2dsZURhcmtNb2RlKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoTGFuZ3VhZ2UoaXRlbTogRHJvcGRvd25JdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlS2V5LnNldChpdGVtLmlkKTtcbiAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoaXRlbS5pZCk7XG4gICAgICAgIHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLnNhdmVQcmVmZXJlbmNlcyh7IC4uLnRoaXMuY3VycmVudFByZWZlcmVuY2VzKCksIGN1cnJlbnRMYW5ndWFnZUNvZGU6IGl0ZW0uaWQgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5ub3RpZnlVc2VyQ2hhbmdlZExhbmd1YWdlKGl0ZW0uaWQpO1xuXG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKGl0ZW06IERyb3Bkb3duSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBidG4gPSB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5sb2dnZWRVc2VyTWVudUFjdGlvbnMuZmluZChiID0+IGIuaWQhKCkgPT09IGl0ZW0uaWQpO1xuXG4gICAgICAgIGlmICghIWJ0bj8uY2xpY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgYnRuLmNsaWNrRnVuY3Rpb24hKHsgZGF0YTogdGhpcy51c2VySW5mbygpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmRhdGVSZWFkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLm1hcmtBc1JlYWQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuY2xpY2tPbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UucmVtb3ZlTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXIteGxcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXItaWNvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2YmFyLW5hdiBmbGV4LXJvdyBvcmRlci1tZC1sYXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1tZC1mbGV4IG1lLTNcIj5cbiAgICAgICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93VGhlbWVTd2l0Y2hlcikge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJzd2l0Y2hUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWljb24gW3RhYmxlckljb25dPVwibmV4dFRoZW1lSWNvbigpXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC91cGQtbGluaz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93TGFuZ3VhZ2VTd2l0Y2hlciAmJiBsYW5ndWFnZXNPcHRpb25zKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc0xhbmd1YWdlU3dpdGNoZXJEcm9wZG93bk9wZW49dHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgI2xhbmd1YWdlU3dpdGNoZXJCdG4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWljb24gdGFibGVySWNvbj1cImxhbmd1YWdlXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC91cGQtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgPHVwZC1kcm9wZG93biB3cmFwcGVyQ2xhc3Nlcz1cIm10LTFcIiBbaXNPcGVuXT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25SZWZlcmVuY2VdPVwibGFuZ3VhZ2VTd2l0Y2hlclJlZigpXCIgW2l0ZW1zXT1cImxhbmd1YWdlc09wdGlvbnMoKVwiIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJpc0xhbmd1YWdlU3dpdGNoZXJEcm9wZG93bk9wZW4gPSAkZXZlbnRcIiAoc2VsZWN0ZWRJdGVtKT1cInN3aXRjaExhbmd1YWdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC91cGQtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCEhY29uZmlnKCkuc2hvd05vdGlmaWNhdGlvbnMgJiYgISF1c2VySW5mbygpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtIGRyb3Bkb3duIGQtbm9uZSBkLW1kLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVwZC1saW5rIFtpc05hdmlnYXRpb25dPVwidHJ1ZVwiIFtjdXN0b21DbGFzc2VzXT1cIlsncHgtMCddXCIgKGNsaWNrZWQpPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgI25vdGlmaWNhdGlvbnNCdG4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWljb24gW3RhYmxlckljb25dPVwiY3VycmVudE5vdGlmaWNhdGlvbnNJY29uKClcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNOZXdOb3RpZmljYXRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXJlZFwiIFtjbGFzcy5iYWRnZS1ibGlua109XCJzaG91bGRCbGlua0lmTmV3Tm90aWZpY2F0aW9ucygpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWRyb3Bkb3duIHdyYXBwZXJDbGFzc2VzPVwibXQtMSBkcm9wZG93bi1tZW51LWNhcmRcIiBbaXNPcGVuXT1cImlzTm90aWZpY2F0aW9uc0Ryb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25SZWZlcmVuY2VdPVwibm90aWZpY2F0aW9uc1JlZigpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cImlzTm90aWZpY2F0aW9uc0Ryb3Bkb3duT3BlbiA9ICRldmVudFwiIFttaW5XaWR0aF09XCI0MDBcIiBhcnJvd1R5cGU9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7ICdVcERldnMuTm90aWZpY2F0aW9uQ2VudGVyLlRpdGxlJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAobm90aWZpY2F0aW9uIG9mIGxhdGVzdE5vdGlmaWNhdGlvbnMoKTsgdHJhY2sgbm90aWZpY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2ggbGlzdC1ncm91cC1ob3ZlcmFibGVcIiAoY2xpY2spPVwicmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCEhbm90aWZpY2F0aW9uLmRhdGVSZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGQtYmxvY2tcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3Qgc3RhdHVzLWRvdC1hbmltYXRlZCBiZy1wcmltYXJ5IGQtYmxvY2tcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cInRleHQtYm9keSBkLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZnctYm9sZF09XCIhbm90aWZpY2F0aW9uLmRhdGVSZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGV4dFNlcnZpY2UuZ2V0VGV4dChub3RpZmljYXRpb24udGl0bGUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCEhbm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtYmxvY2sgdGV4dC1zZWNvbmRhcnkgdGV4dC10cnVuY2F0ZSBtdC1uMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0U2VydmljZS5nZXRUZXh0KG5vdGlmaWNhdGlvbi5kZXNjcmlwdGlvbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVwZC1saW5rIFtjdXN0b21DbGFzc2VzXT1cIlsnbGlzdC1ncm91cC1pdGVtLWFjdGlvbnMnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwicmVtb3ZlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWljb24gdGFibGVySWNvbj1cInhcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91cGQtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQtYm9keS10ZXJ0aWFyeVwiPnt7ICdVcERldnMuTm90aWZpY2F0aW9uQ2VudGVyLk5vTm90aWZpY2F0aW9ucycgfCB0cmFuc2xvY28gfX08L2gxPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC91cGQtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKCEhY29uZmlnKCkuc2hvd1VzZXJNZW51ICYmICEhdXNlckluZm8oKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtIGRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgPHVwZC1saW5rIFtpc05hdmlnYXRpb25dPVwidHJ1ZVwiIFtjdXN0b21DbGFzc2VzXT1cIlsncHgtMCddXCIgKGNsaWNrZWQpPVwiaXNMb2dnZWRVc2VyRHJvcGRvd25PcGVuID0gdHJ1ZVwiICNsb2dnZWRVc2VyQnRuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCEhdXNlckluZm8oKSEuYXZhdGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2YXRhciBhdmF0YXItc21cIiBzdHlsZT1cImJhY2tncm91bmQtaW1hZ2U6IHVybCh7e3VzZXJJbmZvKCk/LmF2YXRhcn19KVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC14bC1ibG9jayBwcy0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IHVzZXJJZGVudGlmaWNhdGlvbigpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCEhdXNlckRlc2NyaXB0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbWFsbCB0ZXh0LW11dGVkXCI+e3sgdXNlckRlc2NyaXB0aW9uKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC91cGQtbGluaz5cbiAgICAgICAgICAgICAgICBAaWYgKGxvZ2dlZFVzZXJPcHRpb25zKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICA8dXBkLWRyb3Bkb3duIHdyYXBwZXJDbGFzc2VzPVwibXQtMVwiIFtpc09wZW5dPVwiaXNMb2dnZWRVc2VyRHJvcGRvd25PcGVuXCIgW2Ryb3Bkb3duUmVmZXJlbmNlXT1cImxvZ2dlZFVzZXJSZWYoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibG9nZ2VkVXNlck9wdGlvbnMoKVwiIFtzaG91bGRDbG9zZU9uT3V0c2lkZUNsaWNrXT1cInRydWVcIiAoc2VsZWN0ZWRJdGVtKT1cInNlbGVjdExvZ2dlZFVzZXJNZW51SXRlbSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc09wZW5DaGFuZ2UpPVwiaXNMb2dnZWRVc2VyRHJvcGRvd25PcGVuID0gJGV2ZW50XCIgYXJyb3dUeXBlPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC91cGQtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKCEhY29uZmlnKCkuc2hvd1NlYXJjaEJhciAmJiAhIXVzZXJJbmZvKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbGxhcHNlIG5hdmJhci1jb2xsYXBzZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIiBbY2xhc3Mudy0xMDBdPVwiY29uZmlnKCkuc2hvdWxkVXNlRnVsbFNlYXJjaEJhclwiPlxuICAgICAgICAgICAgICAgIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIG5vdmFsaWRhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWljb24tYWRkb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWljb24gdGFibGVySWNvbj1cInNlYXJjaFwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJ7eydVcERldnMuSGVhZGVyLlNlYXJjaCcgfCB0cmFuc2xvY299fS4uLlwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgfVxuPC9kaXY+XG4iXX0=
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sYXlvdXQvc3JjL3BhcnRpYWxzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xheW91dC9zcmMvcGFydGlhbHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixXQUFXLEVBRVgsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFBRSxLQUFLLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFVdkQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQU5sRDs7UUFXSSx3QkFBbUIsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RSxxQkFBZ0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENB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S0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckcsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxhQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLFlBQStCO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsWUFBK0I7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7OEdBdElRLGVBQWU7a0dBQWYsZUFBZSxnVkFLdUMsVUFBVSwrSEFDaEIsVUFBVSx5SEFDaEIsVUFBVSxvRUNsQ2pFLHlsUEEwSEE7OzJGRC9GYSxlQUFlO2tCQU4zQixTQUFTOytCQUNJLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSTs4QkFHWCxPQUFPO3NCQUFoQyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBPbkluaXQsXG4gICAgaW5qZWN0LFxuICAgIGNvbXB1dGVkLFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZiwgaW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZXJJY29uc1R5cGUgfSBmcm9tICdAdXBkZXZzL2ljb25zJztcbmltcG9ydCB7IFRleHRTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgTGF5b3V0U2VydmljZSwgUHJlZmVyZW5jZXNTdG9yYWdlLCBVcGRDb3JlTGF5b3V0Q29uZmlnU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW0gfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25Nb2RlbCwgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkay9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IFNlY3VyaXR5U3RvcmFnZSB9IGZyb20gJ0B1cGRldnMvc2RrL3NlY3VyaXR5JztcblxuaW1wb3J0IHsgSGVhZGVyU3R5bGVUeXBlIH0gZnJvbSAnLi9oZWFkZXItc3R5bGUudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlckNsYXNzZXMoKTtcbiAgICB9XG5cbiAgICBsYW5ndWFnZVN3aXRjaGVyUmVmID0gdmlld0NoaWxkKCdsYW5ndWFnZVN3aXRjaGVyQnRuJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIG5vdGlmaWNhdGlvbnNSZWYgPSB2aWV3Q2hpbGQoJ25vdGlmaWNhdGlvbnNCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgbG9nZ2VkVXNlclJlZiA9IHZpZXdDaGlsZCgnbG9nZ2VkVXNlckJ0bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIGlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTm90aWZpY2F0aW9uc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTG9nZ2VkVXNlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgcmVhZG9ubHkgc3R5bGUgPSBpbnB1dDxIZWFkZXJTdHlsZVR5cGU+KCdsaWdodCcpO1xuICAgIHJlYWRvbmx5IG5leHRUaGVtZUljb24gPSBjb21wdXRlZDxUYWJsZXJJY29uc1R5cGU+KCgpID0+IHRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lID8gJ3N1bicgOiAnbW9vbi1zdGFycycpO1xuICAgIHJlYWRvbmx5IGN1cnJlbnROb3RpZmljYXRpb25zSWNvbiA9IGNvbXB1dGVkPFRhYmxlckljb25zVHlwZT4oKCkgPT4gdGhpcy5oYXNOZXdOb3RpZmljYXRpb25zKCkgPyAnYmVsbC1yaW5naW5nJyA6ICdiZWxsJyk7XG4gICAgcmVhZG9ubHkgaGFzTmV3Tm90aWZpY2F0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbnMoKS5zb21lKG4gPT4gIW4uZGF0ZVJlYWQpKTtcbiAgICByZWFkb25seSBsYW5ndWFnZXNPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25JdGVtW10+KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTGFuZ3VhZ2VzT3B0aW9uczogRHJvcGRvd25JdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gKHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB7fSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoYXZhaWxhYmxlTGFuZ3VhZ2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBhbGxMYW5ndWFnZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgIHRleHQ6IGF2YWlsYWJsZUxhbmd1YWdlc1trZXldLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUtleSgpID09PSBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzT3B0aW9ucztcbiAgICB9KTtcbiAgICByZWFkb25seSBsb2dnZWRVc2VyT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duSXRlbVtdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJBY3Rpb25zOiBEcm9wZG93bkl0ZW1bXSA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmxvZ2dlZFVzZXJNZW51QWN0aW9ucy5mb3JFYWNoKGFjdCA9PiB1c2VyQWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBhY3QuaWQhKCksXG4gICAgICAgICAgICB0ZXh0OiBhY3QudGV4dCEoKSxcbiAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIGljb246IGFjdC5pY29uTW9kZWw/LigpXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gdXNlckFjdGlvbnM7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgdXNlckluZm8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlY3VyaXR5U3RvcmFnZS5nZXRVc2VySW5mbygpKTtcbiAgICByZWFkb25seSB1c2VySWRlbnRpZmljYXRpb24gPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICAhIXRoaXMudXNlckluZm8oKSA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJOYW1lKHRoaXMudXNlckluZm8oKSEpIDogJydcbiAgICApO1xuICAgIHJlYWRvbmx5IHVzZXJEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICEhdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcuZ2V0VXNlckRlc2NyaXB0aW9uXG4gICAgICAgICAgICA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJEZXNjcmlwdGlvbih0aGlzLnVzZXJJbmZvKCkhKVxuICAgICAgICAgICAgOiAnJ1xuICAgICk7XG4gICAgcmVhZG9ubHkgc2hvdWxkQmxpbmtJZk5ld05vdGlmaWNhdGlvbnMgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLnNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKTtcbiAgICByZWFkb25seSBsYXRlc3ROb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1bnJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gIW4uZGF0ZVJlYWQpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYi5kYXRlUmVjZWl2ZWQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcubnVtYmVyT2ZMYXN0Tm90aWZpY2F0aW9uc0Rpc3BsYXllZCk7XG4gICAgICAgIGNvbnN0IHJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gISFuLmRhdGVSZWFkKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGIuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmRhdGVSZWNlaXZlZCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLm51bWJlck9mTGFzdE5vdGlmaWNhdGlvbnNEaXNwbGF5ZWQpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi51bnJlYWROb3RpZmljYXRpb25zLFxuICAgICAgICAgICAgLi4ucmVhZE5vdGlmaWNhdGlvbnNcbiAgICAgICAgXS5zbGljZSgwLCB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5udW1iZXJPZkxhc3ROb3RpZmljYXRpb25zRGlzcGxheWVkKTtcbiAgICB9KTtcbiAgICByZWFkb25seSB0ZXh0U2VydmljZSA9IGluamVjdChUZXh0U2VydmljZSk7XG4gICAgcmVhZG9ubHkgaXNTaWRlYmFyTW9iaWxlT3BlbiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5U3RvcmFnZSA9IGluamVjdChTZWN1cml0eVN0b3JhZ2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29yZUxheW91dENvbmZpZ1NlcnZpY2UgPSBpbmplY3QoVXBkQ29yZUxheW91dENvbmZpZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0U2VydmljZSA9IGluamVjdChMYXlvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2UgPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJlbmNlc1N0b3JhZ2UgPSBpbmplY3QoUHJlZmVyZW5jZXNTdG9yYWdlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRQcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLmdldFByZWZlcmVuY2VzKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50Tm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9ucztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5ndWFnZUtleSA9IHNpZ25hbCgnJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IGBuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBkLW5vbmUgZC1sZy1mbGV4IGQtcHJpbnQtbm9uZSBuYXZiYXItJHt0aGlzLnN0eWxlKCl9YCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHJlYWRvbmx5IGNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGF5b3V0U2VydmljZS5tYWluSGVhZGVyQ29uZmlnKCkpO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uuc2V0RGFya01vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmN1cnJlbnRMYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmN1cnJlbnRQcmVmZXJlbmNlcygpIS5jdXJyZW50TGFuZ3VhZ2VDb2RlITtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VLZXkuc2V0KGNvZGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUaGVtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLnRvZ2dsZURhcmtNb2RlKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoTGFuZ3VhZ2UoaXRlbTogRHJvcGRvd25JdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlS2V5LnNldChpdGVtLmlkKTtcbiAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoaXRlbS5pZCk7XG4gICAgICAgIHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLnNhdmVQcmVmZXJlbmNlcyh7IC4uLnRoaXMuY3VycmVudFByZWZlcmVuY2VzKCksIGN1cnJlbnRMYW5ndWFnZUNvZGU6IGl0ZW0uaWQgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5ub3RpZnlVc2VyQ2hhbmdlZExhbmd1YWdlKGl0ZW0uaWQpO1xuXG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKGl0ZW06IERyb3Bkb3duSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBidG4gPSB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5sb2dnZWRVc2VyTWVudUFjdGlvbnMuZmluZChiID0+IGIuaWQhKCkgPT09IGl0ZW0uaWQpO1xuXG4gICAgICAgIGlmICghIWJ0bj8uY2xpY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgYnRuLmNsaWNrRnVuY3Rpb24hKHsgZGF0YTogdGhpcy51c2VySW5mbygpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmRhdGVSZWFkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLm1hcmtBc1JlYWQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuY2xpY2tPbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UucmVtb3ZlTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xuICAgIH1cblxuICAgIHRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuLnNldCghdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuKCkpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXIteGxcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1NpZGViYXJNb2JpbGVPcGVuKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZiYXItbmF2IGZsZXgtcm93IG9yZGVyLW1kLWxhc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLW1kLWZsZXggbWUtM1wiPlxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dUaGVtZVN3aXRjaGVyKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cInN3aXRjaFRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJuZXh0VGhlbWVJY29uKClcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dMYW5ndWFnZVN3aXRjaGVyICYmIGxhbmd1YWdlc09wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3Blbj10cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbGFuZ3VhZ2VTd2l0Y2hlckJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwibGFuZ3VhZ2VcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWRyb3Bkb3duIHdyYXBwZXJDbGFzc2VzPVwibXQtMVwiIFtpc09wZW5dPVwiaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJsYW5ndWFnZVN3aXRjaGVyUmVmKClcIiBbaXRlbXNdPVwibGFuZ3VhZ2VzT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9ICRldmVudFwiIChzZWxlY3RlZEl0ZW0pPVwic3dpdGNoTGFuZ3VhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93Tm90aWZpY2F0aW9ucyAmJiAhIXVzZXJJbmZvKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd24gZC1ub25lIGQtbWQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc05vdGlmaWNhdGlvbnNEcm9wZG93bk9wZW4gPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbm90aWZpY2F0aW9uc0J0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJjdXJyZW50Tm90aWZpY2F0aW9uc0ljb24oKVwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc05ld05vdGlmaWNhdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcmVkXCIgW2NsYXNzLmJhZGdlLWJsaW5rXT1cInNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdXBkLWxpbms+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xIGRyb3Bkb3duLW1lbnUtY2FyZFwiIFtpc09wZW5dPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJub3RpZmljYXRpb25zUmVmKClcIiBbc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc09wZW5DaGFuZ2UpPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuID0gJGV2ZW50XCIgW21pbldpZHRoXT1cIjQwMFwiIGFycm93VHlwZT1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChub3RpZmljYXRpb24gb2YgbGF0ZXN0Tm90aWZpY2F0aW9ucygpOyB0cmFjayBub3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCBsaXN0LWdyb3VwLWhvdmVyYWJsZVwiIChjbGljayk9XCJyZWFkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGF0ZVJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtZG90LWFuaW1hdGVkIGJnLXByaW1hcnkgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwidGV4dC1ib2R5IGQtYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mdy1ib2xkXT1cIiFub3RpZmljYXRpb24uZGF0ZVJlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0U2VydmljZS5nZXRUZXh0KG5vdGlmaWNhdGlvbi50aXRsZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ibG9jayB0ZXh0LXNlY29uZGFyeSB0ZXh0LXRydW5jYXRlIG10LW4xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQobm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2N1c3RvbUNsYXNzZXNdPVwiWydsaXN0LWdyb3VwLWl0ZW0tYWN0aW9ucyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwieFwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC1ib2R5LXRlcnRpYXJ5XCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuTm9Ob3RpZmljYXRpb25zJyB8IHRyYW5zbG9jbyB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93VXNlck1lbnUgJiYgISF1c2VySW5mbygpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSB0cnVlXCIgI2xvZ2dlZFVzZXJCdG4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VySW5mbygpIS5hdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyIGF2YXRhci1zbVwiIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7dXNlckluZm8oKT8uYXZhdGFyfX0pXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLXhsLWJsb2NrIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgdXNlcklkZW50aWZpY2F0aW9uKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VyRGVzY3JpcHRpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtYWxsIHRleHQtbXV0ZWRcIj57eyB1c2VyRGVzY3JpcHRpb24oKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIEBpZiAobG9nZ2VkVXNlck9wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xXCIgW2lzT3Blbl09XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW5cIiBbZHJvcGRvd25SZWZlcmVuY2VdPVwibG9nZ2VkVXNlclJlZigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJsb2dnZWRVc2VyT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiIChzZWxlY3RlZEl0ZW0pPVwic2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSAkZXZlbnRcIiBhcnJvd1R5cGU9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoISFjb25maWcoKS5zaG93U2VhcmNoQmFyICYmICEhdXNlckluZm8oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlXCIgW2NsYXNzLnNob3ddPVwiaXNTaWRlYmFyTW9iaWxlT3BlbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiIFtjbGFzcy53LTEwMF09XCJjb25maWcoKS5zaG91bGRVc2VGdWxsU2VhcmNoQmFyXCI+XG4gICAgICAgICAgICAgICAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgbm92YWxpZGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtaWNvbi1hZGRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwic2VhcmNoXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cInt7J1VwRGV2cy5IZWFkZXIuU2VhcmNoJyB8IHRyYW5zbG9jb319Li4uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==