@piserve-tech/form-submission 1.3.314 → 1.3.316
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 +24 -24
- package/ng-package.json +30 -0
- package/package.json +33 -46
- package/{assets → src/assets}/icons/close-sidebar-mark-icon.svg +3 -3
- package/{assets → src/assets}/icons/copy-icon.svg +5 -5
- package/{assets → src/assets}/icons/delete-icon.svg +7 -7
- package/{assets → src/assets}/icons/delete-no-outline-icon.svg +7 -7
- package/src/environment/environment.ts +6 -0
- package/src/form-fields/aggregate-function/aggregate-function.component.html +63 -0
- package/src/form-fields/aggregate-function/aggregate-function.component.scss +1 -0
- package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +21 -0
- package/src/form-fields/aggregate-function/aggregate-function.component.ts +148 -0
- package/src/form-fields/check-box-fields/check-box-fields.component.html +81 -0
- package/src/form-fields/check-box-fields/check-box-fields.component.scss +28 -0
- package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +21 -0
- package/src/form-fields/check-box-fields/check-box-fields.component.ts +538 -0
- package/src/form-fields/currency-fields/currency-fields.component.html +85 -0
- package/src/form-fields/currency-fields/currency-fields.component.scss +48 -0
- package/src/form-fields/currency-fields/currency-fields.component.spec.ts +21 -0
- package/src/form-fields/currency-fields/currency-fields.component.ts +589 -0
- package/src/form-fields/date-time-fields/date-time-fields.component.html +268 -0
- package/src/form-fields/date-time-fields/date-time-fields.component.scss +88 -0
- package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +21 -0
- package/src/form-fields/date-time-fields/date-time-fields.component.ts +693 -0
- package/src/form-fields/drop-down-fields/drop-down-fields.component.html +77 -0
- package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +12 -0
- package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +21 -0
- package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +698 -0
- package/src/form-fields/file-picker-fields/file-picker-fields.component.html +72 -0
- package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +33 -0
- package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +21 -0
- package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +256 -0
- package/src/form-fields/form-fields.module.ts +110 -0
- package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
- package/src/form-fields/hidden-field/hidden-field.component.spec.ts +21 -0
- package/src/form-fields/hidden-field/hidden-field.component.ts +156 -0
- package/src/form-fields/iframe-fields/iframe-fields.component.html +31 -0
- package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
- package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +21 -0
- package/src/form-fields/iframe-fields/iframe-fields.component.ts +225 -0
- package/src/form-fields/location-fields/location-fields.component.html +54 -0
- package/src/form-fields/location-fields/location-fields.component.scss +22 -0
- package/src/form-fields/location-fields/location-fields.component.spec.ts +21 -0
- package/src/form-fields/location-fields/location-fields.component.ts +83 -0
- package/src/form-fields/mail-fields/mail-fields.component.html +66 -0
- package/src/form-fields/mail-fields/mail-fields.component.scss +10 -0
- package/src/form-fields/mail-fields/mail-fields.component.spec.ts +21 -0
- package/src/form-fields/mail-fields/mail-fields.component.ts +127 -0
- package/src/form-fields/mobile-fields/mobile-fields.component.html +97 -0
- package/src/form-fields/mobile-fields/mobile-fields.component.scss +52 -0
- package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +21 -0
- package/src/form-fields/mobile-fields/mobile-fields.component.ts +310 -0
- package/src/form-fields/number-fields/number-fields.component.html +70 -0
- package/src/form-fields/number-fields/number-fields.component.scss +17 -0
- package/src/form-fields/number-fields/number-fields.component.spec.ts +21 -0
- package/src/form-fields/number-fields/number-fields.component.ts +256 -0
- package/src/form-fields/password-fields/password-fields.component.html +113 -0
- package/src/form-fields/password-fields/password-fields.component.scss +61 -0
- package/src/form-fields/password-fields/password-fields.component.spec.ts +21 -0
- package/src/form-fields/password-fields/password-fields.component.ts +273 -0
- package/src/form-fields/radio-button-fields/radio-button-fields.component.html +82 -0
- package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +28 -0
- package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +21 -0
- package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +391 -0
- package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +67 -0
- package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +23 -0
- package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +21 -0
- package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +145 -0
- package/src/form-fields/section-fields/section-fields.component.html +4 -0
- package/src/form-fields/section-fields/section-fields.component.scss +37 -0
- package/src/form-fields/section-fields/section-fields.component.spec.ts +21 -0
- package/src/form-fields/section-fields/section-fields.component.ts +25 -0
- package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +93 -0
- package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +52 -0
- package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +21 -0
- package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +155 -0
- package/src/form-fields/signature-fields/signature-fields.component.html +43 -0
- package/src/form-fields/signature-fields/signature-fields.component.scss +10 -0
- package/src/form-fields/signature-fields/signature-fields.component.spec.ts +21 -0
- package/src/form-fields/signature-fields/signature-fields.component.ts +25 -0
- package/src/form-fields/slider-fields/slider-fields.component.html +67 -0
- package/src/form-fields/slider-fields/slider-fields.component.scss +55 -0
- package/src/form-fields/slider-fields/slider-fields.component.spec.ts +21 -0
- package/src/form-fields/slider-fields/slider-fields.component.ts +63 -0
- package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +52 -0
- package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +85 -0
- package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +21 -0
- package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +62 -0
- package/src/form-fields/text-area-fields/text-area-fields.component.html +68 -0
- package/src/form-fields/text-area-fields/text-area-fields.component.scss +19 -0
- package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +21 -0
- package/src/form-fields/text-area-fields/text-area-fields.component.ts +166 -0
- package/src/form-fields/text-fields/text-fields.component.html +67 -0
- package/src/form-fields/text-fields/text-fields.component.scss +26 -0
- package/src/form-fields/text-fields/text-fields.component.spec.ts +21 -0
- package/src/form-fields/text-fields/text-fields.component.ts +248 -0
- package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +70 -0
- package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +112 -0
- package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +21 -0
- package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +74 -0
- package/src/form-fields/url-fields/url-fields.component.html +109 -0
- package/src/form-fields/url-fields/url-fields.component.scss +22 -0
- package/src/form-fields/url-fields/url-fields.component.spec.ts +21 -0
- package/src/form-fields/url-fields/url-fields.component.ts +123 -0
- package/src/form-submission/form-submission.module.ts +40 -0
- package/src/form-submission/header/header.component.html +6 -0
- package/src/form-submission/header/header.component.scss +26 -0
- package/src/form-submission/header/header.component.spec.ts +21 -0
- package/src/form-submission/header/header.component.ts +12 -0
- package/src/form-submission/navigation-tabs/navigation-tabs.component.html +134 -0
- package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +200 -0
- package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +21 -0
- package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +134 -0
- package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +207 -0
- package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +208 -0
- package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +21 -0
- package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +74 -0
- package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +60 -0
- package/src/form-submission/save-as-draft/saveDraftModalComponent.html +33 -0
- package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +195 -0
- package/src/form-submission/submission-container/submission-container.component.html +30 -0
- package/src/form-submission/submission-container/submission-container.component.scss +67 -0
- package/src/form-submission/submission-container/submission-container.component.spec.ts +21 -0
- package/src/form-submission/submission-container/submission-container.component.ts +14 -0
- package/src/form-submission/submit-form/submit-form.component.html +76 -0
- package/src/form-submission/submit-form/submit-form.component.scss +88 -0
- package/src/form-submission/submit-form/submit-form.component.spec.ts +21 -0
- package/src/form-submission/submit-form/submit-form.component.ts +1953 -0
- package/src/lib/form-submission.component.html +15 -0
- package/src/lib/form-submission.component.scss +1 -0
- package/src/lib/form-submission.component.ts +120 -0
- package/src/lib/form-submission.module.ts +31 -0
- package/src/lib/form-submission.service.spec.ts +16 -0
- package/src/lib/form-submission.service.ts +9 -0
- package/src/models/aggregate.model.ts +4 -0
- package/{models/answer.model.d.ts → src/models/answer.model.ts} +25 -23
- package/src/models/appearance.model.ts +64 -0
- package/{models/attachment.model.d.ts → src/models/attachment.model.ts} +6 -6
- package/{models/defaultAnswerEntry.model.d.ts → src/models/defaultAnswerEntry.model.ts} +7 -5
- package/{models/defaultAnswersModel.model.d.ts → src/models/defaultAnswersModel.model.ts} +5 -4
- package/{models/defaultQuestionAnswer.model.d.ts → src/models/defaultQuestionAnswer.model.ts} +6 -6
- package/src/models/elementOptionAPI.model.ts +13 -0
- package/src/models/elementOptionAPIData.model.ts +5 -0
- package/src/models/elementOptionDB.model.ts +9 -0
- package/src/models/elementOptionDBCriteria.model.ts +7 -0
- package/{models/emitters.model.d.ts → src/models/emitters.model.ts} +8 -8
- package/{models/enum/condition.enum.d.ts → src/models/enum/condition.enum.ts} +2 -2
- package/src/models/enum/elementType .enum.ts +22 -0
- package/src/models/enum/entityType.enum.ts +10 -0
- package/{models/formConfiguration.model.d.ts → src/models/formConfiguration.model.ts} +2 -2
- package/{models/formElement.model.d.ts → src/models/formElement.model.ts} +22 -22
- package/{models/formElementType.model.d.ts → src/models/formElementType.model.ts} +3 -2
- package/{models/grid.model.d.ts → src/models/grid.model.ts} +14 -13
- package/{models/hiddenField.model.d.ts → src/models/hiddenField.model.ts} +5 -5
- package/{models/iFrameProperties.model.d.ts → src/models/iFrameProperties.model.ts} +13 -13
- package/src/models/logic.model.ts +11 -0
- package/src/models/multifields.model.ts +12 -0
- package/{models/option.model.d.ts → src/models/option.model.ts} +5 -5
- package/src/models/page.model.ts +7 -0
- package/src/models/publicForm.model.ts +19 -0
- package/src/models/question.model.ts +27 -0
- package/src/models/questionAnswer.model.ts +8 -0
- package/src/models/questionGroup.model.ts +12 -0
- package/src/models/response.model.ts +9 -0
- package/src/models/result.model.ts +5 -0
- package/{models/row.model.d.ts → src/models/row.model.ts} +2 -1
- package/src/models/scoring.model.ts +10 -0
- package/src/models/section.model.ts +6 -0
- package/src/models/subForm.model.ts +25 -0
- package/src/models/subformConfiguration.model.ts +4 -0
- package/src/models/subformPropery.model.ts +8 -0
- package/{models/submission.model.d.ts → src/models/submission.model.ts} +16 -14
- package/{models/submissionCopyConfig.mopdel.d.ts → src/models/submissionCopyConfig.mopdel.ts} +4 -4
- package/{models/terms&condition.model.d.ts → src/models/terms&condition.model.ts} +1 -1
- package/src/models/validation.model.ts +48 -0
- package/src/models/whenClause.model.ts +7 -0
- package/{models/whenClauseCondition.model.d.ts → src/models/whenClauseCondition.model.ts} +6 -6
- package/{models/whenClauseElements.model.d.ts → src/models/whenClauseElements.model.ts} +6 -5
- package/{public-api.d.ts → src/public-api.ts} +4 -0
- package/src/question/card-subform/card-subform.component.html +282 -0
- package/src/question/card-subform/card-subform.component.scss +49 -0
- package/src/question/card-subform/card-subform.component.spec.ts +21 -0
- package/src/question/card-subform/card-subform.component.ts +407 -0
- package/src/question/confirm-dialog/confirm-dialog.component.html +32 -0
- package/src/question/confirm-dialog/confirm-dialog.component.scss +109 -0
- package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +21 -0
- package/src/question/confirm-dialog/confirm-dialog.component.ts +24 -0
- package/src/question/form-elements/form-elements.component.html +28 -0
- package/src/question/form-elements/form-elements.component.scss +0 -0
- package/src/question/form-elements/form-elements.component.spec.ts +21 -0
- package/src/question/form-elements/form-elements.component.ts +41 -0
- package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +321 -0
- package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +78 -0
- package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +21 -0
- package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +425 -0
- package/src/question/multifields/multifields.component.html +78 -0
- package/src/question/multifields/multifields.component.scss +6 -0
- package/src/question/multifields/multifields.component.spec.ts +21 -0
- package/src/question/multifields/multifields.component.ts +27 -0
- package/src/question/multiple-subform/multiple-subform.component.html +185 -0
- package/src/question/multiple-subform/multiple-subform.component.scss +52 -0
- package/src/question/multiple-subform/multiple-subform.component.spec.ts +21 -0
- package/src/question/multiple-subform/multiple-subform.component.ts +481 -0
- package/src/question/question/question.component.html +51 -0
- package/src/question/question/question.component.scss +0 -0
- package/src/question/question/question.component.spec.ts +21 -0
- package/src/question/question/question.component.ts +129 -0
- package/src/question/question-group/question-group.component.html +147 -0
- package/src/question/question-group/question-group.component.scss +36 -0
- package/src/question/question-group/question-group.component.spec.ts +21 -0
- package/src/question/question-group/question-group.component.ts +94 -0
- package/src/question/question.module.ts +22 -0
- package/src/question/recursive-logic/recursive-logic.component.html +33 -0
- package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
- package/src/question/recursive-logic/recursive-logic.component.spec.ts +21 -0
- package/src/question/recursive-logic/recursive-logic.component.ts +29 -0
- package/src/question/sub-form/sub-form.component.html +254 -0
- package/src/question/sub-form/sub-form.component.scss +83 -0
- package/src/question/sub-form/sub-form.component.spec.ts +21 -0
- package/src/question/sub-form/sub-form.component.ts +421 -0
- package/src/services/aggregate.service.ts +148 -0
- package/src/services/countryService.ts +92 -0
- package/src/services/data.service.ts +36 -0
- package/src/services/element-tracker.service.spec.ts +16 -0
- package/src/services/element-tracker.service.ts +24 -0
- package/src/services/form-validation.service.ts +151 -0
- package/src/services/form.service.spec.ts +16 -0
- package/src/services/form.service.ts +407 -0
- package/src/services/mapper.service.ts +625 -0
- package/src/services/recaptcha.service.spec.ts +16 -0
- package/src/services/recaptcha.service.ts +179 -0
- package/src/services/score.service.ts +352 -0
- package/src/services/subform-copy.service.ts +148 -0
- package/src/services/validation.service.spec.ts +16 -0
- package/src/services/validation.service.ts +33 -0
- package/src/services/whenClause.service.ts +502 -0
- package/src/shared/shared.module.ts +58 -0
- package/src/styles/shared-style.scss +86 -0
- package/src/sub-form/sub-form.module.ts +24 -0
- package/src/sub-form/submission-modal/submission-modal.component.html +160 -0
- package/src/sub-form/submission-modal/submission-modal.component.scss +54 -0
- package/src/sub-form/submission-modal/submission-modal.component.spec.ts +21 -0
- package/src/sub-form/submission-modal/submission-modal.component.ts +127 -0
- package/tsconfig.lib.json +14 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/environment/environment.d.ts +0 -5
- package/esm2022/environment/environment.mjs +0 -6
- package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +0 -146
- package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +0 -473
- package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +0 -502
- package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +0 -608
- package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +0 -585
- package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +0 -224
- package/esm2022/form-fields/form-fields.module.mjs +0 -174
- package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +0 -137
- package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +0 -198
- package/esm2022/form-fields/location-fields/location-fields.component.mjs +0 -85
- package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +0 -131
- package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +0 -270
- package/esm2022/form-fields/number-fields/number-fields.component.mjs +0 -242
- package/esm2022/form-fields/password-fields/password-fields.component.mjs +0 -257
- package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +0 -346
- package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +0 -148
- package/esm2022/form-fields/section-fields/section-fields.component.mjs +0 -29
- package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +0 -158
- package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +0 -32
- package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +0 -73
- package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +0 -66
- package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +0 -159
- package/esm2022/form-fields/text-fields/text-fields.component.mjs +0 -245
- package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +0 -85
- package/esm2022/form-fields/url-fields/url-fields.component.mjs +0 -124
- package/esm2022/form-submission/form-submission.module.mjs +0 -64
- package/esm2022/form-submission/header/header.component.mjs +0 -20
- package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +0 -171
- package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +0 -124
- package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +0 -50
- package/esm2022/form-submission/submission-container/submission-container.component.mjs +0 -17
- package/esm2022/form-submission/submit-form/submit-form.component.mjs +0 -1610
- package/esm2022/lib/form-submission.component.mjs +0 -113
- package/esm2022/lib/form-submission.module.mjs +0 -56
- package/esm2022/lib/form-submission.service.mjs +0 -14
- package/esm2022/models/aggregate.model.mjs +0 -2
- package/esm2022/models/answer.model.mjs +0 -2
- package/esm2022/models/appearance.model.mjs +0 -2
- package/esm2022/models/attachment.model.mjs +0 -2
- package/esm2022/models/defaultAnswerEntry.model.mjs +0 -2
- package/esm2022/models/defaultAnswersModel.model.mjs +0 -2
- package/esm2022/models/defaultQuestionAnswer.model.mjs +0 -2
- package/esm2022/models/elementOptionAPI.model.mjs +0 -2
- package/esm2022/models/elementOptionAPIData.model.mjs +0 -2
- package/esm2022/models/elementOptionDB.model.mjs +0 -2
- package/esm2022/models/elementOptionDBCriteria.model.mjs +0 -2
- package/esm2022/models/emitters.model.mjs +0 -2
- package/esm2022/models/enum/condition.enum.mjs +0 -18
- package/esm2022/models/enum/elementType .enum.mjs +0 -24
- package/esm2022/models/enum/entityType.enum.mjs +0 -12
- package/esm2022/models/formConfiguration.model.mjs +0 -2
- package/esm2022/models/formElement.model.mjs +0 -2
- package/esm2022/models/formElementType.model.mjs +0 -2
- package/esm2022/models/grid.model.mjs +0 -2
- package/esm2022/models/hiddenField.model.mjs +0 -2
- package/esm2022/models/iFrameProperties.model.mjs +0 -2
- package/esm2022/models/logic.model.mjs +0 -2
- package/esm2022/models/multifields.model.mjs +0 -2
- package/esm2022/models/option.model.mjs +0 -2
- package/esm2022/models/page.model.mjs +0 -2
- package/esm2022/models/publicForm.model.mjs +0 -2
- package/esm2022/models/question.model.mjs +0 -2
- package/esm2022/models/questionAnswer.model.mjs +0 -2
- package/esm2022/models/questionGroup.model.mjs +0 -2
- package/esm2022/models/row.model.mjs +0 -2
- package/esm2022/models/scoring.model.mjs +0 -2
- package/esm2022/models/section.model.mjs +0 -2
- package/esm2022/models/subForm.model.mjs +0 -2
- package/esm2022/models/subformConfiguration.model.mjs +0 -2
- package/esm2022/models/subformPropery.model.mjs +0 -2
- package/esm2022/models/submission.model.mjs +0 -2
- package/esm2022/models/submissionCopyConfig.mopdel.mjs +0 -2
- package/esm2022/models/terms&condition.model.mjs +0 -2
- package/esm2022/models/validation.model.mjs +0 -2
- package/esm2022/models/whenClause.model.mjs +0 -2
- package/esm2022/models/whenClauseCondition.model.mjs +0 -2
- package/esm2022/models/whenClauseElements.model.mjs +0 -2
- package/esm2022/piserve-tech-form-submission.mjs +0 -5
- package/esm2022/public-api.mjs +0 -7
- package/esm2022/question/card-subform/card-subform.component.mjs +0 -354
- package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +0 -27
- package/esm2022/question/form-elements/form-elements.component.mjs +0 -62
- package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +0 -384
- package/esm2022/question/multifields/multifields.component.mjs +0 -54
- package/esm2022/question/multiple-subform/multiple-subform.component.mjs +0 -413
- package/esm2022/question/question/question.component.mjs +0 -145
- package/esm2022/question/question-group/question-group.component.mjs +0 -102
- package/esm2022/question/recursive-logic/recursive-logic.component.mjs +0 -49
- package/esm2022/question/sub-form/sub-form.component.mjs +0 -351
- package/esm2022/services/aggregate.service.mjs +0 -139
- package/esm2022/services/countryService.mjs +0 -89
- package/esm2022/services/data.service.mjs +0 -36
- package/esm2022/services/element-tracker.service.mjs +0 -27
- package/esm2022/services/form-validation.service.mjs +0 -128
- package/esm2022/services/form.service.mjs +0 -333
- package/esm2022/services/mapper.service.mjs +0 -519
- package/esm2022/services/recaptcha.service.mjs +0 -136
- package/esm2022/services/score.service.mjs +0 -268
- package/esm2022/services/subform-copy.service.mjs +0 -122
- package/esm2022/services/validation.service.mjs +0 -35
- package/esm2022/services/whenClause.service.mjs +0 -423
- package/esm2022/shared/shared.module.mjs +0 -97
- package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +0 -133
- package/fesm2022/piserve-tech-form-submission.mjs +0 -11658
- package/fesm2022/piserve-tech-form-submission.mjs.map +0 -1
- package/form-fields/aggregate-function/aggregate-function.component.d.ts +0 -43
- package/form-fields/check-box-fields/check-box-fields.component.d.ts +0 -73
- package/form-fields/currency-fields/currency-fields.component.d.ts +0 -62
- package/form-fields/date-time-fields/date-time-fields.component.d.ts +0 -96
- package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +0 -88
- package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +0 -72
- package/form-fields/form-fields.module.d.ts +0 -40
- package/form-fields/hidden-field/hidden-field.component.d.ts +0 -38
- package/form-fields/iframe-fields/iframe-fields.component.d.ts +0 -35
- package/form-fields/location-fields/location-fields.component.d.ts +0 -29
- package/form-fields/mail-fields/mail-fields.component.d.ts +0 -41
- package/form-fields/mobile-fields/mobile-fields.component.d.ts +0 -71
- package/form-fields/number-fields/number-fields.component.d.ts +0 -53
- package/form-fields/password-fields/password-fields.component.d.ts +0 -57
- package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +0 -70
- package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +0 -46
- package/form-fields/section-fields/section-fields.component.d.ts +0 -10
- package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +0 -45
- package/form-fields/signature-fields/signature-fields.component.d.ts +0 -13
- package/form-fields/slider-fields/slider-fields.component.d.ts +0 -32
- package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +0 -26
- package/form-fields/text-area-fields/text-area-fields.component.d.ts +0 -49
- package/form-fields/text-fields/text-fields.component.d.ts +0 -49
- package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +0 -29
- package/form-fields/url-fields/url-fields.component.d.ts +0 -41
- package/form-submission/form-submission.module.d.ts +0 -20
- package/form-submission/header/header.component.d.ts +0 -7
- package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +0 -57
- package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +0 -46
- package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +0 -17
- package/form-submission/submission-container/submission-container.component.d.ts +0 -7
- package/form-submission/submit-form/submit-form.component.d.ts +0 -237
- package/index.d.ts +0 -5
- package/lib/form-submission.component.d.ts +0 -30
- package/lib/form-submission.module.d.ts +0 -16
- package/lib/form-submission.service.d.ts +0 -6
- package/models/aggregate.model.d.ts +0 -4
- package/models/appearance.model.d.ts +0 -64
- package/models/elementOptionAPI.model.d.ts +0 -12
- package/models/elementOptionAPIData.model.d.ts +0 -5
- package/models/elementOptionDB.model.d.ts +0 -8
- package/models/elementOptionDBCriteria.model.d.ts +0 -7
- package/models/enum/elementType .enum.d.ts +0 -22
- package/models/enum/entityType.enum.d.ts +0 -10
- package/models/logic.model.d.ts +0 -9
- package/models/multifields.model.d.ts +0 -11
- package/models/page.model.d.ts +0 -6
- package/models/publicForm.model.d.ts +0 -18
- package/models/question.model.d.ts +0 -26
- package/models/questionAnswer.model.d.ts +0 -7
- package/models/questionGroup.model.d.ts +0 -11
- package/models/scoring.model.d.ts +0 -10
- package/models/section.model.d.ts +0 -6
- package/models/subForm.model.d.ts +0 -24
- package/models/subformConfiguration.model.d.ts +0 -4
- package/models/subformPropery.model.d.ts +0 -7
- package/models/validation.model.d.ts +0 -48
- package/models/whenClause.model.d.ts +0 -6
- package/question/card-subform/card-subform.component.d.ts +0 -44
- package/question/confirm-dialog/confirm-dialog.component.d.ts +0 -12
- package/question/form-elements/form-elements.component.d.ts +0 -20
- package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +0 -47
- package/question/multifields/multifields.component.d.ts +0 -11
- package/question/multiple-subform/multiple-subform.component.d.ts +0 -39
- package/question/question/question.component.d.ts +0 -30
- package/question/question-group/question-group.component.d.ts +0 -29
- package/question/recursive-logic/recursive-logic.component.d.ts +0 -19
- package/question/sub-form/sub-form.component.d.ts +0 -70
- package/services/aggregate.service.d.ts +0 -29
- package/services/countryService.d.ts +0 -21
- package/services/data.service.d.ts +0 -19
- package/services/element-tracker.service.d.ts +0 -10
- package/services/form-validation.service.d.ts +0 -16
- package/services/form.service.d.ts +0 -27
- package/services/mapper.service.d.ts +0 -31
- package/services/recaptcha.service.d.ts +0 -46
- package/services/score.service.d.ts +0 -27
- package/services/subform-copy.service.d.ts +0 -10
- package/services/validation.service.d.ts +0 -14
- package/services/whenClause.service.d.ts +0 -45
- package/shared/shared.module.d.ts +0 -25
- package/sub-form/submission-modal/submission-modal.component.d.ts +0 -31
- /package/{assets → src/assets}/fonts/Garamond.woff2 +0 -0
- /package/{assets → src/assets}/fonts/Georgia.woff2 +0 -0
- /package/{assets → src/assets}/fonts/Poppins.woff2 +0 -0
- /package/{assets → src/assets}/fonts/Tahoma.woff2 +0 -0
- /package/{assets → src/assets}/fonts/Tajawal.woff2 +0 -0
- /package/{assets → src/assets}/fonts/Verdana.woff2 +0 -0
- /package/{assets → src/assets}/icons/left_arrow.svg +0 -0
- /package/{assets → src/assets}/icons/right_arrow.svg +0 -0
|
@@ -1,502 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../services/validation.service";
|
|
4
|
-
import * as i2 from "../../services/element-tracker.service";
|
|
5
|
-
import * as i3 from "../../services/aggregate.service";
|
|
6
|
-
import * as i4 from "@angular/common";
|
|
7
|
-
import * as i5 from "@angular/forms";
|
|
8
|
-
export class CurrencyFieldsComponent {
|
|
9
|
-
constructor(validationService, tracker, aggregateService) {
|
|
10
|
-
this.validationService = validationService;
|
|
11
|
-
this.tracker = tracker;
|
|
12
|
-
this.aggregateService = aggregateService;
|
|
13
|
-
this.question = {};
|
|
14
|
-
this.inLine = false;
|
|
15
|
-
this.inCard = false;
|
|
16
|
-
this.disableEdit = false;
|
|
17
|
-
this.answerChange = new EventEmitter();
|
|
18
|
-
this.count = 0;
|
|
19
|
-
this.required = false;
|
|
20
|
-
this.hint = '';
|
|
21
|
-
this.placeholder = '';
|
|
22
|
-
this.currencySymbol = '';
|
|
23
|
-
this.symbolPosition = 'Before the value';
|
|
24
|
-
this.showAmountInWords = false;
|
|
25
|
-
this.validationFailed = false;
|
|
26
|
-
this.validationMessage = '';
|
|
27
|
-
this.elementId = '';
|
|
28
|
-
this.amountInWordsText = '';
|
|
29
|
-
this.defaultCurrency = '';
|
|
30
|
-
// 2) typed currency map
|
|
31
|
-
this.currencyMap = {
|
|
32
|
-
USD: {
|
|
33
|
-
codes: ['USD'],
|
|
34
|
-
symbols: ['$', 'US$'],
|
|
35
|
-
mainUnit: 'Dollars',
|
|
36
|
-
subUnit: 'Cents',
|
|
37
|
-
decimals: 2,
|
|
38
|
-
},
|
|
39
|
-
INR: {
|
|
40
|
-
codes: ['INR'],
|
|
41
|
-
symbols: ['₹', 'Rs', '₨'],
|
|
42
|
-
mainUnit: 'Rupees',
|
|
43
|
-
subUnit: 'Paisa',
|
|
44
|
-
decimals: 2,
|
|
45
|
-
},
|
|
46
|
-
EUR: {
|
|
47
|
-
codes: ['EUR'],
|
|
48
|
-
symbols: ['€'],
|
|
49
|
-
mainUnit: 'Euros',
|
|
50
|
-
subUnit: 'Cents',
|
|
51
|
-
decimals: 2,
|
|
52
|
-
},
|
|
53
|
-
AED: {
|
|
54
|
-
codes: ['AED'],
|
|
55
|
-
symbols: ['AED', 'د.إ'],
|
|
56
|
-
mainUnit: 'Dirhams',
|
|
57
|
-
subUnit: 'Fils',
|
|
58
|
-
decimals: 2,
|
|
59
|
-
},
|
|
60
|
-
GBP: {
|
|
61
|
-
codes: ['GBP'],
|
|
62
|
-
symbols: ['£'],
|
|
63
|
-
mainUnit: 'Pounds',
|
|
64
|
-
subUnit: 'Pence',
|
|
65
|
-
decimals: 2,
|
|
66
|
-
},
|
|
67
|
-
JPY: {
|
|
68
|
-
codes: ['JPY'],
|
|
69
|
-
symbols: ['¥'],
|
|
70
|
-
mainUnit: 'Yen',
|
|
71
|
-
subUnit: '',
|
|
72
|
-
decimals: 0,
|
|
73
|
-
},
|
|
74
|
-
// add more entries as needed
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
ngOnInit() {
|
|
78
|
-
this.valueAssigned();
|
|
79
|
-
}
|
|
80
|
-
valueAssigned() {
|
|
81
|
-
this.count = this.question.count;
|
|
82
|
-
this.required = this.question.required;
|
|
83
|
-
this.hint = this.question.hint;
|
|
84
|
-
this.defaultCurrency = this.question.formElement?.appearance?.defaultCurrency || '';
|
|
85
|
-
this.placeholder = this.question.formElement?.appearance?.placeholder || '';
|
|
86
|
-
this.currencySymbol = this.question.formElement?.appearance?.currencySymbol;
|
|
87
|
-
this.decimalPrecision =
|
|
88
|
-
this.question.formElement?.appearance?.decimalPrecision || 2;
|
|
89
|
-
this.symbolPosition =
|
|
90
|
-
this.question.formElement?.appearance?.symbolPosition ||
|
|
91
|
-
'Before the value';
|
|
92
|
-
this.thousandSeparator =
|
|
93
|
-
this.question.formElement?.appearance?.thousandSeparator;
|
|
94
|
-
this.min = this.question.formElement.validation.min;
|
|
95
|
-
this.max = this.question.formElement.validation.max;
|
|
96
|
-
this.showAmountInWords =
|
|
97
|
-
this.question.formElement?.appearance?.showAmountInWords;
|
|
98
|
-
if (this.question.formElement?.appearance?.currency) {
|
|
99
|
-
let userLocaleCureency = this.question.formElement?.appearance?.currency;
|
|
100
|
-
if (this.question.formElement.appearance.currencyOption) {
|
|
101
|
-
let currencyOption = this.question.formElement.appearance.currencyOption;
|
|
102
|
-
if (currencyOption == 'auto') {
|
|
103
|
-
if (this.question.formElement.appearance.limitCurrencySymbol &&
|
|
104
|
-
this.question.formElement.appearance.limitCurrencySymbol.length > 0) {
|
|
105
|
-
this.currencySymbol =
|
|
106
|
-
this.question.formElement.appearance.limitCurrencySymbol.includes(userLocaleCureency)
|
|
107
|
-
? userLocaleCureency
|
|
108
|
-
: this.question.formElement?.appearance?.currencySymbol;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
this.currencySymbol = userLocaleCureency;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else if (currencyOption == 'specific') {
|
|
115
|
-
this.currencySymbol =
|
|
116
|
-
this.question.formElement?.appearance?.specificCurrencySymbol;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (!this.currencySymbol &&
|
|
121
|
-
this.question.formElement?.appearance?.currencySymbol) {
|
|
122
|
-
this.currencySymbol =
|
|
123
|
-
this.question.formElement?.appearance?.currencySymbol;
|
|
124
|
-
}
|
|
125
|
-
if (this.question.formElement?.appearance?.defaultCurrency) {
|
|
126
|
-
this.currencySymbol = this.question.formElement?.appearance?.defaultCurrency;
|
|
127
|
-
}
|
|
128
|
-
if (this.question.answerCurrency) {
|
|
129
|
-
this.currencySymbol = this.question.answerCurrency;
|
|
130
|
-
}
|
|
131
|
-
if (this.question.answer) {
|
|
132
|
-
this.initializeAnswer();
|
|
133
|
-
}
|
|
134
|
-
if (this.showAmountInWords) {
|
|
135
|
-
this.amountInWordsText = this.question.amountInWords;
|
|
136
|
-
}
|
|
137
|
-
if (this.question.childLogics && this.question.answer) {
|
|
138
|
-
this.updateChildLogics(this.question);
|
|
139
|
-
}
|
|
140
|
-
this.aggregateService.setNumberField(this.rowId, this.question.id, this.question.answer);
|
|
141
|
-
}
|
|
142
|
-
initializeAnswer() {
|
|
143
|
-
let value = this.question?.answer;
|
|
144
|
-
if (!value)
|
|
145
|
-
return;
|
|
146
|
-
// check if numeric
|
|
147
|
-
if (!isNaN(Number(value))) {
|
|
148
|
-
if (this.thousandSeparator) {
|
|
149
|
-
const parts = value.split('.');
|
|
150
|
-
parts[0] = Number(parts[0]).toLocaleString('en-US'); // adds proper thousand separator
|
|
151
|
-
value = parts.join('.');
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
value = value;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
this.enteredAmount = value;
|
|
158
|
-
}
|
|
159
|
-
preventNumberScroll(event) {
|
|
160
|
-
if (document.activeElement === event.target) {
|
|
161
|
-
event.preventDefault();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
validateNumber() {
|
|
165
|
-
this.validationFailed = false;
|
|
166
|
-
this.validationService.clearInvalid(this.buildElementId());
|
|
167
|
-
this.validationMessage = '';
|
|
168
|
-
let enteredAmount = this.parseCurrencyToNumber(this.enteredAmount);
|
|
169
|
-
if (this.required && !enteredAmount) {
|
|
170
|
-
this.validationFailed = true;
|
|
171
|
-
this.validationMessage = `Please enter a valid amount`;
|
|
172
|
-
this.question.validationMessage = `Please enter a valid amount`;
|
|
173
|
-
this.question.validation = false;
|
|
174
|
-
}
|
|
175
|
-
else if ((this.min !== undefined && enteredAmount < this.min) ||
|
|
176
|
-
(this.max !== undefined && enteredAmount > this.max)) {
|
|
177
|
-
this.validationFailed = true;
|
|
178
|
-
// Construct appropriate validation message based on whether min, max, or both are provided
|
|
179
|
-
if (this.min !== undefined && this.max !== undefined) {
|
|
180
|
-
this.validationMessage = `Please enter a valid amount between ${this.min} and ${this.max}`;
|
|
181
|
-
this.question.validationMessage = `Please enter a valid amount between ${this.min} and ${this.max}`;
|
|
182
|
-
}
|
|
183
|
-
else if (this.min !== undefined) {
|
|
184
|
-
this.validationMessage = `Please enter a amount greater than or equal to ${this.min}`;
|
|
185
|
-
this.question.validationMessage = `Please enter a amount greater than or equal to ${this.min}`;
|
|
186
|
-
}
|
|
187
|
-
else if (this.max !== undefined) {
|
|
188
|
-
this.validationMessage = `Please enter a amount less than or equal to ${this.max}`;
|
|
189
|
-
this.question.validationMessage = `Please enter a amount less than or equal to ${this.max}`;
|
|
190
|
-
}
|
|
191
|
-
this.question.validation = false;
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
this.question.validation = true;
|
|
195
|
-
}
|
|
196
|
-
if (this.question.childLogics) {
|
|
197
|
-
this.updateChildLogics(this.question);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
validateInput(event) {
|
|
201
|
-
this.validationService.clearInvalid(this.buildElementId());
|
|
202
|
-
// remove existing commas & currency symbol
|
|
203
|
-
let rawValue = (event.target.value || '')
|
|
204
|
-
.replace(/,/g, '')
|
|
205
|
-
.replace(this.currencySymbol || '', '');
|
|
206
|
-
// remove any characters except digits and dot
|
|
207
|
-
rawValue = rawValue.replace(/[^\d.]/g, '');
|
|
208
|
-
// keep only the first dot (remove any additional dots)
|
|
209
|
-
const firstDot = rawValue.indexOf('.');
|
|
210
|
-
if (firstDot !== -1) {
|
|
211
|
-
// split into before-first-dot and rest, remove additional dots from rest
|
|
212
|
-
const before = rawValue.slice(0, firstDot);
|
|
213
|
-
const after = rawValue.slice(firstDot + 1).replace(/\./g, '');
|
|
214
|
-
rawValue = `${before}.${after}`;
|
|
215
|
-
}
|
|
216
|
-
// determine decimal precision to enforce (default to 2)
|
|
217
|
-
const dp = typeof this.decimalPrecision === 'number' && this.decimalPrecision >= 0
|
|
218
|
-
? this.decimalPrecision
|
|
219
|
-
: 2;
|
|
220
|
-
// if there's a decimal part, trim it to allowed length
|
|
221
|
-
if (rawValue.includes('.')) {
|
|
222
|
-
const [intPart, decimalPart = ''] = rawValue.split('.');
|
|
223
|
-
const trimmedDecimal = decimalPart.slice(0, dp);
|
|
224
|
-
rawValue = trimmedDecimal
|
|
225
|
-
? `${intPart}.${trimmedDecimal}`
|
|
226
|
-
: intPart + '.';
|
|
227
|
-
}
|
|
228
|
-
// format with thousand separator for display
|
|
229
|
-
let formattedValue = rawValue;
|
|
230
|
-
if (this.thousandSeparator && rawValue) {
|
|
231
|
-
const parts = rawValue.split('.');
|
|
232
|
-
// handle case where user types ".12" -> parts[0] === ''
|
|
233
|
-
const intPartForFormat = parts[0] === '' ? '0' : parts[0];
|
|
234
|
-
parts[0] = Number(intPartForFormat).toLocaleString('en-US');
|
|
235
|
-
formattedValue = parts.join('.');
|
|
236
|
-
// if original had leading '.' (user typed ".12"), restore it visually as ".12"
|
|
237
|
-
if (rawValue.startsWith('.') && !formattedValue.startsWith('.')) {
|
|
238
|
-
formattedValue = formattedValue.replace(/^0/, '');
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
// keep numeric version for backend/calculations
|
|
242
|
-
this.question.answer = rawValue;
|
|
243
|
-
this.question.currencySymbol = this.currencySymbol;
|
|
244
|
-
// update field display
|
|
245
|
-
event.target.value = formattedValue;
|
|
246
|
-
this.aggregateService.setNumberField(this.rowId, this.question.id, rawValue ? parseFloat(rawValue) : 0);
|
|
247
|
-
if (this.question.childLogics) {
|
|
248
|
-
this.updateChildLogics(this.question);
|
|
249
|
-
}
|
|
250
|
-
if (this.showAmountInWords) {
|
|
251
|
-
this.amountInWordsText = this.convertAmountToWords(rawValue);
|
|
252
|
-
this.question.amountInWords = this.amountInWordsText;
|
|
253
|
-
}
|
|
254
|
-
this.answerChange.emit({
|
|
255
|
-
answer: this.question.answer,
|
|
256
|
-
maxPossibleScore: 0,
|
|
257
|
-
amountInWords: this.question.amountInWords,
|
|
258
|
-
currency: this.currencySymbol
|
|
259
|
-
});
|
|
260
|
-
this.validateNumber();
|
|
261
|
-
}
|
|
262
|
-
// 3) convertAmountToWords using CurrencyMeta typing
|
|
263
|
-
convertAmountToWords(value) {
|
|
264
|
-
if (!value)
|
|
265
|
-
return '';
|
|
266
|
-
// prefer currencyCode (ISO) if available; fall back to symbol
|
|
267
|
-
const currencyCode = this.question?.currencyCode || null;
|
|
268
|
-
const currencySymbol = this.question?.currencySymbol || this.currencySymbol || null;
|
|
269
|
-
// find currency metadata from map:
|
|
270
|
-
let meta;
|
|
271
|
-
if (currencyCode) {
|
|
272
|
-
meta = this.currencyMap[currencyCode];
|
|
273
|
-
}
|
|
274
|
-
if (!meta && currencySymbol) {
|
|
275
|
-
meta = Object.values(this.currencyMap).find((m) => Array.isArray(m.symbols) && m.symbols.includes(currencySymbol));
|
|
276
|
-
}
|
|
277
|
-
// use fallback if not found — typed as CurrencyMeta
|
|
278
|
-
if (!meta) {
|
|
279
|
-
const fallbackName = (currencyCode ||
|
|
280
|
-
currencySymbol ||
|
|
281
|
-
'Currency').toString();
|
|
282
|
-
meta = {
|
|
283
|
-
codes: [currencyCode || fallbackName],
|
|
284
|
-
symbols: currencySymbol ? [currencySymbol] : [],
|
|
285
|
-
mainUnit: fallbackName,
|
|
286
|
-
subUnit: '',
|
|
287
|
-
decimals: 2,
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
// normalize numeric parts
|
|
291
|
-
const normalized = (value || '').toString().replace(/,/g, '');
|
|
292
|
-
const [intPartStr = '0', decimalPartStr = ''] = normalized.split('.');
|
|
293
|
-
const intPartNum = Number(intPartStr) || 0;
|
|
294
|
-
// calculate subunit number robustly:
|
|
295
|
-
const dp = typeof meta.decimals === 'number' && meta.decimals >= 0
|
|
296
|
-
? meta.decimals
|
|
297
|
-
: 2;
|
|
298
|
-
let subUnitNumber = 0;
|
|
299
|
-
if (dp > 0 && decimalPartStr) {
|
|
300
|
-
const scale = Math.pow(10, dp);
|
|
301
|
-
const decDigits = decimalPartStr.replace(/\D/g, '');
|
|
302
|
-
// if shorter than dp, multiply; if longer, trim to dp
|
|
303
|
-
const trimmed = decDigits.slice(0, dp);
|
|
304
|
-
subUnitNumber = Number(trimmed) * Math.pow(10, dp - trimmed.length);
|
|
305
|
-
// guard for rounding overflow (e.g., .999 -> 1.00)
|
|
306
|
-
if (subUnitNumber >= scale) {
|
|
307
|
-
// increment integer part
|
|
308
|
-
return this.buildFinalPhrase(intPartNum + 1, 0, meta);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return this.buildFinalPhrase(intPartNum, subUnitNumber, meta);
|
|
312
|
-
}
|
|
313
|
-
// 4) buildFinalPhrase accepts CurrencyMeta (or same shape) — typed accordingly
|
|
314
|
-
buildFinalPhrase(intNum, subNum, meta) {
|
|
315
|
-
const mainWords = this.numberToWords(intNum) || 'Zero';
|
|
316
|
-
if (meta.decimals === 0 || !meta.subUnit) {
|
|
317
|
-
return `${mainWords} ${meta.mainUnit} Only`;
|
|
318
|
-
}
|
|
319
|
-
if (!subNum) {
|
|
320
|
-
return `${mainWords} ${meta.mainUnit} Only`;
|
|
321
|
-
}
|
|
322
|
-
const subWords = this.numberToWords(subNum);
|
|
323
|
-
return `${mainWords} ${meta.mainUnit} and ${subWords} ${meta.subUnit} Only`;
|
|
324
|
-
}
|
|
325
|
-
// -------------------------
|
|
326
|
-
// NUMBER → WORDS (Up to Crores)
|
|
327
|
-
// -------------------------
|
|
328
|
-
numberToWords(num) {
|
|
329
|
-
if (num === 0)
|
|
330
|
-
return 'Zero';
|
|
331
|
-
const a = [
|
|
332
|
-
'',
|
|
333
|
-
'One',
|
|
334
|
-
'Two',
|
|
335
|
-
'Three',
|
|
336
|
-
'Four',
|
|
337
|
-
'Five',
|
|
338
|
-
'Six',
|
|
339
|
-
'Seven',
|
|
340
|
-
'Eight',
|
|
341
|
-
'Nine',
|
|
342
|
-
'Ten',
|
|
343
|
-
'Eleven',
|
|
344
|
-
'Twelve',
|
|
345
|
-
'Thirteen',
|
|
346
|
-
'Fourteen',
|
|
347
|
-
'Fifteen',
|
|
348
|
-
'Sixteen',
|
|
349
|
-
'Seventeen',
|
|
350
|
-
'Eighteen',
|
|
351
|
-
'Nineteen',
|
|
352
|
-
];
|
|
353
|
-
const b = [
|
|
354
|
-
'',
|
|
355
|
-
'',
|
|
356
|
-
'Twenty',
|
|
357
|
-
'Thirty',
|
|
358
|
-
'Forty',
|
|
359
|
-
'Fifty',
|
|
360
|
-
'Sixty',
|
|
361
|
-
'Seventy',
|
|
362
|
-
'Eighty',
|
|
363
|
-
'Ninety',
|
|
364
|
-
];
|
|
365
|
-
const toWords = (n) => {
|
|
366
|
-
if (n < 20)
|
|
367
|
-
return a[n];
|
|
368
|
-
if (n < 100)
|
|
369
|
-
return `${b[Math.floor(n / 10)]} ${a[n % 10]}`.trim();
|
|
370
|
-
if (n < 1000)
|
|
371
|
-
return `${a[Math.floor(n / 100)]} Hundred ${toWords(n % 100)}`.trim();
|
|
372
|
-
if (n < 100000)
|
|
373
|
-
return `${toWords(Math.floor(n / 1000))} Thousand ${toWords(n % 1000)}`.trim();
|
|
374
|
-
if (n < 10000000)
|
|
375
|
-
return `${toWords(Math.floor(n / 100000))} Lakh ${toWords(n % 100000)}`.trim();
|
|
376
|
-
return `${toWords(Math.floor(n / 10000000))} Crore ${toWords(n % 10000000)}`.trim();
|
|
377
|
-
};
|
|
378
|
-
return toWords(num);
|
|
379
|
-
}
|
|
380
|
-
updateChildLogics(question) {
|
|
381
|
-
if (question.childLogics && Array.isArray(question.childLogics)) {
|
|
382
|
-
question.childLogics.forEach((childLogic) => {
|
|
383
|
-
if (this.evaluateCondition(question.answer, childLogic.condition, childLogic.inputValue)) {
|
|
384
|
-
childLogic.showLogic = true;
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
childLogic.showLogic = false;
|
|
388
|
-
this.clearAnswersRecursively(childLogic);
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
parseCurrencyToNumber(value) {
|
|
394
|
-
if (!value)
|
|
395
|
-
return 0;
|
|
396
|
-
// Remove currency symbol, commas, spaces
|
|
397
|
-
const numericString = value
|
|
398
|
-
.replace(new RegExp(`\\${this.currencySymbol}`, 'g'), '') // remove symbol
|
|
399
|
-
.replace(/,/g, '') // remove thousand separators
|
|
400
|
-
.trim();
|
|
401
|
-
// Convert to number
|
|
402
|
-
const num = parseFloat(numericString);
|
|
403
|
-
return isNaN(num) ? 0 : num;
|
|
404
|
-
}
|
|
405
|
-
clearAnswersRecursively(logic) {
|
|
406
|
-
if (!logic || !logic.rows)
|
|
407
|
-
return;
|
|
408
|
-
logic.rows.forEach((row) => {
|
|
409
|
-
row.grid.forEach((item) => {
|
|
410
|
-
const element = item.element;
|
|
411
|
-
if (item.entityType === 'QUESTION' && element) {
|
|
412
|
-
// Clear answer if present
|
|
413
|
-
if ('answer' in element) {
|
|
414
|
-
element.answer = '';
|
|
415
|
-
}
|
|
416
|
-
// Recursively clear childLogics if any
|
|
417
|
-
if (element.childLogics && element.childLogics.length > 0) {
|
|
418
|
-
element.childLogics.forEach((childLogic) => {
|
|
419
|
-
this.clearAnswersRecursively(childLogic);
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
if (item.entityType === 'SUBFORM' && element && element.rows) {
|
|
424
|
-
// SUBFORM contains its own rows structure like a form
|
|
425
|
-
this.clearAnswersRecursively({ rows: element.rows });
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
evaluateCondition(answer, condition, inputValue) {
|
|
431
|
-
switch (condition) {
|
|
432
|
-
case '>':
|
|
433
|
-
return answer > Number(inputValue);
|
|
434
|
-
case '<':
|
|
435
|
-
return answer < Number(inputValue);
|
|
436
|
-
case '>=':
|
|
437
|
-
return answer >= Number(inputValue);
|
|
438
|
-
case '<=':
|
|
439
|
-
return answer <= Number(inputValue);
|
|
440
|
-
case '=':
|
|
441
|
-
return answer == inputValue;
|
|
442
|
-
case '!=':
|
|
443
|
-
return answer != inputValue;
|
|
444
|
-
default:
|
|
445
|
-
return false;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
handleValidation(isValid, message = 'This field is required') {
|
|
449
|
-
if (isValid) {
|
|
450
|
-
this.validationService.clearInvalid(this.buildElementId());
|
|
451
|
-
}
|
|
452
|
-
else {
|
|
453
|
-
// this.validationService.setInvalid(this.question.id, message);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
buildElementId() {
|
|
457
|
-
return this.inLine || this.inCard
|
|
458
|
-
? `${this.submissionIndex}-${this.question.id}`
|
|
459
|
-
: `${this.question.id}`;
|
|
460
|
-
}
|
|
461
|
-
get isInvalid() {
|
|
462
|
-
return !!this.validationService.getErrorMessage(this.buildElementId());
|
|
463
|
-
}
|
|
464
|
-
get errorMessage() {
|
|
465
|
-
return this.validationService.getErrorMessage(this.buildElementId());
|
|
466
|
-
}
|
|
467
|
-
ngAfterViewInit() {
|
|
468
|
-
if (this.inLine || this.inCard) {
|
|
469
|
-
this.elementId = `question-${this.submissionIndex}-${this.question.id}`;
|
|
470
|
-
}
|
|
471
|
-
else {
|
|
472
|
-
this.elementId = `question-${this.question.id}`;
|
|
473
|
-
}
|
|
474
|
-
this.tracker.registerElement(this.elementId);
|
|
475
|
-
}
|
|
476
|
-
ngOnDestroy() {
|
|
477
|
-
if (this.elementId) {
|
|
478
|
-
this.tracker.unregisterElement(this.elementId);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CurrencyFieldsComponent, deps: [{ token: i1.ValidationService }, { token: i2.ElementTrackerService }, { token: i3.AggregationFunctionService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
482
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CurrencyFieldsComponent, selector: "lib-currency-fields", inputs: { question: "question", inLine: "inLine", inCard: "inCard", submissionIndex: "submissionIndex", disableEdit: "disableEdit", rowId: "rowId" }, outputs: { answerChange: "answerChange" }, ngImport: i0, template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label>{{ question.question }}</label\n > \n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n\n <div class=\"currency-input inside\">\n <span *ngIf=\"symbolPosition === 'Before the value'\" class=\"currency-symbol left\">\n {{ currencySymbol }}\n </span>\n\n <input\n type=\"text\"\n class=\"form-control mb-2 height\"\n [placeholder]=\"placeholder\"\n [class.hide-spin-buttons]=\"true\"\n (blur)=\"validateNumber()\"\n [(ngModel)]=\"enteredAmount\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredAmount)\"\n (input)=\"validateInput($event)\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n (wheel)=\"preventNumberScroll($event)\"\n [disabled]=\"disableEdit\"\n />\n\n <span *ngIf=\"symbolPosition === 'After the value'\" class=\"currency-symbol right\">\n {{ currencySymbol }}\n </span>\n\n </div>\n <div *ngIf=\"showAmountInWords && amountInWordsText\" class=\"amount-in-words\">\n {{ amountInWordsText }}\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredAmount)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger error-message\">\n {{ validationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.hide-spin-buttons::-webkit-outer-spin-button,.hide-spin-buttons::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}.currency-input.inside{position:relative}.currency-input.inside input{padding-left:.75rem;padding-right:.75rem}.currency-input.inside .currency-symbol{position:absolute;top:50%;transform:translateY(-50%);color:#444;font-weight:700;pointer-events:none;white-space:nowrap}.currency-input.inside .currency-symbol.left{left:1%}.currency-input.inside .currency-symbol.left+input{padding-left:6ch}.currency-input.inside input+.currency-symbol.right{right:10px;padding-right:4ch}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
483
|
-
}
|
|
484
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CurrencyFieldsComponent, decorators: [{
|
|
485
|
-
type: Component,
|
|
486
|
-
args: [{ selector: 'lib-currency-fields', template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label>{{ question.question }}</label\n > \n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n\n <div class=\"currency-input inside\">\n <span *ngIf=\"symbolPosition === 'Before the value'\" class=\"currency-symbol left\">\n {{ currencySymbol }}\n </span>\n\n <input\n type=\"text\"\n class=\"form-control mb-2 height\"\n [placeholder]=\"placeholder\"\n [class.hide-spin-buttons]=\"true\"\n (blur)=\"validateNumber()\"\n [(ngModel)]=\"enteredAmount\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredAmount)\"\n (input)=\"validateInput($event)\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n (wheel)=\"preventNumberScroll($event)\"\n [disabled]=\"disableEdit\"\n />\n\n <span *ngIf=\"symbolPosition === 'After the value'\" class=\"currency-symbol right\">\n {{ currencySymbol }}\n </span>\n\n </div>\n <div *ngIf=\"showAmountInWords && amountInWordsText\" class=\"amount-in-words\">\n {{ amountInWordsText }}\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredAmount)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger error-message\">\n {{ validationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.hide-spin-buttons::-webkit-outer-spin-button,.hide-spin-buttons::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}.currency-input.inside{position:relative}.currency-input.inside input{padding-left:.75rem;padding-right:.75rem}.currency-input.inside .currency-symbol{position:absolute;top:50%;transform:translateY(-50%);color:#444;font-weight:700;pointer-events:none;white-space:nowrap}.currency-input.inside .currency-symbol.left{left:1%}.currency-input.inside .currency-symbol.left+input{padding-left:6ch}.currency-input.inside input+.currency-symbol.right{right:10px;padding-right:4ch}\n"] }]
|
|
487
|
-
}], ctorParameters: function () { return [{ type: i1.ValidationService }, { type: i2.ElementTrackerService }, { type: i3.AggregationFunctionService }]; }, propDecorators: { question: [{
|
|
488
|
-
type: Input
|
|
489
|
-
}], inLine: [{
|
|
490
|
-
type: Input
|
|
491
|
-
}], inCard: [{
|
|
492
|
-
type: Input
|
|
493
|
-
}], submissionIndex: [{
|
|
494
|
-
type: Input
|
|
495
|
-
}], disableEdit: [{
|
|
496
|
-
type: Input
|
|
497
|
-
}], answerChange: [{
|
|
498
|
-
type: Output
|
|
499
|
-
}], rowId: [{
|
|
500
|
-
type: Input
|
|
501
|
-
}] } });
|
|
502
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc3VibWlzc2lvbi9zcmMvZm9ybS1maWVsZHMvY3VycmVuY3ktZmllbGRzL2N1cnJlbmN5LWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL2Zvcm0tZmllbGRzL2N1cnJlbmN5LWZpZWxkcy9jdXJyZW5jeS1maWVsZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWlCdkUsTUFBTSxPQUFPLHVCQUF1QjtJQStCbEMsWUFDVSxpQkFBb0MsRUFDcEMsT0FBOEIsRUFDOUIsZ0JBQTRDO1FBRjVDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE0QjtRQWpDN0MsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUNuQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDNUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFLckMsQ0FBQztRQUdMLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBR3pCLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBRTVCLG1CQUFjLEdBQVcsa0JBQWtCLENBQUM7UUFFNUMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRW5DLHFCQUFnQixHQUFZLEtBQUss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dUJBQXVCLDRQQ2pCcEMsdW1HQXFGQTs7NEZEcEVhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7cUxBS3RCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFNRSxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudFRyYWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxlbWVudC10cmFja2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWdncmVnYXRpb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hZ2dyZWdhdGUuc2VydmljZSc7XG50eXBlIEN1cnJlbmN5TWV0YSA9IHtcbiAgY29kZXM6IHN0cmluZ1tdO1xuICBzeW1ib2xzPzogc3RyaW5nW107XG4gIG1haW5Vbml0OiBzdHJpbmc7XG4gIHN1YlVuaXQ6IHN0cmluZztcbiAgZGVjaW1hbHM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXJyZW5jeS1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5RmllbGRzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcXVlc3Rpb246IGFueSA9IHt9O1xuICBASW5wdXQoKSBpbkxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5DYXJkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pc3Npb25JbmRleCE6IG51bWJlcjtcbiAgQElucHV0KCkgZGlzYWJsZUVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGFuc3dlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGFuc3dlcjogYW55O1xuICAgIG1heFBvc3NpYmxlU2NvcmU/OiBudW1iZXI7XG4gICAgYW1vdW50SW5Xb3Jkczogc3RyaW5nO1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gIH0+KCk7XG4gIEBJbnB1dCgpIHJvd0lkOiBhbnk7XG5cbiAgY291bnQ6IG51bWJlciA9IDA7XG4gIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIGhpbnQ6IHN0cmluZyA9ICcnO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIG1pbiE6IG51bWJlcjtcbiAgbWF4ITogbnVtYmVyO1xuICBjdXJyZW5jeVN5bWJvbDogc3RyaW5nID0gJyc7XG4gIGRlY2ltYWxQcmVjaXNpb24hOiBudW1iZXI7XG4gIHN5bWJvbFBvc2l0aW9uOiBzdHJpbmcgPSAnQmVmb3JlIHRoZSB2YWx1ZSc7XG4gIHRob3VzYW5kU2VwYXJhdG9yITogYm9vbGVhbjtcbiAgc2hvd0Ftb3VudEluV29yZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZW50ZXJlZEFtb3VudCE6IHN0cmluZztcbiAgdmFsaWRhdGlvbkZhaWxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgZWxlbWVudElkOiBzdHJpbmcgPSAnJztcbiAgYW1vdW50SW5Xb3Jkc1RleHQ6IHN0cmluZyA9ICcnO1xuICBkZWZhdWx0Q3VycmVuY3k6c3RyaW5nPScnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRyYWNrZXI6IEVsZW1lbnRUcmFja2VyU2VydmljZSxcbiAgICBwcml2YXRlIGFnZ3JlZ2F0ZVNlcnZpY2U6IEFnZ3JlZ2F0aW9uRnVuY3Rpb25TZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnZhbHVlQXNzaWduZWQoKTtcbiAgfVxuXG4gIHZhbHVlQXNzaWduZWQoKSB7XG4gICAgdGhpcy5jb3VudCA9IHRoaXMucXVlc3Rpb24uY291bnQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IHRoaXMucXVlc3Rpb24ucmVxdWlyZWQ7XG4gICAgdGhpcy5oaW50ID0gdGhpcy5xdWVzdGlvbi5oaW50O1xuICAgIHRoaXMuZGVmYXVsdEN1cnJlbmN5PXRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmRlZmF1bHRDdXJyZW5jeSB8fCAnJztcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8ucGxhY2Vob2xkZXIgfHwgJyc7XG4gICAgdGhpcy5jdXJyZW5jeVN5bWJvbCA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sO1xuICAgIHRoaXMuZGVjaW1hbFByZWNpc2lvbiA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5kZWNpbWFsUHJlY2lzaW9uIHx8IDI7XG4gICAgdGhpcy5zeW1ib2xQb3NpdGlvbiA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5zeW1ib2xQb3NpdGlvbiB8fFxuICAgICAgJ0JlZm9yZSB0aGUgdmFsdWUnO1xuICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgPVxuICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8udGhvdXNhbmRTZXBhcmF0b3I7XG4gICAgdGhpcy5taW4gPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LnZhbGlkYXRpb24ubWluO1xuICAgIHRoaXMubWF4ID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLm1heDtcbiAgICB0aGlzLnNob3dBbW91bnRJbldvcmRzID1cbiAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LnNob3dBbW91bnRJbldvcmRzO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeSkge1xuICAgICAgbGV0IHVzZXJMb2NhbGVDdXJlZW5jeSA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5O1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jdXJyZW5jeU9wdGlvbikge1xuICAgICAgICBsZXQgY3VycmVuY3lPcHRpb24gPVxuICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jdXJyZW5jeU9wdGlvbjtcbiAgICAgICAgaWYgKGN1cnJlbmN5T3B0aW9uID09ICdhdXRvJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5saW1pdEN1cnJlbmN5U3ltYm9sICYmXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UubGltaXRDdXJyZW5jeVN5bWJvbC5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmxpbWl0Q3VycmVuY3lTeW1ib2wuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgdXNlckxvY2FsZUN1cmVlbmN5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA/IHVzZXJMb2NhbGVDdXJlZW5jeVxuICAgICAgICAgICAgICAgIDogdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uY3VycmVuY3lTeW1ib2w7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lTeW1ib2wgPSB1c2VyTG9jYWxlQ3VyZWVuY3k7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbmN5T3B0aW9uID09ICdzcGVjaWZpYycpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LnNwZWNpZmljQ3VycmVuY3lTeW1ib2w7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VycmVuY3lTeW1ib2wgJiZcbiAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sXG4gICAgKSB7XG4gICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uY3VycmVuY3lTeW1ib2w7XG4gICAgfVxuICAgIGlmKHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmRlZmF1bHRDdXJyZW5jeSl7XG4gICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uZGVmYXVsdEN1cnJlbmN5O1xuICAgIH1cbiAgICBpZih0aGlzLnF1ZXN0aW9uLmFuc3dlckN1cnJlbmN5KXtcbiAgICAgIHRoaXMuY3VycmVuY3lTeW1ib2w9dGhpcy5xdWVzdGlvbi5hbnN3ZXJDdXJyZW5jeTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmFuc3dlcikge1xuICAgICAgdGhpcy5pbml0aWFsaXplQW5zd2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dBbW91bnRJbldvcmRzKSB7XG4gICAgICB0aGlzLmFtb3VudEluV29yZHNUZXh0ID0gdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5jaGlsZExvZ2ljcyAmJiB0aGlzLnF1ZXN0aW9uLmFuc3dlcikge1xuICAgICAgdGhpcy51cGRhdGVDaGlsZExvZ2ljcyh0aGlzLnF1ZXN0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5hZ2dyZWdhdGVTZXJ2aWNlLnNldE51bWJlckZpZWxkKFxuICAgICAgdGhpcy5yb3dJZCxcbiAgICAgIHRoaXMucXVlc3Rpb24uaWQsXG4gICAgICB0aGlzLnF1ZXN0aW9uLmFuc3dlclxuICAgICk7XG4gIH1cblxuICBpbml0aWFsaXplQW5zd2VyKCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMucXVlc3Rpb24/LmFuc3dlcjtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgLy8gY2hlY2sgaWYgbnVtZXJpY1xuICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgIGlmICh0aGlzLnRob3VzYW5kU2VwYXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgICAgcGFydHNbMF0gPSBOdW1iZXIocGFydHNbMF0pLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpOyAvLyBhZGRzIHByb3BlciB0aG91c2FuZCBzZXBhcmF0b3JcbiAgICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW50ZXJlZEFtb3VudCA9IHZhbHVlO1xuICB9XG5cbiAgcHJldmVudE51bWJlclNjcm9sbChldmVudDogV2hlZWxFdmVudCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVOdW1iZXIoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gZmFsc2U7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgbGV0IGVudGVyZWRBbW91bnQgPSB0aGlzLnBhcnNlQ3VycmVuY3lUb051bWJlcih0aGlzLmVudGVyZWRBbW91bnQpO1xuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICFlbnRlcmVkQW1vdW50KSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnRgO1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnRgO1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIGVudGVyZWRBbW91bnQgPCB0aGlzLm1pbikgfHxcbiAgICAgICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmIGVudGVyZWRBbW91bnQgPiB0aGlzLm1heClcbiAgICApIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkZhaWxlZCA9IHRydWU7XG5cbiAgICAgIC8vIENvbnN0cnVjdCBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uIG1lc3NhZ2UgYmFzZWQgb24gd2hldGhlciBtaW4sIG1heCwgb3IgYm90aCBhcmUgcHJvdmlkZWRcbiAgICAgIGlmICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnQgYmV0d2VlbiAke3RoaXMubWlufSBhbmQgJHt0aGlzLm1heH1gO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIHZhbGlkIGFtb3VudCBiZXR3ZWVuICR7dGhpcy5taW59IGFuZCAke3RoaXMubWF4fWA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSBhbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dGhpcy5taW59YDtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSBhbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dGhpcy5taW59YDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIGFtb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt0aGlzLm1heH1gO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIGFtb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt0aGlzLm1heH1gO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uY2hpbGRMb2dpY3MpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRMb2dpY3ModGhpcy5xdWVzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnB1dChldmVudDogYW55KSB7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcblxuICAgIC8vIHJlbW92ZSBleGlzdGluZyBjb21tYXMgJiBjdXJyZW5jeSBzeW1ib2xcbiAgICBsZXQgcmF3VmFsdWU6IHN0cmluZyA9IChldmVudC50YXJnZXQudmFsdWUgfHwgJycpXG4gICAgICAucmVwbGFjZSgvLC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKHRoaXMuY3VycmVuY3lTeW1ib2wgfHwgJycsICcnKTtcblxuICAgIC8vIHJlbW92ZSBhbnkgY2hhcmFjdGVycyBleGNlcHQgZGlnaXRzIGFuZCBkb3RcbiAgICByYXdWYWx1ZSA9IHJhd1ZhbHVlLnJlcGxhY2UoL1teXFxkLl0vZywgJycpO1xuXG4gICAgLy8ga2VlcCBvbmx5IHRoZSBmaXJzdCBkb3QgKHJlbW92ZSBhbnkgYWRkaXRpb25hbCBkb3RzKVxuICAgIGNvbnN0IGZpcnN0RG90ID0gcmF3VmFsdWUuaW5kZXhPZignLicpO1xuICAgIGlmIChmaXJzdERvdCAhPT0gLTEpIHtcbiAgICAgIC8vIHNwbGl0IGludG8gYmVmb3JlLWZpcnN0LWRvdCBhbmQgcmVzdCwgcmVtb3ZlIGFkZGl0aW9uYWwgZG90cyBmcm9tIHJlc3RcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJhd1ZhbHVlLnNsaWNlKDAsIGZpcnN0RG90KTtcbiAgICAgIGNvbnN0IGFmdGVyID0gcmF3VmFsdWUuc2xpY2UoZmlyc3REb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJycpO1xuICAgICAgcmF3VmFsdWUgPSBgJHtiZWZvcmV9LiR7YWZ0ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyBkZXRlcm1pbmUgZGVjaW1hbCBwcmVjaXNpb24gdG8gZW5mb3JjZSAoZGVmYXVsdCB0byAyKVxuICAgIGNvbnN0IGRwID1cbiAgICAgIHR5cGVvZiB0aGlzLmRlY2ltYWxQcmVjaXNpb24gPT09ICdudW1iZXInICYmIHRoaXMuZGVjaW1hbFByZWNpc2lvbiA+PSAwXG4gICAgICAgID8gdGhpcy5kZWNpbWFsUHJlY2lzaW9uXG4gICAgICAgIDogMjtcblxuICAgIC8vIGlmIHRoZXJlJ3MgYSBkZWNpbWFsIHBhcnQsIHRyaW0gaXQgdG8gYWxsb3dlZCBsZW5ndGhcbiAgICBpZiAocmF3VmFsdWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgY29uc3QgW2ludFBhcnQsIGRlY2ltYWxQYXJ0ID0gJyddID0gcmF3VmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IHRyaW1tZWREZWNpbWFsID0gZGVjaW1hbFBhcnQuc2xpY2UoMCwgZHApO1xuICAgICAgcmF3VmFsdWUgPSB0cmltbWVkRGVjaW1hbFxuICAgICAgICA/IGAke2ludFBhcnR9LiR7dHJpbW1lZERlY2ltYWx9YFxuICAgICAgICA6IGludFBhcnQgKyAnLic7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IHdpdGggdGhvdXNhbmQgc2VwYXJhdG9yIGZvciBkaXNwbGF5XG4gICAgbGV0IGZvcm1hdHRlZFZhbHVlID0gcmF3VmFsdWU7XG4gICAgaWYgKHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgJiYgcmF3VmFsdWUpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcmF3VmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZXJlIHVzZXIgdHlwZXMgXCIuMTJcIiAtPiBwYXJ0c1swXSA9PT0gJydcbiAgICAgIGNvbnN0IGludFBhcnRGb3JGb3JtYXQgPSBwYXJ0c1swXSA9PT0gJycgPyAnMCcgOiBwYXJ0c1swXTtcbiAgICAgIHBhcnRzWzBdID0gTnVtYmVyKGludFBhcnRGb3JGb3JtYXQpLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpO1xuICAgICAgZm9ybWF0dGVkVmFsdWUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICAvLyBpZiBvcmlnaW5hbCBoYWQgbGVhZGluZyAnLicgKHVzZXIgdHlwZWQgXCIuMTJcIiksIHJlc3RvcmUgaXQgdmlzdWFsbHkgYXMgXCIuMTJcIlxuICAgICAgaWYgKHJhd1ZhbHVlLnN0YXJ0c1dpdGgoJy4nKSAmJiAhZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWUucmVwbGFjZSgvXjAvLCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8ga2VlcCBudW1lcmljIHZlcnNpb24gZm9yIGJhY2tlbmQvY2FsY3VsYXRpb25zXG4gICAgdGhpcy5xdWVzdGlvbi5hbnN3ZXIgPSByYXdWYWx1ZTtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbmN5U3ltYm9sID0gdGhpcy5jdXJyZW5jeVN5bWJvbDtcblxuICAgIC8vIHVwZGF0ZSBmaWVsZCBkaXNwbGF5XG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG5cbiAgICB0aGlzLmFnZ3JlZ2F0ZVNlcnZpY2Uuc2V0TnVtYmVyRmllbGQoXG4gICAgICB0aGlzLnJvd0lkLFxuICAgICAgdGhpcy5xdWVzdGlvbi5pZCxcbiAgICAgIHJhd1ZhbHVlID8gcGFyc2VGbG9hdChyYXdWYWx1ZSkgOiAwXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmNoaWxkTG9naWNzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkTG9naWNzKHRoaXMucXVlc3Rpb24pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93QW1vdW50SW5Xb3Jkcykge1xuICAgICAgdGhpcy5hbW91bnRJbldvcmRzVGV4dCA9IHRoaXMuY29udmVydEFtb3VudFRvV29yZHMocmF3VmFsdWUpO1xuICAgICAgdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzID0gdGhpcy5hbW91bnRJbldvcmRzVGV4dDtcbiAgICB9XG5cbiAgICB0aGlzLmFuc3dlckNoYW5nZS5lbWl0KHtcbiAgICAgIGFuc3dlcjogdGhpcy5xdWVzdGlvbi5hbnN3ZXIsXG4gICAgICBtYXhQb3NzaWJsZVNjb3JlOiAwLFxuICAgICAgYW1vdW50SW5Xb3JkczogdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzLFxuICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3lTeW1ib2xcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlTnVtYmVyKCk7XG4gIH1cblxuICAvLyAyKSB0eXBlZCBjdXJyZW5jeSBtYXBcbiAgcHJpdmF0ZSBjdXJyZW5jeU1hcDogUmVjb3JkPHN0cmluZywgQ3VycmVuY3lNZXRhPiA9IHtcbiAgICBVU0Q6IHtcbiAgICAgIGNvZGVzOiBbJ1VTRCddLFxuICAgICAgc3ltYm9sczogWyckJywgJ1VTJCddLFxuICAgICAgbWFpblVuaXQ6ICdEb2xsYXJzJyxcbiAgICAgIHN1YlVuaXQ6ICdDZW50cycsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIElOUjoge1xuICAgICAgY29kZXM6IFsnSU5SJ10sXG4gICAgICBzeW1ib2xzOiBbJ+KCuScsICdScycsICfigqgnXSxcbiAgICAgIG1haW5Vbml0OiAnUnVwZWVzJyxcbiAgICAgIHN1YlVuaXQ6ICdQYWlzYScsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIEVVUjoge1xuICAgICAgY29kZXM6IFsnRVVSJ10sXG4gICAgICBzeW1ib2xzOiBbJ+KCrCddLFxuICAgICAgbWFpblVuaXQ6ICdFdXJvcycsXG4gICAgICBzdWJVbml0OiAnQ2VudHMnLFxuICAgICAgZGVjaW1hbHM6IDIsXG4gICAgfSxcbiAgICBBRUQ6IHtcbiAgICAgIGNvZGVzOiBbJ0FFRCddLFxuICAgICAgc3ltYm9sczogWydBRUQnLCAn2K8u2KUnXSxcbiAgICAgIG1haW5Vbml0OiAnRGlyaGFtcycsXG4gICAgICBzdWJVbml0OiAnRmlscycsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIEdCUDoge1xuICAgICAgY29kZXM6IFsnR0JQJ10sXG4gICAgICBzeW1ib2xzOiBbJ8KjJ10sXG4gICAgICBtYWluVW5pdDogJ1BvdW5kcycsXG4gICAgICBzdWJVbml0OiAnUGVuY2UnLFxuICAgICAgZGVjaW1hbHM6IDIsXG4gICAgfSxcbiAgICBKUFk6IHtcbiAgICAgIGNvZGVzOiBbJ0pQWSddLFxuICAgICAgc3ltYm9sczogWyfCpSddLFxuICAgICAgbWFpblVuaXQ6ICdZZW4nLFxuICAgICAgc3ViVW5pdDogJycsXG4gICAgICBkZWNpbWFsczogMCxcbiAgICB9LFxuICAgIC8vIGFkZCBtb3JlIGVudHJpZXMgYXMgbmVlZGVkXG4gIH07XG5cbiAgLy8gMykgY29udmVydEFtb3VudFRvV29yZHMgdXNpbmcgQ3VycmVuY3lNZXRhIHR5cGluZ1xuICBjb252ZXJ0QW1vdW50VG9Xb3Jkcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICAvLyBwcmVmZXIgY3VycmVuY3lDb2RlIChJU08pIGlmIGF2YWlsYWJsZTsgZmFsbCBiYWNrIHRvIHN5bWJvbFxuICAgIGNvbnN0IGN1cnJlbmN5Q29kZSA9IHRoaXMucXVlc3Rpb24/LmN1cnJlbmN5Q29kZSB8fCBudWxsO1xuICAgIGNvbnN0IGN1cnJlbmN5U3ltYm9sID1cbiAgICAgIHRoaXMucXVlc3Rpb24/LmN1cnJlbmN5U3ltYm9sIHx8IHRoaXMuY3VycmVuY3lTeW1ib2wgfHwgbnVsbDtcblxuICAgIC8vIGZpbmQgY3VycmVuY3kgbWV0YWRhdGEgZnJvbSBtYXA6XG4gICAgbGV0IG1ldGE6IEN1cnJlbmN5TWV0YSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChjdXJyZW5jeUNvZGUpIHtcbiAgICAgIG1ldGEgPSB0aGlzLmN1cnJlbmN5TWFwW2N1cnJlbmN5Q29kZV07XG4gICAgfVxuXG4gICAgaWYgKCFtZXRhICYmIGN1cnJlbmN5U3ltYm9sKSB7XG4gICAgICBtZXRhID0gT2JqZWN0LnZhbHVlcyh0aGlzLmN1cnJlbmN5TWFwKS5maW5kKFxuICAgICAgICAobSkgPT4gQXJyYXkuaXNBcnJheShtLnN5bWJvbHMpICYmIG0uc3ltYm9scy5pbmNsdWRlcyhjdXJyZW5jeVN5bWJvbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGZhbGxiYWNrIGlmIG5vdCBmb3VuZCDigJQgdHlwZWQgYXMgQ3VycmVuY3lNZXRhXG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICBjb25zdCBmYWxsYmFja05hbWUgPSAoXG4gICAgICAgIGN1cnJlbmN5Q29kZSB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbCB8fFxuICAgICAgICAnQ3VycmVuY3knXG4gICAgICApLnRvU3RyaW5nKCk7XG4gICAgICBtZXRhID0ge1xuICAgICAgICBjb2RlczogW2N1cnJlbmN5Q29kZSB8fCBmYWxsYmFja05hbWVdLFxuICAgICAgICBzeW1ib2xzOiBjdXJyZW5jeVN5bWJvbCA/IFtjdXJyZW5jeVN5bWJvbF0gOiBbXSxcbiAgICAgICAgbWFpblVuaXQ6IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgc3ViVW5pdDogJycsXG4gICAgICAgIGRlY2ltYWxzOiAyLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgbnVtZXJpYyBwYXJ0c1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJyk7XG4gICAgY29uc3QgW2ludFBhcnRTdHIgPSAnMCcsIGRlY2ltYWxQYXJ0U3RyID0gJyddID0gbm9ybWFsaXplZC5zcGxpdCgnLicpO1xuXG4gICAgY29uc3QgaW50UGFydE51bSA9IE51bWJlcihpbnRQYXJ0U3RyKSB8fCAwO1xuXG4gICAgLy8gY2FsY3VsYXRlIHN1YnVuaXQgbnVtYmVyIHJvYnVzdGx5OlxuICAgIGNvbnN0IGRwID1cbiAgICAgIHR5cGVvZiBtZXRhLmRlY2ltYWxzID09PSAnbnVtYmVyJyAmJiBtZXRhLmRlY2ltYWxzID49IDBcbiAgICAgICAgPyBtZXRhLmRlY2ltYWxzXG4gICAgICAgIDogMjtcbiAgICBsZXQgc3ViVW5pdE51bWJlciA9IDA7XG5cbiAgICBpZiAoZHAgPiAwICYmIGRlY2ltYWxQYXJ0U3RyKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDEwLCBkcCk7XG4gICAgICBjb25zdCBkZWNEaWdpdHMgPSBkZWNpbWFsUGFydFN0ci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgLy8gaWYgc2hvcnRlciB0aGFuIGRwLCBtdWx0aXBseTsgaWYgbG9uZ2VyLCB0cmltIHRvIGRwXG4gICAgICBjb25zdCB0cmltbWVkID0gZGVjRGlnaXRzLnNsaWNlKDAsIGRwKTtcbiAgICAgIHN1YlVuaXROdW1iZXIgPSBOdW1iZXIodHJpbW1lZCkgKiBNYXRoLnBvdygxMCwgZHAgLSB0cmltbWVkLmxlbmd0aCk7XG4gICAgICAvLyBndWFyZCBmb3Igcm91bmRpbmcgb3ZlcmZsb3cgKGUuZy4sIC45OTkgLT4gMS4wMClcbiAgICAgIGlmIChzdWJVbml0TnVtYmVyID49IHNjYWxlKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBpbnRlZ2VyIHBhcnRcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGaW5hbFBocmFzZShpbnRQYXJ0TnVtICsgMSwgMCwgbWV0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGaW5hbFBocmFzZShpbnRQYXJ0TnVtLCBzdWJVbml0TnVtYmVyLCBtZXRhKTtcbiAgfVxuXG4gIC8vIDQpIGJ1aWxkRmluYWxQaHJhc2UgYWNjZXB0cyBDdXJyZW5jeU1ldGEgKG9yIHNhbWUgc2hhcGUpIOKAlCB0eXBlZCBhY2NvcmRpbmdseVxuICBwcml2YXRlIGJ1aWxkRmluYWxQaHJhc2UoXG4gICAgaW50TnVtOiBudW1iZXIsXG4gICAgc3ViTnVtOiBudW1iZXIsXG4gICAgbWV0YTogeyBtYWluVW5pdDogc3RyaW5nOyBzdWJVbml0OiBzdHJpbmc7IGRlY2ltYWxzOiBudW1iZXIgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG1haW5Xb3JkcyA9IHRoaXMubnVtYmVyVG9Xb3JkcyhpbnROdW0pIHx8ICdaZXJvJztcblxuICAgIGlmIChtZXRhLmRlY2ltYWxzID09PSAwIHx8ICFtZXRhLnN1YlVuaXQpIHtcbiAgICAgIHJldHVybiBgJHttYWluV29yZHN9ICR7bWV0YS5tYWluVW5pdH0gT25seWA7XG4gICAgfVxuXG4gICAgaWYgKCFzdWJOdW0pIHtcbiAgICAgIHJldHVybiBgJHttYWluV29yZHN9ICR7bWV0YS5tYWluVW5pdH0gT25seWA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViV29yZHMgPSB0aGlzLm51bWJlclRvV29yZHMoc3ViTnVtKTtcbiAgICByZXR1cm4gYCR7bWFpbldvcmRzfSAke21ldGEubWFpblVuaXR9IGFuZCAke3N1YldvcmRzfSAke21ldGEuc3ViVW5pdH0gT25seWA7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE5VTUJFUiDihpIgV09SRFMgKFVwIHRvIENyb3JlcylcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBudW1iZXJUb1dvcmRzKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobnVtID09PSAwKSByZXR1cm4gJ1plcm8nO1xuXG4gICAgY29uc3QgYSA9IFtcbiAgICAgICcnLFxuICAgICAgJ09uZScsXG4gICAgICAnVHdvJyxcbiAgICAgICdUaHJlZScsXG4gICAgICAnRm91cicsXG4gICAgICAnRml2ZScsXG4gICAgICAnU2l4JyxcbiAgICAgICdTZXZlbicsXG4gICAgICAnRWlnaHQnLFxuICAgICAgJ05pbmUnLFxuICAgICAgJ1RlbicsXG4gICAgICAnRWxldmVuJyxcbiAgICAgICdUd2VsdmUnLFxuICAgICAgJ1RoaXJ0ZWVuJyxcbiAgICAgICdGb3VydGVlbicsXG4gICAgICAnRmlmdGVlbicsXG4gICAgICAnU2l4dGVlbicsXG4gICAgICAnU2V2ZW50ZWVuJyxcbiAgICAgICdFaWdodGVlbicsXG4gICAgICAnTmluZXRlZW4nLFxuICAgIF07XG4gICAgY29uc3QgYiA9IFtcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnVHdlbnR5JyxcbiAgICAgICdUaGlydHknLFxuICAgICAgJ0ZvcnR5JyxcbiAgICAgICdGaWZ0eScsXG4gICAgICAnU2l4dHknLFxuICAgICAgJ1NldmVudHknLFxuICAgICAgJ0VpZ2h0eScsXG4gICAgICAnTmluZXR5JyxcbiAgICBdO1xuXG4gICAgY29uc3QgdG9Xb3JkcyA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKG4gPCAyMCkgcmV0dXJuIGFbbl07XG4gICAgICBpZiAobiA8IDEwMCkgcmV0dXJuIGAke2JbTWF0aC5mbG9vcihuIC8gMTApXX0gJHthW24gJSAxMF19YC50cmltKCk7XG4gICAgICBpZiAobiA8IDEwMDApXG4gICAgICAgIHJldHVybiBgJHthW01hdGguZmxvb3IobiAvIDEwMCldfSBIdW5kcmVkICR7dG9Xb3JkcyhuICUgMTAwKX1gLnRyaW0oKTtcbiAgICAgIGlmIChuIDwgMTAwMDAwKVxuICAgICAgICByZXR1cm4gYCR7dG9Xb3JkcyhNYXRoLmZsb29yKG4gLyAxMDAwKSl9IFRob3VzYW5kICR7dG9Xb3JkcyhcbiAgICAgICAgICBuICUgMTAwMFxuICAgICAgICApfWAudHJpbSgpO1xuICAgICAgaWYgKG4gPCAxMDAwMDAwMClcbiAgICAgICAgcmV0dXJuIGAke3RvV29yZHMoTWF0aC5mbG9vcihuIC8gMTAwMDAwKSl9IExha2ggJHt0b1dvcmRzKFxuICAgICAgICAgIG4gJSAxMDAwMDBcbiAgICAgICAgKX1gLnRyaW0oKTtcbiAgICAgIHJldHVybiBgJHt0b1dvcmRzKE1hdGguZmxvb3IobiAvIDEwMDAwMDAwKSl9IENyb3JlICR7dG9Xb3JkcyhcbiAgICAgICAgbiAlIDEwMDAwMDAwXG4gICAgICApfWAudHJpbSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdG9Xb3JkcyhudW0pO1xuICB9XG5cbiAgdXBkYXRlQ2hpbGRMb2dpY3MocXVlc3Rpb246IGFueSkge1xuICAgIGlmIChxdWVzdGlvbi5jaGlsZExvZ2ljcyAmJiBBcnJheS5pc0FycmF5KHF1ZXN0aW9uLmNoaWxkTG9naWNzKSkge1xuICAgICAgcXVlc3Rpb24uY2hpbGRMb2dpY3MuZm9yRWFjaCgoY2hpbGRMb2dpYzogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgcXVlc3Rpb24uYW5zd2VyLFxuICAgICAgICAgICAgY2hpbGRMb2dpYy5jb25kaXRpb24sXG4gICAgICAgICAgICBjaGlsZExvZ2ljLmlucHV0VmFsdWVcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGNoaWxkTG9naWMuc2hvd0xvZ2ljID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZExvZ2ljLnNob3dMb2dpYyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2xlYXJBbnN3ZXJzUmVjdXJzaXZlbHkoY2hpbGRMb2dpYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ3VycmVuY3lUb051bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gMDtcblxuICAgIC8vIFJlbW92ZSBjdXJyZW5jeSBzeW1ib2wsIGNvbW1hcywgc3BhY2VzXG4gICAgY29uc3QgbnVtZXJpY1N0cmluZyA9IHZhbHVlXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLmN1cnJlbmN5U3ltYm9sfWAsICdnJyksICcnKSAvLyByZW1vdmUgc3ltYm9sXG4gICAgICAucmVwbGFjZSgvLC9nLCAnJykgLy8gcmVtb3ZlIHRob3VzYW5kIHNlcGFyYXRvcnNcbiAgICAgIC50cmltKCk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIG51bWJlclxuICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQobnVtZXJpY1N0cmluZyk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xuICB9XG5cbiAgY2xlYXJBbnN3ZXJzUmVjdXJzaXZlbHkobG9naWM6IGFueSkge1xuICAgIGlmICghbG9naWMgfHwgIWxvZ2ljLnJvd3MpIHJldHVybjtcblxuICAgIGxvZ2ljLnJvd3MuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgIHJvdy5ncmlkLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXRlbS5lbGVtZW50O1xuXG4gICAgICAgIGlmIChpdGVtLmVudGl0eVR5cGUgPT09ICdRVUVTVElPTicgJiYgZWxlbWVudCkge1xuICAgICAgICAgIC8vIENsZWFyIGFuc3dlciBpZiBwcmVzZW50XG4gICAgICAgICAgaWYgKCdhbnN3ZXInIGluIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYW5zd2VyID0gJyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2xlYXIgY2hpbGRMb2dpY3MgaWYgYW55XG4gICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRMb2dpY3MgJiYgZWxlbWVudC5jaGlsZExvZ2ljcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNoaWxkTG9naWNzLmZvckVhY2goKGNoaWxkTG9naWM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyQW5zd2Vyc1JlY3Vyc2l2ZWx5KGNoaWxkTG9naWMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0uZW50aXR5VHlwZSA9PT0gJ1NVQkZPUk0nICYmIGVsZW1lbnQgJiYgZWxlbWVudC5yb3dzKSB7XG4gICAgICAgICAgLy8gU1VCRk9STSBjb250YWlucyBpdHMgb3duIHJvd3Mgc3RydWN0dXJlIGxpa2UgYSBmb3JtXG4gICAgICAgICAgdGhpcy5jbGVhckFuc3dlcnNSZWN1cnNpdmVseSh7IHJvd3M6IGVsZW1lbnQucm93cyB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBldmFsdWF0ZUNvbmRpdGlvbihhbnN3ZXI6IGFueSwgY29uZGl0aW9uOiBhbnksIGlucHV0VmFsdWU6IGFueSkge1xuICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA+IE51bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgIGNhc2UgJzwnOlxuICAgICAgICByZXR1cm4gYW5zd2VyIDwgTnVtYmVyKGlucHV0VmFsdWUpO1xuICAgICAgY2FzZSAnPj0nOlxuICAgICAgICByZXR1cm4gYW5zd2VyID49IE51bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA8PSBOdW1iZXIoaW5wdXRWYWx1ZSk7XG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA9PSBpbnB1dFZhbHVlO1xuICAgICAgY2FzZSAnIT0nOlxuICAgICAgICByZXR1cm4gYW5zd2VyICE9IGlucHV0VmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVmFsaWRhdGlvbihcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJ1xuICApIHtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy52YWxpZGF0aW9uU2VydmljZS5zZXRJbnZhbGlkKHRoaXMucXVlc3Rpb24uaWQsIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbkxpbmUgfHwgdGhpcy5pbkNhcmRcbiAgICAgID8gYCR7dGhpcy5zdWJtaXNzaW9uSW5kZXh9LSR7dGhpcy5xdWVzdGlvbi5pZH1gXG4gICAgICA6IGAke3RoaXMucXVlc3Rpb24uaWR9YDtcbiAgfVxuXG4gIGdldCBpc0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRFcnJvck1lc3NhZ2UodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgfVxuXG4gIGdldCBlcnJvck1lc3NhZ2UoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvblNlcnZpY2UuZ2V0RXJyb3JNZXNzYWdlKHRoaXMuYnVpbGRFbGVtZW50SWQoKSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaW5MaW5lIHx8IHRoaXMuaW5DYXJkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRJZCA9IGBxdWVzdGlvbi0ke3RoaXMuc3VibWlzc2lvbkluZGV4fS0ke3RoaXMucXVlc3Rpb24uaWR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50SWQgPSBgcXVlc3Rpb24tJHt0aGlzLnF1ZXN0aW9uLmlkfWA7XG4gICAgfVxuXG4gICAgdGhpcy50cmFja2VyLnJlZ2lzdGVyRWxlbWVudCh0aGlzLmVsZW1lbnRJZCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50SWQpIHtcbiAgICAgIHRoaXMudHJhY2tlci51bnJlZ2lzdGVyRWxlbWVudCh0aGlzLmVsZW1lbnRJZCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIFtuZ0NsYXNzXT1cInsgJ21iLTQnOiAhaW5MaW5lIH1cIlxuICBjbGFzcz1cInB4LTNcIlxuICBbaWRdPVwiKGluTGluZSB8fCBpbkNhcmQpID8gJ3F1ZXN0aW9uLScgKyBzdWJtaXNzaW9uSW5kZXggKyAnLScgKyBxdWVzdGlvbi5pZCA6ICdxdWVzdGlvbi0nICsgcXVlc3Rpb24uaWRcIlxuICBbYXR0ci5uYW1lXT1cInF1ZXN0aW9uLnRlc3RFbGVtZW50TmFtZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1iLTJcIiAqbmdJZj1cIiFpbkxpbmVcIj5cbiAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24ucXVlc3Rpb25OdW1iZXJcIiBbaW5uZXJIVE1MXT1cInF1ZXN0aW9uLnF1ZXN0aW9uTnVtYmVyXCI+PC9kaXY+XG4gICAgPHNwYW4gKm5nSWY9XCJxdWVzdGlvbi5xdWVzdGlvbk51bWJlclwiIGNsYXNzPVwic3BhY2VcIj48L3NwYW4+XG4gICAgPGxhYmVsPnt7IHF1ZXN0aW9uLnF1ZXN0aW9uIH19PC9sYWJlbFxuICAgID4mbmJzcDtcbiAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJxdWVzdGlvbj8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic3ZnLXdyYXBwZXIgbWItMiBoaW50SWNvblwiXG4gICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImhpbnRcIlxuICAgICAgKm5nSWY9XCJoaW50XCJcbiAgICA+XG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzPVwiaGludFN2Z1wiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMzAgMzBcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgID5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICBkPVwiTTE1IDI2LjI1VjI2LjI1QzguNzg2MjUgMjYuMjUgMy43NSAyMS4yMTM4IDMuNzUgMTVWMTVDMy43NSA4Ljc4NjI1IDguNzg2MjUgMy43NSAxNSAzLjc1VjMuNzVDMjEuMjEzOCAzLjc1IDI2LjI1IDguNzg2MjUgMjYuMjUgMTVWMTVDMjYuMjUgMjEuMjEzOCAyMS4yMTM4IDI2LjI1IDE1IDI2LjI1WlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNSAxNi41NjIzVjE2LjI0OThDMTUgMTUuMjI4NSAxNS42MzEyIDE0LjY3NDggMTYuMjYzNyAxNC4yNDk4QzE2Ljg4MTIgMTMuODMzNSAxNy41IDEzLjI5MSAxNy41IDEyLjI5MUMxNy41IDEwLjkwOTggMTYuMzgxMyA5Ljc5MTAyIDE1IDkuNzkxMDJDMTMuNjE4NyA5Ljc5MTAyIDEyLjUgMTAuOTA5OCAxMi41IDEyLjI5MVwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNC45OTg4IDIwQzE0LjgyNjMgMjAgMTQuNjg2MyAyMC4xNCAxNC42ODc1IDIwLjMxMjVDMTQuNjg3NSAyMC40ODUgMTQuODI3NSAyMC42MjUgMTUgMjAuNjI1QzE1LjE3MjUgMjAuNjI1IDE1LjMxMjUgMjAuNDg1IDE1LjMxMjUgMjAuMzEyNUMxNS4zMTI1IDIwLjE0IDE1LjE3MjUgMjAgMTQuOTk4OCAyMFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImN1cnJlbmN5LWlucHV0IGluc2lkZVwiPlxuICAgIDxzcGFuICpuZ0lmPVwic3ltYm9sUG9zaXRpb24gPT09ICdCZWZvcmUgdGhlIHZhbHVlJ1wiIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sIGxlZnRcIj5cbiAgICAgIHt7IGN1cnJlbmN5U3ltYm9sIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgaGVpZ2h0XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtjbGFzcy5oaWRlLXNwaW4tYnV0dG9uc109XCJ0cnVlXCJcbiAgICAoYmx1cik9XCJ2YWxpZGF0ZU51bWJlcigpXCJcbiAgICBbKG5nTW9kZWwpXT1cImVudGVyZWRBbW91bnRcIlxuICAgIFtjbGFzcy5pbnZhbGlkXT1cInZhbGlkYXRpb25GYWlsZWRcIlxuICAgIFtjbGFzcy5pbnZhbGlkLXF1ZXN0aW9uXT1cImlzSW52YWxpZCAmJiAoIWluTGluZSB8fCAhZW50ZXJlZEFtb3VudClcIlxuICAgIChpbnB1dCk9XCJ2YWxpZGF0ZUlucHV0KCRldmVudClcIlxuICAgIFthdHRyLm1pbl09XCJtaW5cIlxuICAgIFthdHRyLm1heF09XCJtYXhcIlxuICAgICh3aGVlbCk9XCJwcmV2ZW50TnVtYmVyU2Nyb2xsKCRldmVudClcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRWRpdFwiXG4gICAgLz5cblxuICAgIDxzcGFuICpuZ0lmPVwic3ltYm9sUG9zaXRpb24gPT09ICdBZnRlciB0aGUgdmFsdWUnXCIgY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2wgcmlnaHRcIj5cbiAgICAgICAge3sgY3VycmVuY3lTeW1ib2wgfX1cbiAgICA8L3NwYW4+XG5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJzaG93QW1vdW50SW5Xb3JkcyAmJiBhbW91bnRJbldvcmRzVGV4dFwiIGNsYXNzPVwiYW1vdW50LWluLXdvcmRzXCI+XG4gICAge3sgYW1vdW50SW5Xb3Jkc1RleHQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWQgJiYgKCFpbkxpbmUgfHwgIWVudGVyZWRBbW91bnQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgZXJyb3JNZXNzYWdlIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGlvbkZhaWxlZCAmJiAhaXNJbnZhbGlkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgdmFsaWRhdGlvbk1lc3NhZ2UgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|