@bnsights/bbsf-controls 1.0.109 → 1.0.111
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 +8 -0
- package/{esm2020 → esm2022}/bnsights-bbsf-controls.mjs +4 -4
- package/esm2022/bnsights-test-test-controls.mjs +5 -0
- package/{esm2020 → esm2022}/lib/Shared/Components/app-base-component.mjs +226 -226
- package/{esm2020 → esm2022}/lib/Shared/Components/ng-tag-input.mjs +176 -176
- package/{esm2020 → esm2022}/lib/Shared/Directives/template-name.directive.mjs +18 -18
- package/{esm2020 → esm2022}/lib/Shared/Enums/CalendarView.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Enums/ControlLayout.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Countries.mjs +246 -246
- package/{esm2020 → esm2022}/lib/Shared/Enums/Enums.mjs +32 -32
- package/{esm2020 → esm2022}/lib/Shared/Enums/FileType.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Enums/FilterType.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Enums/FontSize.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/ForceDirection.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/IconPosition.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/ImageType.mjs +9 -9
- package/{esm2020 → esm2022}/lib/Shared/Enums/InputType.mjs +9 -9
- package/{esm2020 → esm2022}/lib/Shared/Enums/Insert.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageMode.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageValidation.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Misc.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/PagingActionMode.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Para.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Enums/PickerType.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/SelectMode.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/StartView.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/Style.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Enums/StyleConfirmationMode.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/TagInputView.mjs +6 -6
- package/esm2022/lib/Shared/Enums/map-enums.mjs +7 -0
- package/{esm2020 → esm2022}/lib/Shared/Enums/menu-list-enum.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/Attribute.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteDTO.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteOptions.mjs +23 -23
- package/{esm2020 → esm2022}/lib/Shared/Models/CalendarEventDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/CalendarOptions.mjs +18 -18
- package/{esm2020 → esm2022}/lib/Shared/Models/CancelDTO.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/CaptchaStyle.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/CheckBoxOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/ConfirmationModalOptions.mjs +38 -38
- package/{esm2020 → esm2022}/lib/Shared/Models/ControlOptionsBase.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/CustomValidation.mjs +13 -13
- package/{esm2020 → esm2022}/lib/Shared/Models/DropdownListItem.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/DropdownOptions.mjs +15 -15
- package/{esm2020 → esm2022}/lib/Shared/Models/EditPersonalImage.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/EnglishArabicDTO.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/FileDTO.mjs +1 -1
- package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadModel.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/FilterItem.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/FormOptions.mjs +27 -27
- package/{esm2020 → esm2022}/lib/Shared/Models/HtmlEditorOptions.mjs +11 -11
- package/{esm2020 → esm2022}/lib/Shared/Models/ImageUploadOptions.mjs +13 -13
- package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +10 -0
- package/{esm2020 → esm2022}/lib/Shared/Models/MapAutocompleteDTO.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualControlOptionsBase.mjs +15 -15
- package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualTextBoxOptions.mjs +13 -13
- package/{esm2020 → esm2022}/lib/Shared/Models/MultipleFileUploadModel.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingDTO.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingOptions.mjs +46 -46
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingPayload.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/PhoneOptions.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/ProfileImageUploadOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/ProfilePictureDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonItem.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonOptions.mjs +3 -3
- package/{esm2020 → esm2022}/lib/Shared/Models/RangeNumber.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/Recaptcha.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/RecaptchaOptions.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterField.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterOptions.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/SaveDTO.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputOptions.mjs +40 -40
- package/{esm2020 → esm2022}/lib/Shared/Models/TextAreaOptions.mjs +3 -3
- package/{esm2020 → esm2022}/lib/Shared/Models/TextBoxOptions.mjs +22 -22
- package/{esm2020 → esm2022}/lib/Shared/Models/ToggleslideOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/UploadPersonalImage.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/bread-crumb.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/control-filter-Item.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/datePickerOptions.mjs +22 -22
- package/{esm2020 → esm2022}/lib/Shared/Models/filter-options.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/page-header-options.mjs +77 -77
- package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/config/environment.mjs +11 -11
- package/{esm2020 → esm2022}/lib/Shared/default_intl.mjs +29 -29
- package/{esm2020 → esm2022}/lib/Shared/services/ControlUtility.mjs +162 -162
- package/{esm2020 → esm2022}/lib/Shared/services/GlobalSettings.service.mjs +30 -30
- package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
- package/{esm2020 → esm2022}/lib/Shared/services/render-component-service.service.mjs +30 -30
- package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +170 -0
- package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +262 -0
- package/esm2022/lib/controls/Calendar/Calendar.component.mjs +173 -0
- package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +117 -0
- package/{esm2020 → esm2022}/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -136
- package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +223 -0
- package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +193 -0
- package/esm2022/lib/controls/FileUplaod/FileUplaod.component.mjs +447 -0
- package/{esm2020 → esm2022}/lib/controls/Form/Form.component.mjs +101 -101
- package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +226 -0
- package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +350 -0
- package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +404 -0
- package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +427 -0
- package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +429 -0
- package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +428 -0
- package/{esm2020 → esm2022}/lib/controls/Paging/JwPagination.component.mjs +121 -121
- package/{esm2020 → esm2022}/lib/controls/Paging/Paging.component.mjs +312 -312
- package/esm2022/lib/controls/Phone/Phone.component.mjs +129 -0
- package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +376 -0
- package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +109 -0
- package/{esm2020 → esm2022}/lib/controls/Recaptcha/Recaptcha.component.mjs +135 -135
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater/repeater.component.mjs +125 -125
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -750
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -21
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -108
- package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +277 -0
- package/esm2022/lib/controls/TextArea/TextArea.component.mjs +196 -0
- package/esm2022/lib/controls/TextBox/TextBox.component.mjs +306 -0
- package/esm2022/lib/controls/Toggleslide/toggleslide.component.mjs +90 -0
- package/esm2022/lib/controls/bbsf-controls.module.mjs +339 -0
- package/{esm2020 → esm2022}/lib/controls/page-header-component/page-header-component.component.mjs +37 -37
- package/{esm2020 → esm2022}/public-api.mjs +128 -130
- package/{fesm2020 → fesm2022}/bnsights-bbsf-controls.mjs +8802 -8736
- package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -0
- package/{fesm2015/bnsights-bbsf-controls.mjs → fesm2022/bnsights-test-test-controls.mjs} +8803 -8798
- package/fesm2022/bnsights-test-test-controls.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/Shared/Components/app-base-component.d.ts +58 -58
- package/lib/Shared/Components/ng-tag-input.d.ts +50 -50
- package/lib/Shared/Directives/template-name.directive.d.ts +9 -9
- package/lib/Shared/Enums/CalendarView.d.ts +6 -6
- package/lib/Shared/Enums/ControlLayout.d.ts +4 -4
- package/lib/Shared/Enums/Countries.d.ts +245 -245
- package/lib/Shared/Enums/Enums.d.ts +30 -30
- package/lib/Shared/Enums/FileType.d.ts +20 -20
- package/lib/Shared/Enums/FilterType.d.ts +9 -9
- package/lib/Shared/Enums/FontSize.d.ts +5 -5
- package/lib/Shared/Enums/ForceDirection.d.ts +4 -4
- package/lib/Shared/Enums/IconPosition.d.ts +4 -4
- package/lib/Shared/Enums/ImageType.d.ts +8 -8
- package/lib/Shared/Enums/InputType.d.ts +8 -8
- package/lib/Shared/Enums/Insert.d.ts +7 -7
- package/lib/Shared/Enums/LanguageMode.d.ts +9 -9
- package/lib/Shared/Enums/LanguageValidation.d.ts +4 -4
- package/lib/Shared/Enums/Misc.d.ts +5 -5
- package/lib/Shared/Enums/PagingActionMode.d.ts +4 -4
- package/lib/Shared/Enums/Para.d.ts +7 -7
- package/lib/Shared/Enums/PickerType.d.ts +5 -5
- package/lib/Shared/Enums/SelectMode.d.ts +4 -4
- package/lib/Shared/Enums/StartView.d.ts +5 -5
- package/lib/Shared/Enums/Style.d.ts +6 -6
- package/lib/Shared/Enums/StyleConfirmationMode.d.ts +5 -5
- package/lib/Shared/Enums/TagInputView.d.ts +5 -5
- package/lib/Shared/Enums/map-enums.d.ts +5 -0
- package/lib/Shared/Enums/menu-list-enum.d.ts +4 -4
- package/lib/Shared/Models/Attribute.d.ts +4 -4
- package/lib/Shared/Models/AutocompleteDTO.d.ts +5 -5
- package/lib/Shared/Models/AutocompleteOptions.d.ts +40 -40
- package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -8
- package/lib/Shared/Models/CalendarOptions.d.ts +23 -23
- package/lib/Shared/Models/CancelDTO.d.ts +5 -5
- package/lib/Shared/Models/CaptchaStyle.d.ts +7 -7
- package/lib/Shared/Models/CheckBoxOptions.d.ts +7 -7
- package/lib/Shared/Models/ConfirmationModalOptions.d.ts +21 -21
- package/lib/Shared/Models/ControlOptionsBase.d.ts +44 -44
- package/lib/Shared/Models/CustomValidation.d.ts +10 -10
- package/lib/Shared/Models/DropdownListItem.d.ts +4 -4
- package/lib/Shared/Models/DropdownOptions.d.ts +33 -33
- package/lib/Shared/Models/EditPersonalImage.d.ts +5 -5
- package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -4
- package/lib/Shared/Models/FileDTO.d.ts +19 -19
- package/lib/Shared/Models/FileUploadModel.d.ts +4 -4
- package/lib/Shared/Models/FileUploadOptions.d.ts +19 -19
- package/lib/Shared/Models/FilterItem.d.ts +13 -13
- package/lib/Shared/Models/FormOptions.d.ts +16 -16
- package/lib/Shared/Models/HtmlEditorOptions.d.ts +31 -31
- package/lib/Shared/Models/ImageUploadOptions.d.ts +23 -23
- package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +8 -6
- package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -7
- package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +22 -22
- package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +12 -12
- package/lib/Shared/Models/MultilingualControlOptionsBase.d.ts +77 -77
- package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +12 -12
- package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -7
- package/lib/Shared/Models/PagingDTO.d.ts +11 -11
- package/lib/Shared/Models/PagingOptions.d.ts +56 -56
- package/lib/Shared/Models/PagingPayload.d.ts +5 -5
- package/lib/Shared/Models/PhoneOptions.d.ts +21 -21
- package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +28 -28
- package/lib/Shared/Models/ProfilePictureDTO.d.ts +13 -13
- package/lib/Shared/Models/RadioButtonItem.d.ts +4 -4
- package/lib/Shared/Models/RadioButtonOptions.d.ts +8 -8
- package/lib/Shared/Models/RangeNumber.d.ts +4 -4
- package/lib/Shared/Models/Recaptcha.d.ts +6 -6
- package/lib/Shared/Models/RecaptchaOptions.d.ts +18 -18
- package/lib/Shared/Models/RepeaterField.d.ts +7 -7
- package/lib/Shared/Models/RepeaterOptions.d.ts +19 -19
- package/lib/Shared/Models/SaveDTO.d.ts +5 -5
- package/lib/Shared/Models/TagsInputDTO.d.ts +6 -6
- package/lib/Shared/Models/TagsInputOptions.d.ts +57 -57
- package/lib/Shared/Models/TextAreaOptions.d.ts +23 -23
- package/lib/Shared/Models/TextBoxOptions.d.ts +37 -37
- package/lib/Shared/Models/ToggleslideOptions.d.ts +9 -9
- package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -5
- package/lib/Shared/Models/bread-crumb.d.ts +6 -6
- package/lib/Shared/Models/control-filter-Item.d.ts +6 -6
- package/lib/Shared/Models/datePickerOptions.d.ts +29 -29
- package/lib/Shared/Models/filter-options.d.ts +7 -7
- package/lib/Shared/Models/page-header-options.d.ts +71 -71
- package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +10 -10
- package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +10 -10
- package/lib/Shared/config/environment.d.ts +1 -1
- package/lib/Shared/default_intl.d.ts +21 -21
- package/lib/Shared/services/ControlUtility.d.ts +32 -32
- package/lib/Shared/services/GlobalSettings.service.d.ts +17 -17
- package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +10 -10
- package/lib/Shared/services/render-component-service.service.d.ts +10 -10
- package/lib/Shared/services/validationErrorMassage.service.d.ts +14 -14
- package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +59 -59
- package/lib/controls/Calendar/Calendar.component.d.ts +42 -42
- package/lib/controls/CheckBox/CheckBox.component.d.ts +37 -37
- package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +29 -29
- package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +61 -61
- package/lib/controls/DropdownList/DropdownList.component.d.ts +55 -55
- package/lib/controls/FileUplaod/FileUplaod.component.d.ts +58 -58
- package/lib/controls/Form/Form.component.d.ts +28 -28
- package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +49 -49
- package/lib/controls/ImageUpload/ImageUpload.component.d.ts +70 -70
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +70 -54
- package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +65 -65
- package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +74 -74
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +73 -73
- package/lib/controls/Paging/JwPagination.component.d.ts +27 -27
- package/lib/controls/Paging/Paging.component.d.ts +57 -57
- package/lib/controls/Phone/Phone.component.d.ts +43 -43
- package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +69 -69
- package/lib/controls/RadioButton/RadioButton.component.d.ts +37 -37
- package/lib/controls/Recaptcha/Recaptcha.component.d.ts +41 -41
- package/lib/controls/Repeater/repeater/repeater.component.d.ts +29 -29
- package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +23 -23
- package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +11 -11
- package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +19 -19
- package/lib/controls/TagsInput/TagsInput.component.d.ts +58 -58
- package/lib/controls/TextArea/TextArea.component.d.ts +51 -51
- package/lib/controls/TextBox/TextBox.component.d.ts +66 -66
- package/lib/controls/Toggleslide/toggleslide.component.d.ts +33 -33
- package/lib/controls/bbsf-controls.module.d.ts +70 -77
- package/lib/controls/page-header-component/page-header-component.component.d.ts +20 -20
- package/package.json +54 -63
- package/public-api.d.ts +118 -117
- package/src/lib/assets/Style-rtl.scss +46 -28
- package/src/lib/assets/Style.scss +4 -4
- package/src/lib/assets/images/marker-pin.svg +4 -0
- package/src/lib/assets/sass/base.scss +73 -21
- package/esm2020/lib/Shared/Models/MapAutoCompleteOptions.mjs +0 -4
- package/esm2020/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
- package/esm2020/lib/Shared/services/validationErrorMassage.service.mjs +0 -170
- package/esm2020/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -262
- package/esm2020/lib/controls/Calendar/Calendar.component.mjs +0 -173
- package/esm2020/lib/controls/CheckBox/CheckBox.component.mjs +0 -117
- package/esm2020/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -223
- package/esm2020/lib/controls/DropdownList/DropdownList.component.mjs +0 -194
- package/esm2020/lib/controls/FileUplaod/FileUplaod.component.mjs +0 -447
- package/esm2020/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -226
- package/esm2020/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -350
- package/esm2020/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -325
- package/esm2020/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -427
- package/esm2020/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -429
- package/esm2020/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -428
- package/esm2020/lib/controls/Phone/Phone.component.mjs +0 -129
- package/esm2020/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -376
- package/esm2020/lib/controls/RadioButton/RadioButton.component.mjs +0 -109
- package/esm2020/lib/controls/TagsInput/TagsInput.component.mjs +0 -277
- package/esm2020/lib/controls/TextArea/TextArea.component.mjs +0 -196
- package/esm2020/lib/controls/TextBox/TextBox.component.mjs +0 -312
- package/esm2020/lib/controls/Toggleslide/toggleslide.component.mjs +0 -90
- package/esm2020/lib/controls/bbsf-controls.module.mjs +0 -361
- package/fesm2015/bnsights-bbsf-controls.mjs.map +0 -1
- package/fesm2020/bnsights-bbsf-controls.mjs.map +0 -1
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Optional, ViewChild, Output, EventEmitter, } from '@angular/core';
|
|
2
|
-
import { FormControl, Validators, } from '@angular/forms';
|
|
3
|
-
import { FileUploader, FileLikeObject } from 'ng2-file-upload';
|
|
4
|
-
import { ProfilePictureDTO } from '../../Shared/Models/ProfilePictureDTO';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../Shared/services/ControlUtility";
|
|
7
|
-
import * as i2 from "@angular/forms";
|
|
8
|
-
import * as i3 from "@bnsights/bbsf-utilities";
|
|
9
|
-
import * as i4 from "../../Shared/services/GlobalSettings.service";
|
|
10
|
-
import * as i5 from "@angular/common";
|
|
11
|
-
import * as i6 from "angular-cropperjs";
|
|
12
|
-
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
13
|
-
import * as i8 from "ngx-dropzone";
|
|
14
|
-
import * as i9 from "ngx-intl-tel-input";
|
|
15
|
-
export class ProfileImageUploaderComponent {
|
|
16
|
-
constructor(zone, controlUtility, controlContainer, ProfileImageUploaderControlHost, UtilityService, controlValidationService, globalSettings) {
|
|
17
|
-
this.zone = zone;
|
|
18
|
-
this.controlUtility = controlUtility;
|
|
19
|
-
this.controlContainer = controlContainer;
|
|
20
|
-
this.ProfileImageUploaderControlHost = ProfileImageUploaderControlHost;
|
|
21
|
-
this.UtilityService = UtilityService;
|
|
22
|
-
this.controlValidationService = controlValidationService;
|
|
23
|
-
this.globalSettings = globalSettings;
|
|
24
|
-
this.files = [];
|
|
25
|
-
this.ImageSource = './src/assets/images/user.svg';
|
|
26
|
-
this.OnChange = new EventEmitter();
|
|
27
|
-
this.ValidationMessage = '';
|
|
28
|
-
this.AcceptedType = '';
|
|
29
|
-
this.AcceptedTypeArray = [];
|
|
30
|
-
this.ToolTipTypeArray = [];
|
|
31
|
-
this.markAllAsTouched = false;
|
|
32
|
-
this.imgUrl = null;
|
|
33
|
-
this.config = null;
|
|
34
|
-
this.imageUrl = '';
|
|
35
|
-
this.imgwUrl = '';
|
|
36
|
-
this.mdlSampleIsOpen = false;
|
|
37
|
-
this.validationRules = [];
|
|
38
|
-
this.validationRulesasync = [];
|
|
39
|
-
this.resetError = () => {
|
|
40
|
-
this.controlValidationService.removeGlobalError();
|
|
41
|
-
};
|
|
42
|
-
//External Method
|
|
43
|
-
this.RemoveRequiredValidation = () => {
|
|
44
|
-
this.controlUtility.RemoveRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
|
|
45
|
-
};
|
|
46
|
-
//External Method
|
|
47
|
-
this.AddRequiredValidation = () => {
|
|
48
|
-
this.controlUtility.AddRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
|
|
49
|
-
};
|
|
50
|
-
//External Method
|
|
51
|
-
this.RemoveCustomValidation = (CustomValidation) => {
|
|
52
|
-
this.controlUtility.RemoveCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
|
|
53
|
-
};
|
|
54
|
-
//External Method
|
|
55
|
-
this.AddCustomValidation = (CustomValidation) => {
|
|
56
|
-
this.controlUtility.AddCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
|
|
57
|
-
};
|
|
58
|
-
//External Method
|
|
59
|
-
this.IsValid = () => {
|
|
60
|
-
this.controlUtility.IsValid(this.ProfileImageUploadFormControl);
|
|
61
|
-
};
|
|
62
|
-
ProfileImageUploaderComponent.controlContainerstatic =
|
|
63
|
-
this.controlContainer;
|
|
64
|
-
this.uploader = new FileUploader({
|
|
65
|
-
disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
|
|
66
|
-
});
|
|
67
|
-
this.hasAnotherDropZoneOver = false;
|
|
68
|
-
this.ProfilePictureDTO = new ProfilePictureDTO();
|
|
69
|
-
}
|
|
70
|
-
ngOnInit() {
|
|
71
|
-
this.controlValidationService.isCreatedBefor = false;
|
|
72
|
-
if (!this.options.ViewType)
|
|
73
|
-
this.options.ViewType = this.globalSettings.ViewType;
|
|
74
|
-
if (this.options.DefaultImageSrc != null &&
|
|
75
|
-
this.options.DefaultImageSrc != '')
|
|
76
|
-
this.ImageSource = this.options.DefaultImageSrc;
|
|
77
|
-
this.config = {
|
|
78
|
-
aspectRatio: 200 / 200,
|
|
79
|
-
dragMode: 'move',
|
|
80
|
-
background: true,
|
|
81
|
-
movable: true,
|
|
82
|
-
rotatable: true,
|
|
83
|
-
scalable: true,
|
|
84
|
-
zoomable: true,
|
|
85
|
-
viewMode: 1,
|
|
86
|
-
checkImageOrigin: true,
|
|
87
|
-
modal: true,
|
|
88
|
-
checkCrossOrigin: false,
|
|
89
|
-
cropBoxResizable: false,
|
|
90
|
-
autoCrop: true,
|
|
91
|
-
};
|
|
92
|
-
if (this.options.ImageUploadAcceptsTypes != null) {
|
|
93
|
-
this.options.ImageUploadAcceptsTypes;
|
|
94
|
-
}
|
|
95
|
-
if (this.options.Value != null) {
|
|
96
|
-
let imgURL = this.options.Value['fileURL'];
|
|
97
|
-
if (imgURL != '' && imgURL != undefined && imgURL != null)
|
|
98
|
-
this.ImageSource = imgURL;
|
|
99
|
-
let element = this.options.Value;
|
|
100
|
-
this.FileLikeObject = new FileLikeObject({
|
|
101
|
-
name: element.FileName,
|
|
102
|
-
});
|
|
103
|
-
this.uploader.addToQueue([this.FileLikeObject]);
|
|
104
|
-
}
|
|
105
|
-
if (this.options.LabelKey != null && this.options.LabelKey != '')
|
|
106
|
-
this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
|
|
107
|
-
if (this.options.ImageUploadAcceptsTypes != null &&
|
|
108
|
-
this.options.ImageUploadAcceptsTypes.length > 0) {
|
|
109
|
-
for (let index = 0; index < this.options.ImageUploadAcceptsTypes.length; index++) {
|
|
110
|
-
const Type = this.options.ImageUploadAcceptsTypes[index];
|
|
111
|
-
this.AcceptedType =
|
|
112
|
-
this.AcceptedType.toUpperCase() + Type.toUpperCase();
|
|
113
|
-
}
|
|
114
|
-
this.AcceptedTypeArray = this.AcceptedType.split(',');
|
|
115
|
-
for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
|
|
116
|
-
const element = this.AcceptedTypeArray[index];
|
|
117
|
-
const TypeToolTipe = element.split('/')[1];
|
|
118
|
-
this.ToolTipTypeArray.push(TypeToolTipe.toUpperCase());
|
|
119
|
-
}
|
|
120
|
-
this.ValidationMessage =
|
|
121
|
-
this.ValidationMessage +
|
|
122
|
-
this.UtilityService.getResourceValue('AllowedTypes') +
|
|
123
|
-
` (${this.ToolTipTypeArray}) `;
|
|
124
|
-
}
|
|
125
|
-
if (this.options.FileMaxSizeInMB > 0) {
|
|
126
|
-
this.ValidationMessage =
|
|
127
|
-
this.ValidationMessage +
|
|
128
|
-
` <br /> ${this.UtilityService.getResourceValue('FileMaxSizeInMB')} ${this.options.FileMaxSizeInMB}`;
|
|
129
|
-
}
|
|
130
|
-
if (this.options.ImageUploadAcceptsTypes != null &&
|
|
131
|
-
this.options.ImageUploadAcceptsTypes.length > 0) {
|
|
132
|
-
}
|
|
133
|
-
this.group.addControl(this.options.Name, new FormControl(''));
|
|
134
|
-
this.ProfileImageUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
|
|
135
|
-
if (this.options.CustomValidation.length > 0) {
|
|
136
|
-
let Validations = this.options.CustomValidation;
|
|
137
|
-
for (let index = 0; index < Validations.length; index++) {
|
|
138
|
-
const Validation = Validations[index];
|
|
139
|
-
this.validationRules.push(Validation.functionBody);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (this.options.IsRequired) {
|
|
143
|
-
this.validationRules.push(Validators.required);
|
|
144
|
-
}
|
|
145
|
-
this.ProfileImageUploadFormControl.setValidators(this.validationRules);
|
|
146
|
-
this.ProfileImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
|
|
147
|
-
if (this.options.IsDisabled) {
|
|
148
|
-
this.ProfileImageUploadFormControl.disable();
|
|
149
|
-
}
|
|
150
|
-
this.ProfileImageUploaderControlHost.ngSubmit.subscribe((value) => {
|
|
151
|
-
this.group.markAllAsTouched();
|
|
152
|
-
this.markAllAsTouched = true;
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
ngAfterViewInit() {
|
|
156
|
-
if (this.options.AttributeList != null) {
|
|
157
|
-
var element = document.getElementById(this.options.Name);
|
|
158
|
-
for (let index = 0; index < this.options.AttributeList.length; index++) {
|
|
159
|
-
element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
showImageUploader(element) {
|
|
164
|
-
let input = element.parentElement.parentElement.querySelector('input[type=file]');
|
|
165
|
-
input.click();
|
|
166
|
-
}
|
|
167
|
-
showGlobalError() {
|
|
168
|
-
this.controlUtility.showGlobalError();
|
|
169
|
-
}
|
|
170
|
-
getErrorValidation(ErrorList) {
|
|
171
|
-
if (this.markAllAsTouched && this.group.invalid) {
|
|
172
|
-
this.showGlobalError();
|
|
173
|
-
this.markAllAsTouched = false;
|
|
174
|
-
}
|
|
175
|
-
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
176
|
-
}
|
|
177
|
-
onFileChange(event) {
|
|
178
|
-
if (event.rejectedFiles.length > 0) {
|
|
179
|
-
const file = event.rejectedFiles[0];
|
|
180
|
-
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
181
|
-
const fileType = file.type;
|
|
182
|
-
if (file.size > maxFileSize) {
|
|
183
|
-
const formControl = this.ProfileImageUploadFormControl;
|
|
184
|
-
formControl.setErrors({
|
|
185
|
-
FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
|
|
186
|
-
});
|
|
187
|
-
formControl.markAsTouched();
|
|
188
|
-
this.uploader.queue = [];
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (this.options.ImageUploadAcceptsTypes != null &&
|
|
192
|
-
this.options.ImageUploadAcceptsTypes.length > 0 &&
|
|
193
|
-
!(this.AcceptedTypeArray.includes(fileType.toUpperCase()) ||
|
|
194
|
-
this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
|
|
195
|
-
const formControl = this.ProfileImageUploadFormControl;
|
|
196
|
-
formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
|
|
197
|
-
formControl.markAsTouched();
|
|
198
|
-
this.uploader.queue = [];
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
let FilesArray = [];
|
|
203
|
-
for (let index = 0; index < event.addedFiles.length; index++) {
|
|
204
|
-
const file = event.addedFiles[0];
|
|
205
|
-
this.EventFile = file;
|
|
206
|
-
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
207
|
-
if (file) {
|
|
208
|
-
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
209
|
-
const fileType = file.type;
|
|
210
|
-
if (file.size > maxFileSize) {
|
|
211
|
-
const formControl = this.ProfileImageUploadFormControl;
|
|
212
|
-
formControl.setErrors({
|
|
213
|
-
FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
|
|
214
|
-
});
|
|
215
|
-
formControl.markAsTouched();
|
|
216
|
-
this.uploader.queue = [];
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
let reader = new FileReader();
|
|
220
|
-
let FileObject = file;
|
|
221
|
-
reader.readAsDataURL(FileObject);
|
|
222
|
-
reader.onload = () => {
|
|
223
|
-
this.imageUrl = reader.result.toString();
|
|
224
|
-
this.openModal(true);
|
|
225
|
-
let originalValue = this.group.get(this.options.Name).value;
|
|
226
|
-
if (this.options.PatchFunction &&
|
|
227
|
-
this.options.PatchPath &&
|
|
228
|
-
this.group.get(this.options.Name).valid) {
|
|
229
|
-
this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
|
|
230
|
-
}
|
|
231
|
-
//Use this line to enable two way binding.
|
|
232
|
-
this.options.Value = originalValue;
|
|
233
|
-
this.OnChange.emit(originalValue);
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
removeFromControlValue(event) {
|
|
239
|
-
let ItemList = this.group.get(this.options.Name).value;
|
|
240
|
-
this.files.splice(this.files.indexOf(event), 1);
|
|
241
|
-
ItemList = [];
|
|
242
|
-
if (this.files.length == 0 && this.options.IsRequired) {
|
|
243
|
-
this.ProfileImageUploadFormControl.markAsTouched();
|
|
244
|
-
this.ProfileImageUploadFormControl.setErrors(Validators.required);
|
|
245
|
-
this.ProfileImageUploadFormControl.invalid;
|
|
246
|
-
}
|
|
247
|
-
this.group.get(this.options.Name).setValue(ItemList);
|
|
248
|
-
this.OnChange.emit(this.group.get(this.options.Name).value);
|
|
249
|
-
this.options.Value = this.group.get(this.options.Name).value;
|
|
250
|
-
}
|
|
251
|
-
cropImage() {
|
|
252
|
-
this.ProfilePictureDTO.FileName = this.EventFile.name;
|
|
253
|
-
let Cropper = this.angularCropper.cropper;
|
|
254
|
-
let profilePicturCropper = Cropper.getCroppedCanvas({
|
|
255
|
-
width: 400,
|
|
256
|
-
height: 400,
|
|
257
|
-
imageSmoothingEnabled: false,
|
|
258
|
-
imageSmoothingQuality: 'high',
|
|
259
|
-
});
|
|
260
|
-
let AvatarPictureCropper = Cropper.getCroppedCanvas({
|
|
261
|
-
width: 100,
|
|
262
|
-
height: 100,
|
|
263
|
-
imageSmoothingEnabled: false,
|
|
264
|
-
imageSmoothingQuality: 'high',
|
|
265
|
-
});
|
|
266
|
-
let OriginalPictureCropper = Cropper.getCroppedCanvas({
|
|
267
|
-
width: 700,
|
|
268
|
-
height: 700,
|
|
269
|
-
imageSmoothingEnabled: false,
|
|
270
|
-
imageSmoothingQuality: 'high',
|
|
271
|
-
});
|
|
272
|
-
profilePicturCropper.toBlob((blob) => {
|
|
273
|
-
this.zone.run(() => {
|
|
274
|
-
this.getProfileImageBlobFile(blob, 'profilePicturCropper');
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
AvatarPictureCropper.toBlob((blob) => {
|
|
278
|
-
this.zone.run(() => {
|
|
279
|
-
this.getProfileImageBlobFile(blob, 'AvatarPictureCropper');
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
OriginalPictureCropper.toBlob((blob) => {
|
|
283
|
-
this.zone.run(() => {
|
|
284
|
-
this.getProfileImageBlobFile(blob, 'OriginalPictureCropper');
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
this.files = [];
|
|
288
|
-
this.openModal(false);
|
|
289
|
-
}
|
|
290
|
-
getProfileImageBlobFile(blob, type) {
|
|
291
|
-
let FilesArray = [];
|
|
292
|
-
let BlobFile;
|
|
293
|
-
let reader = new FileReader();
|
|
294
|
-
BlobFile = blob;
|
|
295
|
-
reader.readAsDataURL(BlobFile);
|
|
296
|
-
reader.onload = () => {
|
|
297
|
-
let FileObject;
|
|
298
|
-
switch (type) {
|
|
299
|
-
case 'profilePicturCropper':
|
|
300
|
-
BlobFile.name = this.EventFile.name + 'MediumPicture';
|
|
301
|
-
FileObject = {
|
|
302
|
-
FileName: this.EventFile.name + 'MediumPicture',
|
|
303
|
-
FileType: this.EventFile.type,
|
|
304
|
-
FileBase64: reader.result.toString().split(',')[1],
|
|
305
|
-
FileSizeInMB: BlobFile.size / 1000 / 1000,
|
|
306
|
-
};
|
|
307
|
-
this.ProfilePictureDTO.profilePicture = FileObject;
|
|
308
|
-
this.ProfilePictureDTO.MediumPicture =
|
|
309
|
-
FileObject.FileName + ',' + FileObject.FileBase64;
|
|
310
|
-
this.files.push(BlobFile);
|
|
311
|
-
break;
|
|
312
|
-
case 'AvatarPictureCropper':
|
|
313
|
-
FileObject = {
|
|
314
|
-
FileName: this.EventFile.name + 'SmallPicture',
|
|
315
|
-
FileType: this.EventFile.type,
|
|
316
|
-
FileBase64: reader.result.toString().split(',')[1],
|
|
317
|
-
FileSizeInMB: BlobFile.size / 1000 / 1000,
|
|
318
|
-
};
|
|
319
|
-
this.ProfilePictureDTO.AvatarPicture = FileObject;
|
|
320
|
-
this.ProfilePictureDTO.SmallPicture =
|
|
321
|
-
FileObject.FileName + ',' + FileObject.FileBase64;
|
|
322
|
-
break;
|
|
323
|
-
case 'OriginalPictureCropper':
|
|
324
|
-
FileObject = {
|
|
325
|
-
FileName: this.EventFile.name + 'Original',
|
|
326
|
-
FileType: this.EventFile.type,
|
|
327
|
-
FileBase64: reader.result.toString().split(',')[1],
|
|
328
|
-
FileSizeInMB: BlobFile.size / 1000 / 1000,
|
|
329
|
-
};
|
|
330
|
-
this.ProfilePictureDTO.OriginalPicture = FileObject;
|
|
331
|
-
this.ProfilePictureDTO.Original =
|
|
332
|
-
FileObject.FileName + ',' + FileObject.FileBase64;
|
|
333
|
-
this.group.get(this.options.Name).setValue(this.ProfilePictureDTO);
|
|
334
|
-
this.OnChange.emit(this.group.get(this.options.Name).value);
|
|
335
|
-
break;
|
|
336
|
-
default:
|
|
337
|
-
break;
|
|
338
|
-
}
|
|
339
|
-
this.options.Value = this.ProfilePictureDTO;
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
rotateImage(degree) {
|
|
343
|
-
this.angularCropper.cropper.rotate(degree);
|
|
344
|
-
}
|
|
345
|
-
moveImage(offsetX, offsetY) {
|
|
346
|
-
this.angularCropper.cropper.move(offsetX, offsetY);
|
|
347
|
-
}
|
|
348
|
-
zoomImage(ratio) {
|
|
349
|
-
this.angularCropper.cropper.zoom(ratio);
|
|
350
|
-
}
|
|
351
|
-
openModal(open) {
|
|
352
|
-
this.mdlSampleIsOpen = open;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
ProfileImageUploaderComponent.controlContainerstatic = null;
|
|
356
|
-
ProfileImageUploaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProfileImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component });
|
|
357
|
-
ProfileImageUploaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ProfileImageUploaderComponent, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\" d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\" fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element >\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.CropperComponent, selector: "angular-cropper", inputs: ["cropperOptions", "imageUrl", "settings", "cropbox", "loadImageErrorText"], outputs: ["export", "ready"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] });
|
|
358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProfileImageUploaderComponent, decorators: [{
|
|
359
|
-
type: Component,
|
|
360
|
-
args: [{ selector: 'BBSF-ProfileImageUploader', template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\" d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\" fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element >\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n" }]
|
|
361
|
-
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
|
|
362
|
-
type: Optional
|
|
363
|
-
}] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }]; }, propDecorators: { fileInput: [{
|
|
364
|
-
type: ViewChild,
|
|
365
|
-
args: ['fileInput', { static: false }]
|
|
366
|
-
}], group: [{
|
|
367
|
-
type: Input
|
|
368
|
-
}], options: [{
|
|
369
|
-
type: Input
|
|
370
|
-
}], OnChange: [{
|
|
371
|
-
type: Output
|
|
372
|
-
}], angularCropper: [{
|
|
373
|
-
type: ViewChild,
|
|
374
|
-
args: ['angularCropper', { static: false }]
|
|
375
|
-
}] } });
|
|
376
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZmlsZUltYWdlVXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1Byb2ZpbGVJbWFnZVVwbG9hZGVyL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9Qcm9maWxlSW1hZ2VVcGxvYWRlci9Qcm9maWxlSW1hZ2VVcGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFDWCxVQUFVLEdBS1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7OztBQVkxRSxNQUFNLE9BQU8sNkJBQTZCO0lBaUN4QyxZQUNVLElBQVksRUFDWixjQUE4QixFQUNsQixnQkFBa0MsRUFDL0MsK0JBQW1ELEVBQ25ELGNBQThCLEVBQzdCLHdCQUFrRCxFQUNsRCxjQUE4QjtRQU45QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msb0NBQStCLEdBQS9CLCtCQUErQixDQUFvQjtRQUNuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxtQkFBYyxHQUFkLGNB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LENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFhO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7O0FBNVlNLG9EQUFzQixHQUFHLElBQUksQ0FBQzsySEFEMUIsNkJBQTZCOytHQUE3Qiw2QkFBNkIsK1ZDcEMxQyx1dVFBc0pBOzRGRGxIYSw2QkFBNkI7a0JBSnpDLFNBQVM7K0JBQ0UsMkJBQTJCOzswQkF1Q2xDLFFBQVE7OEtBakNnQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSWhDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFjQSxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBOZ1pvbmUsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQ29udHJvbCxcclxuICBWYWxpZGF0b3JzLFxyXG4gIEZvcm1Hcm91cCxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQ29udHJvbENvbnRhaW5lcixcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciwgRmlsZUxpa2VPYmplY3QgfSBmcm9tICduZzItZmlsZS11cGxvYWQnO1xyXG5pbXBvcnQgeyBGaWxlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlRFRPJztcclxuaW1wb3J0IHsgQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItY3JvcHBlcmpzJztcclxuaW1wb3J0IHsgUHJvZmlsZUltYWdlVXBsb2FkT3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvUHJvZmlsZUltYWdlVXBsb2FkT3B0aW9ucyc7XHJcbmltcG9ydCB7IFByb2ZpbGVQaWN0dXJlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9Qcm9maWxlUGljdHVyZURUTyc7XHJcbmltcG9ydCB7XHJcbiAgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gIFV0aWxpdHlTZXJ2aWNlLFxyXG59IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IEdsb2JhbFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0dsb2JhbFNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtUHJvZmlsZUltYWdlVXBsb2FkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9Qcm9maWxlSW1hZ2VVcGxvYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmlsZUlucHV0OiBFbGVtZW50UmVmO1xyXG4gIGZpbGVzOiBGaWxlW10gPSBbXTtcclxuICBJbWFnZVNvdXJjZTogc3RyaW5nID0gJy4vc3JjL2Fzc2V0cy9pbWFnZXMvdXNlci5zdmcnO1xyXG4gIGlzU3VibWl0dGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogUHJvZmlsZUltYWdlVXBsb2FkT3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xyXG4gIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XHJcbiAgaGFzQW5vdGhlckRyb3Bab25lT3ZlcjogYm9vbGVhbjtcclxuICBBY2NlcHRlZFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIEFjY2VwdGVkVHlwZUFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIFRvb2xUaXBUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgRmlsZUxpa2VPYmplY3Q6IEZpbGVMaWtlT2JqZWN0O1xyXG4gIFByb2ZpbGVQaWN0dXJlRFRPOiBQcm9maWxlUGljdHVyZURUTztcclxuICBjb250cm9sOiBGb3JtQ29udHJvbDtcclxuICBtYXJrQWxsQXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2FuZ3VsYXJDcm9wcGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIGFuZ3VsYXJDcm9wcGVyOiBDcm9wcGVyQ29tcG9uZW50O1xyXG4gIGltZ1VybCA9IG51bGw7XHJcbiAgY29uZmlnID0gbnVsbDtcclxuICBpbWFnZVVybCA9ICcnO1xyXG4gIGltZ3dVcmwgPSAnJztcclxuICBFdmVudEZpbGU6IGFueTtcclxuICBtZGxTYW1wbGVJc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwdWJsaWMgUHJvZmlsZUltYWdlVXBsb2FkZXJDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgcHVibGljIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOiBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdsb2JhbFNldHRpbmdzOiBHbG9iYWxTZXR0aW5nc1xyXG4gICkge1xyXG4gICAgUHJvZmlsZUltYWdlVXBsb2FkZXJDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9XHJcbiAgICAgIHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKHtcclxuICAgICAgZGlzYWJsZU11bHRpcGFydDogZmFsc2UsIC8vICdEaXNhYmxlTXVsdGlwYXJ0JyBtdXN0IGJlICd0cnVlJyBmb3IgZm9ybWF0RGF0YUZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cclxuICAgIH0pO1xyXG4gICAgdGhpcy5oYXNBbm90aGVyRHJvcFpvbmVPdmVyID0gZmFsc2U7XHJcbiAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPID0gbmV3IFByb2ZpbGVQaWN0dXJlRFRPKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuVmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WaWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MuVmlld1R5cGU7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuRGVmYXVsdEltYWdlU3JjICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYyAhPSAnJ1xyXG4gICAgKVxyXG4gICAgICB0aGlzLkltYWdlU291cmNlID0gdGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYztcclxuXHJcbiAgICB0aGlzLmNvbmZpZyA9IHtcclxuICAgICAgYXNwZWN0UmF0aW86IDIwMCAvIDIwMCxcclxuICAgICAgZHJhZ01vZGU6ICdtb3ZlJyxcclxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcclxuICAgICAgbW92YWJsZTogdHJ1ZSxcclxuICAgICAgcm90YXRhYmxlOiB0cnVlLFxyXG4gICAgICBzY2FsYWJsZTogdHJ1ZSxcclxuICAgICAgem9vbWFibGU6IHRydWUsXHJcbiAgICAgIHZpZXdNb2RlOiAxLFxyXG4gICAgICBjaGVja0ltYWdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICBtb2RhbDogdHJ1ZSxcclxuICAgICAgY2hlY2tDcm9zc09yaWdpbjogZmFsc2UsXHJcbiAgICAgIGNyb3BCb3hSZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICBhdXRvQ3JvcDogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBsZXQgaW1nVVJMID0gdGhpcy5vcHRpb25zLlZhbHVlWydmaWxlVVJMJ107XHJcbiAgICAgIGlmIChpbWdVUkwgIT0gJycgJiYgaW1nVVJMICE9IHVuZGVmaW5lZCAmJiBpbWdVUkwgIT0gbnVsbClcclxuICAgICAgICB0aGlzLkltYWdlU291cmNlID0gaW1nVVJMO1xyXG5cclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuVmFsdWU7XHJcbiAgICAgIHRoaXMuRmlsZUxpa2VPYmplY3QgPSBuZXcgRmlsZUxpa2VPYmplY3Qoe1xyXG4gICAgICAgIG5hbWU6IGVsZW1lbnQuRmlsZU5hbWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW3RoaXMuRmlsZUxpa2VPYmplY3QgYXMgYW55XSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLkxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7XHJcbiAgICAgICAgaW5kZXgrK1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZSA9XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZS50b1VwcGVyQ2FzZSgpICsgVHlwZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLkFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5BY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgY29uc3QgVHlwZVRvb2xUaXBlID0gZWxlbWVudC5zcGxpdCgnLycpWzFdO1xyXG4gICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKFR5cGVUb29sVGlwZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0FsbG93ZWRUeXBlcycpICtcclxuICAgICAgICBgICgke3RoaXMuVG9vbFRpcFR5cGVBcnJheX0pIGA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiA+IDApIHtcclxuICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSArXHJcbiAgICAgICAgYCA8YnIgLz4gJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0ZpbGVNYXhTaXplSW5NQicpfSAke1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQlxyXG4gICAgICAgIH1gO1xyXG4gICAgfVxyXG4gICAgaWYoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwXHJcbiAgICApe1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXNhc3luY1xyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZGVyQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93SW1hZ2VVcGxvYWRlcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgbGV0IGlucHV0ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgJ2lucHV0W3R5cGU9ZmlsZV0nXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaW5wdXQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH07XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKFxyXG4gICAgICBFcnJvckxpc3QsXHJcbiAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uRmlsZUNoYW5nZShldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQucmVqZWN0ZWRGaWxlc1swXTtcclxuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiArICdNJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICEoXHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvVXBwZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy5Ub29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgRmlsZXNBcnJheSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5hZGRlZEZpbGVzWzBdO1xyXG4gICAgICB0aGlzLkV2ZW50RmlsZSA9IGZpbGU7XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgICAgRmlsZU1heFNpemVJbk1COiB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICsgJ00nLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIGxldCBGaWxlT2JqZWN0ID0gZmlsZTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChGaWxlT2JqZWN0KTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbWFnZVVybCA9IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgIHRoaXMub3Blbk1vZGFsKHRydWUpO1xyXG4gICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWU7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGggJiZcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbGlkXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShcclxuICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICAgIHRoaXMuT25DaGFuZ2UuZW1pdChvcmlnaW5hbFZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZUZyb21Db250cm9sVmFsdWUoZXZlbnQpIHtcclxuICAgIGxldCBJdGVtTGlzdCA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWx1ZTtcclxuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihldmVudCksIDEpO1xyXG4gICAgSXRlbUxpc3QgPSBbXTtcclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PSAwICYmIHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEVycm9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKEl0ZW1MaXN0KTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWUpO1xyXG4gICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gIH1cclxuICBjcm9wSW1hZ2UoKSB7XHJcbiAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLkZpbGVOYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZTtcclxuICAgIGxldCBDcm9wcGVyID0gdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyO1xyXG4gICAgbGV0IHByb2ZpbGVQaWN0dXJDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDQwMCxcclxuICAgICAgaGVpZ2h0OiA0MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBsZXQgQXZhdGFyUGljdHVyZUNyb3BwZXIgPSBDcm9wcGVyLmdldENyb3BwZWRDYW52YXMoe1xyXG4gICAgICB3aWR0aDogMTAwLFxyXG4gICAgICBoZWlnaHQ6IDEwMCxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdRdWFsaXR5OiAnaGlnaCcsXHJcbiAgICB9KTtcclxuICAgIGxldCBPcmlnaW5hbFBpY3R1cmVDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDcwMCxcclxuICAgICAgaGVpZ2h0OiA3MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBwcm9maWxlUGljdHVyQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAncHJvZmlsZVBpY3R1ckNyb3BwZXInKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIEF2YXRhclBpY3R1cmVDcm9wcGVyLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsICdBdmF0YXJQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgT3JpZ2luYWxQaWN0dXJlQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLm9wZW5Nb2RhbChmYWxzZSk7XHJcbiAgfVxyXG4gIGdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsIHR5cGUpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBsZXQgQmxvYkZpbGU7XHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIEJsb2JGaWxlID0gYmxvYjtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKEJsb2JGaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGxldCBGaWxlT2JqZWN0OiBGaWxlRFRPO1xyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlICdwcm9maWxlUGljdHVyQ3JvcHBlcic6XHJcbiAgICAgICAgICBCbG9iRmlsZS5uYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZSArICdNZWRpdW1QaWN0dXJlJztcclxuICAgICAgICAgIEZpbGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIEZpbGVOYW1lOiB0aGlzLkV2ZW50RmlsZS5uYW1lICsgJ01lZGl1bVBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8ucHJvZmlsZVBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5NZWRpdW1QaWN0dXJlID1cclxuICAgICAgICAgICAgRmlsZU9iamVjdC5GaWxlTmFtZSArICcsJyArIEZpbGVPYmplY3QuRmlsZUJhc2U2NDtcclxuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChCbG9iRmlsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdBdmF0YXJQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdTbWFsbFBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8uQXZhdGFyUGljdHVyZSA9IEZpbGVPYmplY3Q7XHJcbiAgICAgICAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLlNtYWxsUGljdHVyZSA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdPcmlnaW5hbCcsXHJcbiAgICAgICAgICAgIEZpbGVUeXBlOiB0aGlzLkV2ZW50RmlsZS50eXBlLFxyXG4gICAgICAgICAgICBGaWxlQmFzZTY0OiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSxcclxuICAgICAgICAgICAgRmlsZVNpemVJbk1COiBCbG9iRmlsZS5zaXplIC8gMTAwMCAvIDEwMDAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbFBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbCA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUodGhpcy5Qcm9maWxlUGljdHVyZURUTyk7XHJcbiAgICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMuUHJvZmlsZVBpY3R1cmVEVE87XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcm90YXRlSW1hZ2UoZGVncmVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5yb3RhdGUoZGVncmVlKTtcclxuICB9XHJcbiAgbW92ZUltYWdlKG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIubW92ZShvZmZzZXRYLCBvZmZzZXRZKTtcclxuICB9XHJcbiAgem9vbUltYWdlKHJhdGlvOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKTtcclxuICB9XHJcblxyXG4gIG9wZW5Nb2RhbChvcGVuOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLm1kbFNhbXBsZUlzT3BlbiA9IG9wZW47XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZFJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBDdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIEN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCk7XHJcbiAgfTtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1wcm9maWxlLWltYWdlLXVwbG9hZFwiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLlZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgPGxhYmVsIFtoaWRkZW5dPVwib3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8IS0tQWxsb3cgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFsbG93RHJvcFpvbmUmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiXHJcbiAgICAgICAgIG5neC1kcm9wem9uZVxyXG4gICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCJcclxuICAgICAgICAgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIlxyXG4gICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCJcclxuICAgICAgICAgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgICAgIG5nRGVmYXVsdENvbnRyb2wgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsIGNsYXNzPVwiZHJvcHpvbmUtbGFiZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWFuZC12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogI2ExYTFhMTtcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgMTMuNlYxOUMxMSAxOS42IDExLjQgMjAgMTIgMjBDMTIuNiAyMCAxMyAxOS42IDEzIDE5VjEzLjZIMTFaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogIzk4OTg5ODtcIj48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwhLS1WYWxpZGF0aW9uIHRleHQtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnXCIgKm5nSWY9XCJWYWxpZGF0aW9uTWVzc2FnZVwiIFtpbm5lckhUTUxdPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgIDxuZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldyBjbGFzcz1cImRyb3B6b25lLXByZXZpZXdcIiAqbmdGb3I9XCJsZXQgZiBvZiBmaWxlc1wiIFtmaWxlXT1cImZcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlZCk9XCJyZW1vdmVGcm9tQ29udHJvbFZhbHVlKGYpXCIgbmdQcm9qZWN0QXM9XCJuZ3gtZHJvcHpvbmUtcHJldmlld1wiPlxyXG4gICAgICA8L25neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tTm90IGFsbG93ZWQgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCIhb3B0aW9ucy5BbGxvd0Ryb3Bab25lJiYhb3B0aW9ucy5Jc1JlYWRvbmx5XCIgc3R5bGU9XCJ3aWR0aDpmaXQtY29udGVudFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgPGRpdiAjZWxlbWVudCAoY2xpY2spPVwic2hvd0ltYWdlVXBsb2FkZXIoZWxlbWVudClcIj5cclxuICAgICAgICAgIDxpbWcgW3NyY109XCJJbWFnZVNvdXJjZVwiIGNsYXNzPVwicHJvZmlsZS11cGxvYWQtaW1nXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUge3tvcHRpb25zLkV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgICAgIG5neC1kcm9wem9uZVxyXG4gICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb25zLklzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgIFthY2NlcHRdPVwiQWNjZXB0ZWRUeXBlXCJcclxuICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCJcclxuICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sIGZvcm1Db250cm9sTmFtZT1cInt7b3B0aW9ucy5OYW1lfX1cIlxyXG4gICAgICAgICAgIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIiBbZmlsZV09XCJmXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShmKVwiIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZ1wiICpuZ0lmPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cIlZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wJiZvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgPGRpdiAjZWxlbWVudCA+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cIkltYWdlU291cmNlXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgIDwhLS0gcmVxdWlyZWQgdGV4dC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiXHJcbiAgICAgICAgICpuZ0lmPVwiKFByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5MYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+e3tvcHRpb25zLkxhYmVsRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPnt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIGltYWdlIGNyb3BwZXIgbW9kYWwtLT5cclxuICA8ZGl2IGlkPVwibWRsU2FtcGxlXCIgY2xhc3M9XCJtb2RhbCBiYnNmLWNyb3BwZXItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgW25nU3R5bGVdPVwieydkaXNwbGF5JzogbWRsU2FtcGxlSXNPcGVuID8gJ2Jsb2NrJyA6ICdub25lJywgJ29wYWNpdHknOiAxfVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNyb3BJbWFnZVwiKX19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJvcGVuTW9kYWwoZmFsc2UpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbWFnZVVybFwiPlxyXG4gICAgICAgICAgICA8YW5ndWxhci1jcm9wcGVyICNhbmd1bGFyQ3JvcHBlciBbY3JvcHBlck9wdGlvbnNdPVwiY29uZmlnXCIgW2ltYWdlVXJsXT1cImltYWdlVXJsXCI+XHJcbiAgICAgICAgICAgIDwvYW5ndWxhci1jcm9wcGVyPlxyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1nd1VybFwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wcGVyLWJ0bnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ6b29tSW1hZ2UoMC4xKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlpvb20gaW5cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2VhcmNoLXBsdXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInpvb21JbWFnZSgtMC4xKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlpvb20gb3V0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNlYXJjaC1taW51c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKC0xMCwwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIk1vdmUgbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoMTAsMClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJNb3ZlIHJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LXJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoMCwtMTApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSB1cFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDAsMTApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSBkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJvdGF0ZUltYWdlKC00NSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJSb3RhdGUgbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS11bmRvLWFsdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicm90YXRlSW1hZ2UoNDUpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiUm90YXRlIHJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXJlZG8tYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIiBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJ0bkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJvcGVuTW9kYWwoZmFsc2UpXCI+XHJcbiAgICAgICAgICAgIHt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyb3BJbWFnZSgpXCIgaWQ9XCJidG5PS1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYnJhbmRcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ3JvcFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4iXX0=
|