@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,351 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Injector, Input, Output, } from '@angular/core';
|
|
2
|
-
import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
|
|
3
|
-
import { MatDialogConfig } from '@angular/material/dialog';
|
|
4
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../services/subform-copy.service";
|
|
7
|
-
import * as i2 from "@angular/material/dialog";
|
|
8
|
-
import * as i3 from "../../services/data.service";
|
|
9
|
-
import * as i4 from "../../services/form.service";
|
|
10
|
-
import * as i5 from "../../services/whenClause.service";
|
|
11
|
-
import * as i6 from "../../services/validation.service";
|
|
12
|
-
import * as i7 from "../../services/score.service";
|
|
13
|
-
import * as i8 from "@angular/common";
|
|
14
|
-
import * as i9 from "../../form-fields/check-box-fields/check-box-fields.component";
|
|
15
|
-
import * as i10 from "../../form-fields/date-time-fields/date-time-fields.component";
|
|
16
|
-
import * as i11 from "../../form-fields/drop-down-fields/drop-down-fields.component";
|
|
17
|
-
import * as i12 from "../../form-fields/file-picker-fields/file-picker-fields.component";
|
|
18
|
-
import * as i13 from "../../form-fields/location-fields/location-fields.component";
|
|
19
|
-
import * as i14 from "../../form-fields/mail-fields/mail-fields.component";
|
|
20
|
-
import * as i15 from "../../form-fields/mobile-fields/mobile-fields.component";
|
|
21
|
-
import * as i16 from "../../form-fields/number-fields/number-fields.component";
|
|
22
|
-
import * as i17 from "../../form-fields/password-fields/password-fields.component";
|
|
23
|
-
import * as i18 from "../../form-fields/radio-button-fields/radio-button-fields.component";
|
|
24
|
-
import * as i19 from "../../form-fields/rich-text-editor-fields/rich-text-editor-fields.component";
|
|
25
|
-
import * as i20 from "../../form-fields/selection-matrix-fields/selection-matrix-fields.component";
|
|
26
|
-
import * as i21 from "../../form-fields/signature-fields/signature-fields.component";
|
|
27
|
-
import * as i22 from "../../form-fields/slider-fields/slider-fields.component";
|
|
28
|
-
import * as i23 from "../../form-fields/terms-and-condition-fields/terms-and-condition-fields.component";
|
|
29
|
-
import * as i24 from "../../form-fields/text-area-fields/text-area-fields.component";
|
|
30
|
-
import * as i25 from "../../form-fields/text-fields/text-fields.component";
|
|
31
|
-
import * as i26 from "../../form-fields/toggle-switch-fields/toggle-switch-fields.component";
|
|
32
|
-
import * as i27 from "../../form-fields/url-fields/url-fields.component";
|
|
33
|
-
import * as i28 from "../../form-fields/section-fields/section-fields.component";
|
|
34
|
-
import * as i29 from "../../form-fields/aggregate-function/aggregate-function.component";
|
|
35
|
-
import * as i30 from "../../form-fields/currency-fields/currency-fields.component";
|
|
36
|
-
import * as i31 from "../../form-fields/hidden-field/hidden-field.component";
|
|
37
|
-
import * as i32 from "../../form-fields/iframe-fields/iframe-fields.component";
|
|
38
|
-
import * as i33 from "ngx-quill";
|
|
39
|
-
import * as i34 from "@angular/forms";
|
|
40
|
-
import * as i35 from "../multiple-subform/multiple-subform.component";
|
|
41
|
-
import * as i36 from "../inline-multiple-subform/inline-multiple-subform.component";
|
|
42
|
-
import * as i37 from "../card-subform/card-subform.component";
|
|
43
|
-
export class SubFormComponent {
|
|
44
|
-
constructor(subformCopyService, dialog, dataService, formService, whenClauseService, validationService, scoreCalcService) {
|
|
45
|
-
this.subformCopyService = subformCopyService;
|
|
46
|
-
this.dialog = dialog;
|
|
47
|
-
this.dataService = dataService;
|
|
48
|
-
this.formService = formService;
|
|
49
|
-
this.whenClauseService = whenClauseService;
|
|
50
|
-
this.validationService = validationService;
|
|
51
|
-
this.scoreCalcService = scoreCalcService;
|
|
52
|
-
this.subForm = {};
|
|
53
|
-
this.edit = false;
|
|
54
|
-
this.subFormChange = new EventEmitter();
|
|
55
|
-
this.acceptedLanguage = '';
|
|
56
|
-
this.pages = [];
|
|
57
|
-
this.decodedDescription = '';
|
|
58
|
-
this.childLogicCache = {};
|
|
59
|
-
this.subformDescription = '';
|
|
60
|
-
this.subformTitle = '';
|
|
61
|
-
this.allowCopy = false;
|
|
62
|
-
this.allowDelete = false;
|
|
63
|
-
this.previousSubmissions = [];
|
|
64
|
-
this.dataService.subform$.subscribe((data) => {
|
|
65
|
-
this.subformData = data;
|
|
66
|
-
this.tryLoadPreviousSubmissions();
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
tryLoadPreviousSubmissions() {
|
|
70
|
-
if (this.subformData &&
|
|
71
|
-
this.subForm &&
|
|
72
|
-
!this.edit &&
|
|
73
|
-
this.subForm.submissionCopyConfig?.allowCopyFromOtherSubmissions) {
|
|
74
|
-
this.loadPreviousSubmissions();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
loadPreviousSubmissions() {
|
|
78
|
-
if (this.subformData && Object.keys(this.subformData).length > 0 && !this.edit) {
|
|
79
|
-
this.formService.getSubformSubmissions(this.subformData)?.subscribe({
|
|
80
|
-
next: (response) => {
|
|
81
|
-
this.previousSubmissions = response;
|
|
82
|
-
if (this.subForm.title == this.subformData?.duplicateSubmission?.targetSubForm) {
|
|
83
|
-
const loadedSubmissions = this.createSubmissionsFromApi(this.previousSubmissions, this.subForm);
|
|
84
|
-
const existingSubmissions = this.subForm.submissions ?? [];
|
|
85
|
-
this.subForm = {
|
|
86
|
-
...this.subForm,
|
|
87
|
-
submissions: [
|
|
88
|
-
...existingSubmissions,
|
|
89
|
-
...loadedSubmissions
|
|
90
|
-
]
|
|
91
|
-
};
|
|
92
|
-
const hasAnyScore = this.subForm.submissions.some((sub) => sub.scores?.some((s) => s.score !== null && s.score !== undefined));
|
|
93
|
-
if (hasAnyScore) {
|
|
94
|
-
this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.subForm.submissions, this.maxPossibleGoodScore, this.maxPossibleBadScore);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.subForm.scores = null; // or 0, depending on how you want to represent "no score yet"
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
error: (error) => { }
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
ngOnInit() {
|
|
106
|
-
this.allowCopy = this.subForm.property?.allowCopy;
|
|
107
|
-
this.allowDelete = this.subForm.property?.allowDelete;
|
|
108
|
-
this.copySubFormdata = this.subForm?.copySubformMeta;
|
|
109
|
-
this.tryLoadPreviousSubmissions();
|
|
110
|
-
if (this.subForm.property.subFormStructure == 'single') {
|
|
111
|
-
this.bindAnswersToFormElements();
|
|
112
|
-
this.loadComponent();
|
|
113
|
-
this.whenClauseService.addGridsFromSubform(this.subForm);
|
|
114
|
-
}
|
|
115
|
-
const { goodMax, badMax } = this.scoreCalcService.getMaxPossibleScore(this.subForm);
|
|
116
|
-
this.maxPossibleGoodScore = goodMax;
|
|
117
|
-
this.maxPossibleBadScore = badMax;
|
|
118
|
-
}
|
|
119
|
-
editorCreated(editorInstance) {
|
|
120
|
-
this.editor = editorInstance;
|
|
121
|
-
}
|
|
122
|
-
async loadComponent() {
|
|
123
|
-
this.componentToLoad = await this.loadFormElementsComponent();
|
|
124
|
-
this.injector = this.createInjector();
|
|
125
|
-
}
|
|
126
|
-
async loadFormElementsComponent() {
|
|
127
|
-
const { FormElementsComponent } = await import('../form-elements/form-elements.component');
|
|
128
|
-
return FormElementsComponent;
|
|
129
|
-
}
|
|
130
|
-
createInjector() {
|
|
131
|
-
return Injector.create({
|
|
132
|
-
providers: [
|
|
133
|
-
{ provide: 'grid', useValue: this.grid?.element.childLogics },
|
|
134
|
-
{ provide: 'state', useValue: 'child' },
|
|
135
|
-
],
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
decodeHtml(html) {
|
|
139
|
-
const textArea = document.createElement('textarea');
|
|
140
|
-
textArea.innerHTML = html;
|
|
141
|
-
return textArea.value;
|
|
142
|
-
}
|
|
143
|
-
bindAnswersToFormElements() {
|
|
144
|
-
const bindAnswers = (formElements, submissions) => {
|
|
145
|
-
formElements?.forEach((grids) => {
|
|
146
|
-
grids?.grid?.forEach((formElement) => {
|
|
147
|
-
if (formElement.entityType === 'QUESTION') {
|
|
148
|
-
const submission = submissions.find((sub) => sub.answers.some((ans) => ans.questionId === formElement.element.id));
|
|
149
|
-
if (submission) {
|
|
150
|
-
const answer = submission.answers.find((ans) => ans.questionId === formElement.element.id);
|
|
151
|
-
if (answer) {
|
|
152
|
-
formElement.element.answer = answer.answer;
|
|
153
|
-
formElement.element.answerId = answer.answerId;
|
|
154
|
-
formElement.element.validation = true;
|
|
155
|
-
formElement.element.attachments = answer.attachments;
|
|
156
|
-
formElement.element.amountInWords = answer.amountInWords;
|
|
157
|
-
this.subForm.submissionId = submission.submissionId;
|
|
158
|
-
formElement.element.answerCurrency = answer.answerCurrency;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
if (formElement.element.childLogics) {
|
|
162
|
-
formElement.element.childLogics.forEach((childLogic) => {
|
|
163
|
-
bindAnswers(childLogic.rows, submissions);
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
if (this.subForm && this.subForm.rows && this.subForm.submissions) {
|
|
171
|
-
bindAnswers(this.subForm.rows, this.subForm.submissions);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
updateSubFormWithSubmissions(event) {
|
|
175
|
-
this.subForm = event;
|
|
176
|
-
this.subFormChange.emit(this.subForm);
|
|
177
|
-
}
|
|
178
|
-
ngOnChanges() {
|
|
179
|
-
if (this.subForm.description) {
|
|
180
|
-
this.decodedDescription = this.decodeHtml(this.subForm.description);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
copySubform() {
|
|
184
|
-
const { updatedPages } = this.subformCopyService.copySubform(this.subForm, this.pages);
|
|
185
|
-
this.pages = updatedPages;
|
|
186
|
-
// Emit updated pages or subFormChange if needed
|
|
187
|
-
// Optionally pass meta to parent if needed
|
|
188
|
-
// this.copyMeta.emit(copySubFormMeta);
|
|
189
|
-
}
|
|
190
|
-
updateSubformData(event, subformId, field) {
|
|
191
|
-
if (this.copySubFormdata.id == subformId) {
|
|
192
|
-
this.copySubFormdata[field] = event;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
deleteCopySubform(subformId) {
|
|
196
|
-
const dialogConfig = new MatDialogConfig();
|
|
197
|
-
dialogConfig.data = {
|
|
198
|
-
messageHeader: "Are you sure?",
|
|
199
|
-
message: "Do you want to delete this subform?"
|
|
200
|
-
};
|
|
201
|
-
dialogConfig.hasBackdrop = true;
|
|
202
|
-
dialogConfig.disableClose = true;
|
|
203
|
-
this.dialogRef = this.dialog.open(ConfirmDialogComponent, dialogConfig);
|
|
204
|
-
this.dialogRef.afterClosed().subscribe((result) => {
|
|
205
|
-
if (result) {
|
|
206
|
-
// 1. Remove the copied subform from the pages
|
|
207
|
-
for (const page of this.pages) {
|
|
208
|
-
const rowIndex = page.rows.findIndex((row) => row.grid.some((grid) => grid.entityType === 'SUBFORM' &&
|
|
209
|
-
grid.element?.id === subformId &&
|
|
210
|
-
grid.element?.copied));
|
|
211
|
-
if (rowIndex !== -1) {
|
|
212
|
-
page.rows.splice(rowIndex, 1);
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// 2. Remove this subformId from any subform's copiedForms array
|
|
217
|
-
for (const page of this.pages) {
|
|
218
|
-
for (const row of page.rows) {
|
|
219
|
-
for (const grid of row.grid) {
|
|
220
|
-
if (grid.entityType === 'SUBFORM' && grid.element?.copiedForms) {
|
|
221
|
-
const index = grid.element.copiedForms.indexOf(subformId);
|
|
222
|
-
if (index !== -1) {
|
|
223
|
-
grid.element.copiedForms.splice(index, 1);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
deleteMainSubform(subformId) {
|
|
233
|
-
const dialogConfig = new MatDialogConfig();
|
|
234
|
-
dialogConfig.data = {
|
|
235
|
-
messageHeader: "Are you sure?",
|
|
236
|
-
message: "Do you want to delete this subform?"
|
|
237
|
-
};
|
|
238
|
-
dialogConfig.hasBackdrop = true;
|
|
239
|
-
dialogConfig.disableClose = true;
|
|
240
|
-
this.dialogRef = this.dialog.open(ConfirmDialogComponent, dialogConfig);
|
|
241
|
-
this.dialogRef.afterClosed().subscribe((result) => {
|
|
242
|
-
if (result) {
|
|
243
|
-
for (const page of this.pages) {
|
|
244
|
-
for (const row of page.rows) {
|
|
245
|
-
for (const gridItem of row.grid) {
|
|
246
|
-
if (gridItem.entityType === 'SUBFORM' &&
|
|
247
|
-
gridItem.element?.id === subformId) {
|
|
248
|
-
gridItem.element.deleted = true;
|
|
249
|
-
return; // stop after the first match
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
createSubmissionsFromApi(apiSubmissions, subform) {
|
|
258
|
-
return apiSubmissions.map(apiSubmission => {
|
|
259
|
-
const answers = [];
|
|
260
|
-
subform.rows.forEach((row) => {
|
|
261
|
-
row.grid.forEach((gridItem) => {
|
|
262
|
-
if (gridItem.entityType !== 'QUESTION')
|
|
263
|
-
return;
|
|
264
|
-
const element = gridItem.element;
|
|
265
|
-
const questionKey = element.question;
|
|
266
|
-
if (!apiSubmission.answers || !apiSubmission.answers[questionKey]) {
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const apiAnswer = apiSubmission.answers[questionKey];
|
|
270
|
-
// ✅ CASE 1: File upload (array with name & url)
|
|
271
|
-
if (Array.isArray(apiAnswer) &&
|
|
272
|
-
apiAnswer.length &&
|
|
273
|
-
apiAnswer[0].name &&
|
|
274
|
-
apiAnswer[0].url) {
|
|
275
|
-
answers.push({
|
|
276
|
-
questionId: element.id,
|
|
277
|
-
answer: null,
|
|
278
|
-
attachments: apiAnswer.map((file) => ({
|
|
279
|
-
fileId: file.id,
|
|
280
|
-
fileName: file.name,
|
|
281
|
-
fileUrl: file.url
|
|
282
|
-
})),
|
|
283
|
-
copiedAttachments: apiAnswer.map((file) => file.id)
|
|
284
|
-
});
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
// ✅ CASE 2: Normal question object
|
|
288
|
-
answers.push({
|
|
289
|
-
questionId: element.id,
|
|
290
|
-
answer: apiAnswer.answer ?? null,
|
|
291
|
-
attachments: apiAnswer.file
|
|
292
|
-
? apiAnswer.file.map((file) => ({
|
|
293
|
-
fileName: file.name,
|
|
294
|
-
fileUrl: file.url
|
|
295
|
-
}))
|
|
296
|
-
: undefined,
|
|
297
|
-
scores: apiAnswer.scores,
|
|
298
|
-
maximumPossibleScore: apiAnswer.maximumPossibleScore
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
return {
|
|
303
|
-
submissionId: uuidv4(),
|
|
304
|
-
sourceSubmissionId: apiSubmission.submissionId,
|
|
305
|
-
answers,
|
|
306
|
-
configuration: {
|
|
307
|
-
isDefault: false,
|
|
308
|
-
allowDelete: true
|
|
309
|
-
},
|
|
310
|
-
scores: apiSubmission.score
|
|
311
|
-
};
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
get isInvalid() {
|
|
315
|
-
return !!this.validationService.getErrorMessage(this.subForm.id);
|
|
316
|
-
}
|
|
317
|
-
get errorMessage() {
|
|
318
|
-
return this.validationService.getErrorMessage(this.subForm.id);
|
|
319
|
-
}
|
|
320
|
-
clearInvalid() {
|
|
321
|
-
this.validationService.clearInvalid(this.subForm.id);
|
|
322
|
-
}
|
|
323
|
-
onAnyClick(event) {
|
|
324
|
-
this.clearInvalid();
|
|
325
|
-
}
|
|
326
|
-
ngOnDestroy() {
|
|
327
|
-
if (this.dialogRef) {
|
|
328
|
-
this.dialogRef.close();
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SubFormComponent, deps: [{ token: i1.SubformCopyService }, { token: i2.MatDialog }, { token: i3.DataService }, { token: i4.FormService }, { token: i5.WhenClauseService }, { token: i6.ValidationService }, { token: i7.ScoreCalculationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
332
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SubFormComponent, selector: "lib-sub-form", inputs: { subForm: "subForm", edit: "edit", acceptedLanguage: "acceptedLanguage", pages: "pages" }, outputs: { subFormChange: "subFormChange" }, host: { listeners: { "click": "onAnyClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"outer-container mb-4 px-3\"\n [id]=\"'question-' + subForm.id\"\n [attr.name]=\"subForm.testElementName\"\n *ngIf=\"!subForm.deleted\"\n>\n <div class=\"body py-1 px-1\">\n <div class=\"tab-content pt-4 pb-3 px-3\">\n <ng-container *ngIf=\"!subForm.copied; else copySubformContainer\">\n <div class=\"subform-header\">\n <div class=\"data-container\">\n <p class=\"sectionTitle\">{{ subForm.title }}</p>\n <p [innerHTML]=\"decodedDescription\" class=\"description\"></p>\n </div>\n <div class=\"d-flex gap-3\">\n <div\n class=\"finalScore\"\n *ngFor=\"let s of subForm?.scores\"\n [ngClass]=\"{\n goodScore: s.scoreType === 'GOOD_SCORE',\n badScore: s.scoreType === 'BAD_SCORE'\n }\"\n >\n <span class=\"scoreTitle\">Score</span>\n <p class=\"mb-0\">{{ s.score }}</p>\n </div>\n <div class=\"icon-container\">\n <img\n src=\"assets/icons/copy-icon.svg\"\n alt=\"copy-icon\"\n (click)=\"copySubform()\"\n *ngIf=\"allowCopy\"\n />\n <img\n src=\"assets/icons/delete-icon.svg\"\n class=\"delete-icon ms-3\"\n alt=\"delete icon\"\n (click)=\"deleteMainSubform(subForm.id)\"\n *ngIf=\"allowDelete\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #copySubformContainer>\n <div class=\"d-flex justify-content-end gap-4\">\n <div\n class=\"finalScore\"\n *ngFor=\"let s of subForm?.scores\"\n [ngClass]=\"{\n goodScore: s.scoreType === 'GOOD_SCORE',\n badScore: s.scoreType === 'BAD_SCORE'\n }\"\n >\n <span class=\"scoreTitle\">Score</span>\n <p class=\"mb-0\">{{ s.score }}</p>\n </div>\n <div class=\"icon-container\" (click)=\"deleteCopySubform(subForm.id)\">\n <img\n src=\"assets/icons/delete-icon.svg\"\n class=\"delete-icon\"\n alt=\"delete icon\"\n />\n </div>\n </div>\n <div class=\"copy-subform-container mb-3\">\n <p>Title</p>\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"subformTitle\"\n (ngModelChange)=\"updateSubformData($event, subForm.id, 'title')\"\n />\n <p class=\"mt-3\">Description</p>\n <quill-editor\n [(ngModel)]=\"subformDescription\"\n (ngModelChange)=\"\n updateSubformData($event, subForm.id, 'description')\n \"\n (onEditorCreated)=\"editorCreated($event)\"\n class=\"editor\"\n placeholder=\"\"\n ></quill-editor>\n </div>\n </ng-template>\n\n <div *ngIf=\"subForm.property.subFormStructure == 'multiple'\">\n <lib-multiple-subform\n *ngIf=\"subForm.property.subFormType === 'table'\"\n [subForm]=\"subForm\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-multiple-subform>\n\n <lib-inline-multiple-subform\n *ngIf=\"subForm.property.subFormType === 'inline'\"\n [subForm]=\"subForm\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-inline-multiple-subform>\n <lib-card-subform\n *ngIf=\"subForm.property.subFormType === 'card'\"\n [subForm]=\"subForm\"\n [acceptedLanguage]=\"acceptedLanguage\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [edit]=\"edit\"\n ></lib-card-subform>\n </div>\n <div *ngIf=\"subForm.property.subFormStructure == 'single'\">\n <div *ngFor=\"let row of subForm.rows\">\n <div class=\"d-flex\">\n <div\n *ngFor=\"let grid of row.grid\"\n [ngStyle]=\"{ 'width.%': grid.element.count * (100 / 12) }\"\n >\n <div *ngIf=\"grid.entityType === 'QUESTION' && grid.show\">\n <div [ngSwitch]=\"grid.element.formElement.elementType\">\n <lib-check-box-fields\n *ngSwitchCase=\"'CHECK_BOX'\"\n [question]=\"grid.element\"\n ></lib-check-box-fields>\n <lib-date-time-fields\n *ngSwitchCase=\"'DATE_TIME'\"\n [question]=\"grid.element\"\n ></lib-date-time-fields>\n <lib-drop-down-fields\n *ngSwitchCase=\"'DROP_DOWN'\"\n [question]=\"grid.element\"\n ></lib-drop-down-fields>\n <lib-file-picker-fields\n *ngSwitchCase=\"'FILE_PICKER'\"\n [question]=\"grid.element\"\n ></lib-file-picker-fields>\n <lib-location-fields\n *ngSwitchCase=\"'LOCATION'\"\n [question]=\"grid.element\"\n ></lib-location-fields>\n <lib-mail-fields\n *ngSwitchCase=\"'EMAIL'\"\n [question]=\"grid.element\"\n ></lib-mail-fields>\n <lib-mobile-fields\n *ngSwitchCase=\"'MOBILE'\"\n [question]=\"grid.element\"\n ></lib-mobile-fields>\n <lib-number-fields\n *ngSwitchCase=\"'NUMBER'\"\n [question]=\"grid.element\"\n [rowId]=\"'0'\"\n ></lib-number-fields>\n <lib-password-fields\n *ngSwitchCase=\"'PASSWORD'\"\n [question]=\"grid.element\"\n ></lib-password-fields>\n <lib-radio-button-fields\n *ngSwitchCase=\"'RADIO_BUTTON'\"\n [question]=\"grid.element\"\n ></lib-radio-button-fields>\n <lib-rich-text-editor-fields\n *ngSwitchCase=\"'RICH_TEXT_EDITOR'\"\n [question]=\"grid.element\"\n ></lib-rich-text-editor-fields>\n <lib-selection-matrix-fields\n *ngSwitchCase=\"'SELECTION_MATRIX'\"\n [question]=\"grid.element\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-selection-matrix-fields>\n <lib-signature-fields\n *ngSwitchCase=\"'SIGNATURE'\"\n [question]=\"grid.element\"\n ></lib-signature-fields>\n <lib-slider-fields\n *ngSwitchCase=\"'SLIDER'\"\n [question]=\"grid.element\"\n ></lib-slider-fields>\n <lib-terms-and-condition-fields\n *ngSwitchCase=\"'TERMS_AND_CONDITION'\"\n [question]=\"grid.element\"\n ></lib-terms-and-condition-fields>\n <lib-text-area-fields\n *ngSwitchCase=\"'TEXT_AREA'\"\n [question]=\"grid.element\"\n ></lib-text-area-fields>\n <lib-text-fields\n *ngSwitchCase=\"'TEXT_BOX'\"\n [question]=\"grid.element\"\n ></lib-text-fields>\n <lib-toggle-switch-fields\n *ngSwitchCase=\"'TOGGLE_SWITCH'\"\n [question]=\"grid.element\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-toggle-switch-fields>\n <lib-url-fields\n *ngSwitchCase=\"'URL'\"\n [question]=\"grid.element\"\n ></lib-url-fields>\n <lib-currency-fields\n *ngSwitchCase=\"'CURRENCY'\"\n [question]=\"grid.element\"\n ></lib-currency-fields>\n <lib-aggregate-function\n *ngSwitchCase=\"'AGGREGATE_FUNCTION'\"\n [question]=\"grid.element\"\n [rowId]=\"'0'\"\n ></lib-aggregate-function>\n <lib-hidden-field\n *ngSwitchCase=\"'HIDDEN_FIELD'\"\n [question]=\"grid.element\"\n ></lib-hidden-field>\n <lib-iframe-fields\n *ngSwitchCase=\"'IFRAME_WIDGET'\"\n [question]=\"grid.element\"\n ></lib-iframe-fields>\n </div>\n\n <!-- <ng-container *ngIf=\"grid.element.childLogics\">\n <ng-container\n *ngIf=\"getComponentForChildLogics(grid.element.childLogics, 'child', grid.element.answer) as outlet\">\n <ng-container *ngComponentOutlet=\"outlet.component | async; injector: outlet.injector\">\n </ng-container>\n </ng-container>\n </ng-container> -->\n <ng-container *ngIf=\"grid?.element?.childLogics\">\n <ng-container *ngIf=\"componentToLoad\">\n <ng-container\n *ngComponentOutlet=\"\n componentToLoad;\n inputs: {\n grid: grid?.element?.childLogics,\n answer: grid?.element?.answer,\n state: 'child'\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"grid.entityType === 'SECTION' && grid.show\">\n <lib-section-fields\n [section]=\"grid.element\"\n ></lib-section-fields>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isInvalid\" class=\"error-message mt-4\">\n {{ errorMessage }}\n </div>\n </div>\n </div>\n</div>\n", styles: [".outer-container{background-color:#fff;position:relative}@media (max-width: 576px){.outer-container{padding:8px}}.body{position:relative;background:#efefef;border-radius:6px}.tab-content{background-color:#fff}.sectionTitle{font-size:19px;font-weight:700;margin-bottom:20px;word-break:break-word}.description{font-size:17px;font-weight:500;margin-bottom:18px;word-break:break-word}::ng-deep .description img{max-width:100%}.subform-header{display:flex;justify-content:space-between;margin-bottom:10px}.icon-container{cursor:pointer}.delete-icon{height:36px;width:36px}.finalScore{width:57px;height:52px;border-radius:6px;border:1px solid #c8c8c8;display:flex;flex-direction:column;justify-content:center;align-items:center;font-weight:500}.goodScore{border-color:#50f550}.badScore{border-color:#f08080}.scoreTitle{font-weight:400;font-size:14px;color:#2b2e3e80}.error-message{color:#f44336;font-size:1em;margin-top:4px;padding:0 8px}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i9.CheckBoxFieldsComponent, selector: "lib-check-box-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "rowId", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i10.DateTimeFieldsComponent, selector: "lib-date-time-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i11.DropDownFieldsComponent, selector: "lib-drop-down-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i12.FilePickerFieldsComponent, selector: "lib-file-picker-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange", "inlineDeleteFiles"] }, { kind: "component", type: i13.LocationFieldsComponent, selector: "lib-location-fields", inputs: ["question", "inLine"], outputs: ["answerChange"] }, { kind: "component", type: i14.MailFieldsComponent, selector: "lib-mail-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i15.MobileFieldsComponent, selector: "lib-mobile-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i16.NumberFieldsComponent, selector: "lib-number-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "rowId", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i17.PasswordFieldsComponent, selector: "lib-password-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i18.RadioButtonFieldsComponent, selector: "lib-radio-button-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "rowId", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i19.RichTextEditorFieldsComponent, selector: "lib-rich-text-editor-fields", inputs: ["question", "inLine", "inSubForm", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i20.SelectionMatrixFieldsComponent, selector: "lib-selection-matrix-fields", inputs: ["question", "inLine", "acceptedLanguage", "rowId", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i21.SignatureFieldsComponent, selector: "lib-signature-fields", inputs: ["question", "inLine"] }, { kind: "component", type: i22.SliderFieldsComponent, selector: "lib-slider-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i23.TermsAndConditionFieldsComponent, selector: "lib-terms-and-condition-fields", inputs: ["question", "inLine"] }, { kind: "component", type: i24.TextAreaFieldsComponent, selector: "lib-text-area-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i25.TextFieldsComponent, selector: "lib-text-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i26.ToggleSwitchFieldsComponent, selector: "lib-toggle-switch-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "acceptedLanguage", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i27.UrlFieldsComponent, selector: "lib-url-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i28.SectionFieldsComponent, selector: "lib-section-fields", inputs: ["section"] }, { kind: "component", type: i29.AggregateFunctionComponent, selector: "lib-aggregate-function", inputs: ["question", "inLine", "inCard", "submissionIndex", "rowId", "disableEdit"], outputs: ["answerChange"] }, { kind: "component", type: i30.CurrencyFieldsComponent, selector: "lib-currency-fields", inputs: ["question", "inLine", "inCard", "submissionIndex", "disableEdit", "rowId"], outputs: ["answerChange"] }, { kind: "component", type: i31.HiddenFieldComponent, selector: "lib-hidden-field", inputs: ["question", "inLine", "inCard", "submissionIndex"], outputs: ["answerChange"] }, { kind: "component", type: i32.IframeFieldsComponent, selector: "lib-iframe-fields", inputs: ["question"] }, { kind: "component", type: i33.QuillEditorComponent, selector: "quill-editor" }, { kind: "directive", type: i34.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: i34.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i34.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i35.MultipleSubformComponent, selector: "lib-multiple-subform", inputs: ["subForm", "acceptedLanguage"], outputs: ["subFormChange"] }, { kind: "component", type: i36.InlineMultipleSubformComponent, selector: "lib-inline-multiple-subform", inputs: ["subForm", "acceptedLanguage"], outputs: ["subFormChange"] }, { kind: "component", type: i37.CardSubformComponent, selector: "lib-card-subform", inputs: ["subForm", "acceptedLanguage", "edit"], outputs: ["subFormChange"] }] }); }
|
|
333
|
-
}
|
|
334
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SubFormComponent, decorators: [{
|
|
335
|
-
type: Component,
|
|
336
|
-
args: [{ selector: 'lib-sub-form', template: "<div\n class=\"outer-container mb-4 px-3\"\n [id]=\"'question-' + subForm.id\"\n [attr.name]=\"subForm.testElementName\"\n *ngIf=\"!subForm.deleted\"\n>\n <div class=\"body py-1 px-1\">\n <div class=\"tab-content pt-4 pb-3 px-3\">\n <ng-container *ngIf=\"!subForm.copied; else copySubformContainer\">\n <div class=\"subform-header\">\n <div class=\"data-container\">\n <p class=\"sectionTitle\">{{ subForm.title }}</p>\n <p [innerHTML]=\"decodedDescription\" class=\"description\"></p>\n </div>\n <div class=\"d-flex gap-3\">\n <div\n class=\"finalScore\"\n *ngFor=\"let s of subForm?.scores\"\n [ngClass]=\"{\n goodScore: s.scoreType === 'GOOD_SCORE',\n badScore: s.scoreType === 'BAD_SCORE'\n }\"\n >\n <span class=\"scoreTitle\">Score</span>\n <p class=\"mb-0\">{{ s.score }}</p>\n </div>\n <div class=\"icon-container\">\n <img\n src=\"assets/icons/copy-icon.svg\"\n alt=\"copy-icon\"\n (click)=\"copySubform()\"\n *ngIf=\"allowCopy\"\n />\n <img\n src=\"assets/icons/delete-icon.svg\"\n class=\"delete-icon ms-3\"\n alt=\"delete icon\"\n (click)=\"deleteMainSubform(subForm.id)\"\n *ngIf=\"allowDelete\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #copySubformContainer>\n <div class=\"d-flex justify-content-end gap-4\">\n <div\n class=\"finalScore\"\n *ngFor=\"let s of subForm?.scores\"\n [ngClass]=\"{\n goodScore: s.scoreType === 'GOOD_SCORE',\n badScore: s.scoreType === 'BAD_SCORE'\n }\"\n >\n <span class=\"scoreTitle\">Score</span>\n <p class=\"mb-0\">{{ s.score }}</p>\n </div>\n <div class=\"icon-container\" (click)=\"deleteCopySubform(subForm.id)\">\n <img\n src=\"assets/icons/delete-icon.svg\"\n class=\"delete-icon\"\n alt=\"delete icon\"\n />\n </div>\n </div>\n <div class=\"copy-subform-container mb-3\">\n <p>Title</p>\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"subformTitle\"\n (ngModelChange)=\"updateSubformData($event, subForm.id, 'title')\"\n />\n <p class=\"mt-3\">Description</p>\n <quill-editor\n [(ngModel)]=\"subformDescription\"\n (ngModelChange)=\"\n updateSubformData($event, subForm.id, 'description')\n \"\n (onEditorCreated)=\"editorCreated($event)\"\n class=\"editor\"\n placeholder=\"\"\n ></quill-editor>\n </div>\n </ng-template>\n\n <div *ngIf=\"subForm.property.subFormStructure == 'multiple'\">\n <lib-multiple-subform\n *ngIf=\"subForm.property.subFormType === 'table'\"\n [subForm]=\"subForm\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-multiple-subform>\n\n <lib-inline-multiple-subform\n *ngIf=\"subForm.property.subFormType === 'inline'\"\n [subForm]=\"subForm\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-inline-multiple-subform>\n <lib-card-subform\n *ngIf=\"subForm.property.subFormType === 'card'\"\n [subForm]=\"subForm\"\n [acceptedLanguage]=\"acceptedLanguage\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n [edit]=\"edit\"\n ></lib-card-subform>\n </div>\n <div *ngIf=\"subForm.property.subFormStructure == 'single'\">\n <div *ngFor=\"let row of subForm.rows\">\n <div class=\"d-flex\">\n <div\n *ngFor=\"let grid of row.grid\"\n [ngStyle]=\"{ 'width.%': grid.element.count * (100 / 12) }\"\n >\n <div *ngIf=\"grid.entityType === 'QUESTION' && grid.show\">\n <div [ngSwitch]=\"grid.element.formElement.elementType\">\n <lib-check-box-fields\n *ngSwitchCase=\"'CHECK_BOX'\"\n [question]=\"grid.element\"\n ></lib-check-box-fields>\n <lib-date-time-fields\n *ngSwitchCase=\"'DATE_TIME'\"\n [question]=\"grid.element\"\n ></lib-date-time-fields>\n <lib-drop-down-fields\n *ngSwitchCase=\"'DROP_DOWN'\"\n [question]=\"grid.element\"\n ></lib-drop-down-fields>\n <lib-file-picker-fields\n *ngSwitchCase=\"'FILE_PICKER'\"\n [question]=\"grid.element\"\n ></lib-file-picker-fields>\n <lib-location-fields\n *ngSwitchCase=\"'LOCATION'\"\n [question]=\"grid.element\"\n ></lib-location-fields>\n <lib-mail-fields\n *ngSwitchCase=\"'EMAIL'\"\n [question]=\"grid.element\"\n ></lib-mail-fields>\n <lib-mobile-fields\n *ngSwitchCase=\"'MOBILE'\"\n [question]=\"grid.element\"\n ></lib-mobile-fields>\n <lib-number-fields\n *ngSwitchCase=\"'NUMBER'\"\n [question]=\"grid.element\"\n [rowId]=\"'0'\"\n ></lib-number-fields>\n <lib-password-fields\n *ngSwitchCase=\"'PASSWORD'\"\n [question]=\"grid.element\"\n ></lib-password-fields>\n <lib-radio-button-fields\n *ngSwitchCase=\"'RADIO_BUTTON'\"\n [question]=\"grid.element\"\n ></lib-radio-button-fields>\n <lib-rich-text-editor-fields\n *ngSwitchCase=\"'RICH_TEXT_EDITOR'\"\n [question]=\"grid.element\"\n ></lib-rich-text-editor-fields>\n <lib-selection-matrix-fields\n *ngSwitchCase=\"'SELECTION_MATRIX'\"\n [question]=\"grid.element\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-selection-matrix-fields>\n <lib-signature-fields\n *ngSwitchCase=\"'SIGNATURE'\"\n [question]=\"grid.element\"\n ></lib-signature-fields>\n <lib-slider-fields\n *ngSwitchCase=\"'SLIDER'\"\n [question]=\"grid.element\"\n ></lib-slider-fields>\n <lib-terms-and-condition-fields\n *ngSwitchCase=\"'TERMS_AND_CONDITION'\"\n [question]=\"grid.element\"\n ></lib-terms-and-condition-fields>\n <lib-text-area-fields\n *ngSwitchCase=\"'TEXT_AREA'\"\n [question]=\"grid.element\"\n ></lib-text-area-fields>\n <lib-text-fields\n *ngSwitchCase=\"'TEXT_BOX'\"\n [question]=\"grid.element\"\n ></lib-text-fields>\n <lib-toggle-switch-fields\n *ngSwitchCase=\"'TOGGLE_SWITCH'\"\n [question]=\"grid.element\"\n [acceptedLanguage]=\"acceptedLanguage\"\n ></lib-toggle-switch-fields>\n <lib-url-fields\n *ngSwitchCase=\"'URL'\"\n [question]=\"grid.element\"\n ></lib-url-fields>\n <lib-currency-fields\n *ngSwitchCase=\"'CURRENCY'\"\n [question]=\"grid.element\"\n ></lib-currency-fields>\n <lib-aggregate-function\n *ngSwitchCase=\"'AGGREGATE_FUNCTION'\"\n [question]=\"grid.element\"\n [rowId]=\"'0'\"\n ></lib-aggregate-function>\n <lib-hidden-field\n *ngSwitchCase=\"'HIDDEN_FIELD'\"\n [question]=\"grid.element\"\n ></lib-hidden-field>\n <lib-iframe-fields\n *ngSwitchCase=\"'IFRAME_WIDGET'\"\n [question]=\"grid.element\"\n ></lib-iframe-fields>\n </div>\n\n <!-- <ng-container *ngIf=\"grid.element.childLogics\">\n <ng-container\n *ngIf=\"getComponentForChildLogics(grid.element.childLogics, 'child', grid.element.answer) as outlet\">\n <ng-container *ngComponentOutlet=\"outlet.component | async; injector: outlet.injector\">\n </ng-container>\n </ng-container>\n </ng-container> -->\n <ng-container *ngIf=\"grid?.element?.childLogics\">\n <ng-container *ngIf=\"componentToLoad\">\n <ng-container\n *ngComponentOutlet=\"\n componentToLoad;\n inputs: {\n grid: grid?.element?.childLogics,\n answer: grid?.element?.answer,\n state: 'child'\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"grid.entityType === 'SECTION' && grid.show\">\n <lib-section-fields\n [section]=\"grid.element\"\n ></lib-section-fields>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isInvalid\" class=\"error-message mt-4\">\n {{ errorMessage }}\n </div>\n </div>\n </div>\n</div>\n", styles: [".outer-container{background-color:#fff;position:relative}@media (max-width: 576px){.outer-container{padding:8px}}.body{position:relative;background:#efefef;border-radius:6px}.tab-content{background-color:#fff}.sectionTitle{font-size:19px;font-weight:700;margin-bottom:20px;word-break:break-word}.description{font-size:17px;font-weight:500;margin-bottom:18px;word-break:break-word}::ng-deep .description img{max-width:100%}.subform-header{display:flex;justify-content:space-between;margin-bottom:10px}.icon-container{cursor:pointer}.delete-icon{height:36px;width:36px}.finalScore{width:57px;height:52px;border-radius:6px;border:1px solid #c8c8c8;display:flex;flex-direction:column;justify-content:center;align-items:center;font-weight:500}.goodScore{border-color:#50f550}.badScore{border-color:#f08080}.scoreTitle{font-weight:400;font-size:14px;color:#2b2e3e80}.error-message{color:#f44336;font-size:1em;margin-top:4px;padding:0 8px}\n"] }]
|
|
337
|
-
}], ctorParameters: function () { return [{ type: i1.SubformCopyService }, { type: i2.MatDialog }, { type: i3.DataService }, { type: i4.FormService }, { type: i5.WhenClauseService }, { type: i6.ValidationService }, { type: i7.ScoreCalculationService }]; }, propDecorators: { subForm: [{
|
|
338
|
-
type: Input
|
|
339
|
-
}], edit: [{
|
|
340
|
-
type: Input
|
|
341
|
-
}], subFormChange: [{
|
|
342
|
-
type: Output
|
|
343
|
-
}], acceptedLanguage: [{
|
|
344
|
-
type: Input
|
|
345
|
-
}], pages: [{
|
|
346
|
-
type: Input
|
|
347
|
-
}], onAnyClick: [{
|
|
348
|
-
type: HostListener,
|
|
349
|
-
args: ['click', ['$event']]
|
|
350
|
-
}] } });
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9xdWVzdGlvbi9zdWItZm9ybS9zdWItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL3F1ZXN0aW9uL3N1Yi1mb3JtL3N1Yi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQWEsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBR3BGLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZcEMsTUFBTSxPQUFPLGdCQUFnQjtJQXdCM0IsWUFDVSxrQkFBcUMsRUFDdEMsTUFBaUIsRUFDaEIsV0FBd0IsRUFDeEIsV0FBdUIsRUFDdkIsaUJBQW1DLEVBQ25DLGlCQUFvQyxFQUNwQyxnQkFBeUM7UUFOekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUN0QyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBOUIxQyxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLFNBQUks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LE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUdDLFVBQVUsQ0FBQyxLQUFpQjtRQUM1QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7K0dBcFhVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLGtSQzFCN0IsdXhVQThQQTs7NEZEcE9hLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjOzJSQUtmLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQXVXSixVQUFVO3NCQURYLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJmb3JtQ29weVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdWJmb3JtLWNvcHkuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU3VibWlzc2lvbiB9IGZyb20gJy4uLy4uL21vZGVscy9zdWJtaXNzaW9uLm1vZGVsJztcbmltcG9ydCB7IEFuc3dlciB9IGZyb20gJy4uLy4uL21vZGVscy9hbnN3ZXIubW9kZWwnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBXaGVuQ2xhdXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3doZW5DbGF1c2Uuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTY29yZUNhbGN1bGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Njb3JlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItc3ViLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3ViLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdWItZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTdWJGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc3ViRm9ybTogYW55ID0ge307XG4gIEBJbnB1dCgpIGVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHN1YkZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgYWNjZXB0ZWRMYW5ndWFnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHBhZ2VzOiBhbnlbXSA9IFtdO1xuICBkZWNvZGVkRGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBncmlkOiBhbnk7XG4gIHN0YXRlITogc3RyaW5nO1xuICBjaGlsZExvZ2ljQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogeyBjb21wb25lbnQ6IFByb21pc2U8YW55PiwgaW5qZWN0b3I6IEluamVjdG9yIH0gfSA9IHt9O1xuICBjb21wb25lbnRUb0xvYWQ6IGFueTtcbiAgaW5qZWN0b3IhOiBJbmplY3RvcjtcbiAgY29weVN1YkZvcm1kYXRhOmFueTtcbiAgc3ViZm9ybURlc2NyaXB0aW9uOnN0cmluZyA9ICcnO1xuICBzdWJmb3JtVGl0bGU6IHN0cmluZz0gJyc7XG4gIGVkaXRvcjogYW55O1xuICBhbGxvd0NvcHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWxsb3dEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkaWFsb2dSZWY/OiBNYXREaWFsb2dSZWY8Q29uZmlybURpYWxvZ0NvbXBvbmVudD47XG4gIHN1YmZvcm1EYXRhOmFueTtcbiAgcHJldmlvdXNTdWJtaXNzaW9uczphbnlbXT1bXTtcbiAgbWF4UG9zc2libGVHb29kU2NvcmUhOiBudW1iZXI7XG4gIG1heFBvc3NpYmxlQmFkU2NvcmUhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdWJmb3JtQ29weVNlcnZpY2U6U3ViZm9ybUNvcHlTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1TZXJ2aWNlOkZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgd2hlbkNsYXVzZVNlcnZpY2U6V2hlbkNsYXVzZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzY29yZUNhbGNTZXJ2aWNlOiBTY29yZUNhbGN1bGF0aW9uU2VydmljZVxuICApe1xuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc3ViZm9ybSQuc3Vic2NyaWJlKChkYXRhKT0+e1xuICAgICAgdGhpcy5zdWJmb3JtRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLnRyeUxvYWRQcmV2aW91c1N1Ym1pc3Npb25zKCk7XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgdHJ5TG9hZFByZXZpb3VzU3VibWlzc2lvbnMoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdWJmb3JtRGF0YSAmJlxuICAgICAgdGhpcy5zdWJGb3JtICYmXG4gICAgICAhdGhpcy5lZGl0ICYmXG4gICAgICB0aGlzLnN1YkZvcm0uc3VibWlzc2lvbkNvcHlDb25maWc/LmFsbG93Q29weUZyb21PdGhlclN1Ym1pc3Npb25zXG4gICAgKSB7XG4gICAgICB0aGlzLmxvYWRQcmV2aW91c1N1Ym1pc3Npb25zKCk7XG4gICAgfVxuICB9XG5cblxuICBsb2FkUHJldmlvdXNTdWJtaXNzaW9ucygpe1xuICAgIGlmICh0aGlzLnN1YmZvcm1EYXRhICYmIE9iamVjdC5rZXlzKHRoaXMuc3ViZm9ybURhdGEpLmxlbmd0aCA+IDAgJiYgIXRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5mb3JtU2VydmljZS5nZXRTdWJmb3JtU3VibWlzc2lvbnModGhpcy5zdWJmb3JtRGF0YSk/LnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6KHJlc3BvbnNlOmFueSk9PntcbiAgICAgICAgICB0aGlzLnByZXZpb3VzU3VibWlzc2lvbnMgPSByZXNwb25zZTtcbiAgICAgICAgICBpZih0aGlzLnN1YkZvcm0udGl0bGUgPT0gdGhpcy5zdWJmb3JtRGF0YT8uZHVwbGljYXRlU3VibWlzc2lvbj8udGFyZ2V0U3ViRm9ybSl7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRTdWJtaXNzaW9ucyA9IHRoaXMuY3JlYXRlU3VibWlzc2lvbnNGcm9tQXBpKHRoaXMucHJldmlvdXNTdWJtaXNzaW9ucyx0aGlzLnN1YkZvcm0pO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdTdWJtaXNzaW9ucyA9IHRoaXMuc3ViRm9ybS5zdWJtaXNzaW9ucyA/PyBbXTtcblxuICAgICAgICAgICAgdGhpcy5zdWJGb3JtID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLnN1YkZvcm0sXG4gICAgICAgICAgICAgIHN1Ym1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTdWJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICAuLi5sb2FkZWRTdWJtaXNzaW9uc1xuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBoYXNBbnlTY29yZSA9IHRoaXMuc3ViRm9ybS5zdWJtaXNzaW9ucy5zb21lKChzdWI6YW55KSA9PlxuICAgICAgICAgICAgICBzdWIuc2NvcmVzPy5zb21lKChzOmFueSkgPT4gcy5zY29yZSAhPT0gbnVsbCAmJiBzLnNjb3JlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoaGFzQW55U2NvcmUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJGb3JtLnNjb3JlcyA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVGaW5hbFNjb3JlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3ViRm9ybS5zdWJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlLFxuICAgICAgICAgICAgICAgIHRoaXMubWF4UG9zc2libGVCYWRTY29yZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJGb3JtLnNjb3JlcyA9IG51bGw7IC8vIG9yIDAsIGRlcGVuZGluZyBvbiBob3cgeW91IHdhbnQgdG8gcmVwcmVzZW50IFwibm8gc2NvcmUgeWV0XCJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6KGVycm9yOmFueSk9Pnt9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYWxsb3dDb3B5ID0gdGhpcy5zdWJGb3JtLnByb3BlcnR5Py5hbGxvd0NvcHk7XG4gICAgdGhpcy5hbGxvd0RlbGV0ZSA9IHRoaXMuc3ViRm9ybS5wcm9wZXJ0eT8uYWxsb3dEZWxldGU7XG4gICAgdGhpcy5jb3B5U3ViRm9ybWRhdGEgPSB0aGlzLnN1YkZvcm0/LmNvcHlTdWJmb3JtTWV0YTtcbiAgICB0aGlzLnRyeUxvYWRQcmV2aW91c1N1Ym1pc3Npb25zKCk7XG4gICAgaWYgKHRoaXMuc3ViRm9ybS5wcm9wZXJ0eS5zdWJGb3JtU3RydWN0dXJlID09ICdzaW5nbGUnKSB7XG4gICAgICB0aGlzLmJpbmRBbnN3ZXJzVG9Gb3JtRWxlbWVudHMoKTtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgdGhpcy53aGVuQ2xhdXNlU2VydmljZS5hZGRHcmlkc0Zyb21TdWJmb3JtKHRoaXMuc3ViRm9ybSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnb29kTWF4LCBiYWRNYXggfSA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5nZXRNYXhQb3NzaWJsZVNjb3JlKFxuICAgICAgdGhpcy5zdWJGb3JtXG4gICAgKTtcbiAgICB0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlID0gZ29vZE1heDtcbiAgICB0aGlzLm1heFBvc3NpYmxlQmFkU2NvcmUgPSBiYWRNYXg7XG4gIH1cblxuICBlZGl0b3JDcmVhdGVkKGVkaXRvckluc3RhbmNlOiBhbnkpIHtcbiAgICB0aGlzLmVkaXRvciA9IGVkaXRvckluc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQ29tcG9uZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29tcG9uZW50VG9Mb2FkID0gYXdhaXQgdGhpcy5sb2FkRm9ybUVsZW1lbnRzQ29tcG9uZW50KCk7XG4gICAgdGhpcy5pbmplY3RvciA9IHRoaXMuY3JlYXRlSW5qZWN0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZvcm1FbGVtZW50c0NvbXBvbmVudCgpIHtcbiAgICBjb25zdCB7IEZvcm1FbGVtZW50c0NvbXBvbmVudCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9mb3JtLWVsZW1lbnRzL2Zvcm0tZWxlbWVudHMuY29tcG9uZW50Jyk7XG4gICAgcmV0dXJuIEZvcm1FbGVtZW50c0NvbXBvbmVudDtcbiAgfVxuXG4gIGNyZWF0ZUluamVjdG9yKCk6IEluamVjdG9yIHtcbiAgICByZXR1cm4gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6ICdncmlkJywgdXNlVmFsdWU6IHRoaXMuZ3JpZD8uZWxlbWVudC5jaGlsZExvZ2ljcyAgfSxcbiAgICAgICAgeyBwcm92aWRlOiAnc3RhdGUnLCB1c2VWYWx1ZTogJ2NoaWxkJyB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGRlY29kZUh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGV4dEFyZWEuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGV4dEFyZWEudmFsdWU7XG4gIH1cblxuICBiaW5kQW5zd2Vyc1RvRm9ybUVsZW1lbnRzKCkge1xuICAgIGNvbnN0IGJpbmRBbnN3ZXJzID0gKGZvcm1FbGVtZW50czogYW55W10sIHN1Ym1pc3Npb25zOiBhbnlbXSkgPT4ge1xuICAgICAgZm9ybUVsZW1lbnRzPy5mb3JFYWNoKChncmlkczogYW55KSA9PiB7XG4gICAgICAgIGdyaWRzPy5ncmlkPy5mb3JFYWNoKFxuICAgICAgICAgIChmb3JtRWxlbWVudDogeyBlbnRpdHlUeXBlOiBzdHJpbmc7IGVsZW1lbnQ6IGFueSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZm9ybUVsZW1lbnQuZW50aXR5VHlwZSA9PT0gJ1FVRVNUSU9OJykge1xuICAgICAgICAgICAgICBjb25zdCBzdWJtaXNzaW9uID0gc3VibWlzc2lvbnMuZmluZCgoc3ViOiB7IGFuc3dlcnM6IGFueVtdIH0pID0+XG4gICAgICAgICAgICAgICAgc3ViLmFuc3dlcnMuc29tZShcbiAgICAgICAgICAgICAgICAgIChhbnM6IHsgcXVlc3Rpb25JZDogYW55IH0pID0+XG4gICAgICAgICAgICAgICAgICAgIGFucy5xdWVzdGlvbklkID09PSBmb3JtRWxlbWVudC5lbGVtZW50LmlkXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gc3VibWlzc2lvbi5hbnN3ZXJzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoYW5zOiB7IHF1ZXN0aW9uSWQ6IGFueSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICBhbnMucXVlc3Rpb25JZCA9PT0gZm9ybUVsZW1lbnQuZWxlbWVudC5pZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5hbnN3ZXIgPSBhbnN3ZXIuYW5zd2VyO1xuICAgICAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5hbnN3ZXJJZCA9IGFuc3dlci5hbnN3ZXJJZDtcbiAgICAgICAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQudmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmF0dGFjaG1lbnRzID0gYW5zd2VyLmF0dGFjaG1lbnRzO1xuICAgICAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5hbW91bnRJbldvcmRzID0gYW5zd2VyLmFtb3VudEluV29yZHM7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN1YkZvcm0uc3VibWlzc2lvbklkID0gc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQ7XG4gICAgICAgICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlckN1cnJlbmN5ID0gYW5zd2VyLmFuc3dlckN1cnJlbmN5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudC5lbGVtZW50LmNoaWxkTG9naWNzKSB7XG4gICAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5jaGlsZExvZ2ljcy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgKGNoaWxkTG9naWM6IHsgcm93czogYW55W10gfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBiaW5kQW5zd2VycyhjaGlsZExvZ2ljLnJvd3MsIHN1Ym1pc3Npb25zKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN1YkZvcm0gJiYgdGhpcy5zdWJGb3JtLnJvd3MgJiYgdGhpcy5zdWJGb3JtLnN1Ym1pc3Npb25zKSB7XG4gICAgICBiaW5kQW5zd2Vycyh0aGlzLnN1YkZvcm0ucm93cywgdGhpcy5zdWJGb3JtLnN1Ym1pc3Npb25zKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnN1YkZvcm0gPSBldmVudDtcbiAgICB0aGlzLnN1YkZvcm1DaGFuZ2UuZW1pdCh0aGlzLnN1YkZvcm0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3ViRm9ybS5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWNvZGVkRGVzY3JpcHRpb24gPSB0aGlzLmRlY29kZUh0bWwodGhpcy5zdWJGb3JtLmRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBjb3B5U3ViZm9ybSgpIHtcbiAgICBjb25zdCB7IHVwZGF0ZWRQYWdlcyB9ID0gdGhpcy5zdWJmb3JtQ29weVNlcnZpY2UuY29weVN1YmZvcm0odGhpcy5zdWJGb3JtLCB0aGlzLnBhZ2VzKTtcblxuICAgIHRoaXMucGFnZXMgPSB1cGRhdGVkUGFnZXM7XG4gICAgLy8gRW1pdCB1cGRhdGVkIHBhZ2VzIG9yIHN1YkZvcm1DaGFuZ2UgaWYgbmVlZGVkXG5cbiAgICAvLyBPcHRpb25hbGx5IHBhc3MgbWV0YSB0byBwYXJlbnQgaWYgbmVlZGVkXG4gICAgLy8gdGhpcy5jb3B5TWV0YS5lbWl0KGNvcHlTdWJGb3JtTWV0YSk7XG4gIH1cblxuXG4gIHVwZGF0ZVN1YmZvcm1EYXRhKGV2ZW50OiBhbnksIHN1YmZvcm1JZDogc3RyaW5nLCBmaWVsZDogJ3RpdGxlJyB8ICdkZXNjcmlwdGlvbicpIHtcbiAgICBpZih0aGlzLmNvcHlTdWJGb3JtZGF0YS5pZCA9PSBzdWJmb3JtSWQpe1xuICAgICAgdGhpcy5jb3B5U3ViRm9ybWRhdGFbZmllbGRdID0gZXZlbnQ7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlQ29weVN1YmZvcm0oc3ViZm9ybUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XG4gICAgICBtZXNzYWdlSGVhZGVyOiBcIkFyZSB5b3Ugc3VyZT9cIixcbiAgICAgIG1lc3NhZ2U6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgc3ViZm9ybT9cIlxuICAgIH07XG4gICAgZGlhbG9nQ29uZmlnLmhhc0JhY2tkcm9wID0gdHJ1ZTtcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcblxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCBkaWFsb2dDb25maWcpO1xuXG4gICAgdGhpcy5kaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vIDEuIFJlbW92ZSB0aGUgY29waWVkIHN1YmZvcm0gZnJvbSB0aGUgcGFnZXNcbiAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZXMpIHtcbiAgICAgICAgICBjb25zdCByb3dJbmRleCA9IHBhZ2Uucm93cy5maW5kSW5kZXgoKHJvdzogYW55KSA9PlxuICAgICAgICAgICAgcm93LmdyaWQuc29tZSgoZ3JpZDogYW55KSA9PlxuICAgICAgICAgICAgICBncmlkLmVudGl0eVR5cGUgPT09ICdTVUJGT1JNJyAmJlxuICAgICAgICAgICAgICBncmlkLmVsZW1lbnQ/LmlkID09PSBzdWJmb3JtSWQgJiZcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50Py5jb3BpZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHJvd0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgcGFnZS5yb3dzLnNwbGljZShyb3dJbmRleCwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBSZW1vdmUgdGhpcyBzdWJmb3JtSWQgZnJvbSBhbnkgc3ViZm9ybSdzIGNvcGllZEZvcm1zIGFycmF5XG4gICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZS5yb3dzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyaWQgb2Ygcm93LmdyaWQpIHtcbiAgICAgICAgICAgICAgaWYgKGdyaWQuZW50aXR5VHlwZSA9PT0gJ1NVQkZPUk0nICYmIGdyaWQuZWxlbWVudD8uY29waWVkRm9ybXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGdyaWQuZWxlbWVudC5jb3BpZWRGb3Jtcy5pbmRleE9mKHN1YmZvcm1JZCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmNvcGllZEZvcm1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGRlbGV0ZU1haW5TdWJmb3JtKHN1YmZvcm1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0gbmV3IE1hdERpYWxvZ0NvbmZpZygpO1xuICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0ge1xuICAgICAgbWVzc2FnZUhlYWRlcjogXCJBcmUgeW91IHN1cmU/XCIsXG4gICAgICBtZXNzYWdlOiBcIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHN1YmZvcm0/XCJcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5oYXNCYWNrZHJvcCA9IHRydWU7XG4gICAgZGlhbG9nQ29uZmlnLmRpc2FibGVDbG9zZSA9IHRydWU7XG5cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcblxuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5wYWdlcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2Uucm93cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBncmlkSXRlbSBvZiByb3cuZ3JpZCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ3JpZEl0ZW0uZW50aXR5VHlwZSA9PT0gJ1NVQkZPUk0nICYmXG4gICAgICAgICAgICAgICAgZ3JpZEl0ZW0uZWxlbWVudD8uaWQgPT09IHN1YmZvcm1JZFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBncmlkSXRlbS5lbGVtZW50LmRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2hcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlU3VibWlzc2lvbnNGcm9tQXBpKGFwaVN1Ym1pc3Npb25zOiBhbnlbXSwgc3ViZm9ybTogYW55KTogU3VibWlzc2lvbltdIHtcbiAgICByZXR1cm4gYXBpU3VibWlzc2lvbnMubWFwKGFwaVN1Ym1pc3Npb24gPT4ge1xuICAgICAgY29uc3QgYW5zd2VyczogQW5zd2VyW10gPSBbXTtcblxuICAgICAgc3ViZm9ybS5yb3dzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XG4gICAgICAgIHJvdy5ncmlkLmZvckVhY2goKGdyaWRJdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZ3JpZEl0ZW0uZW50aXR5VHlwZSAhPT0gJ1FVRVNUSU9OJykgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRJdGVtLmVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgcXVlc3Rpb25LZXkgPSBlbGVtZW50LnF1ZXN0aW9uO1xuICAgICAgICAgIGlmICghYXBpU3VibWlzc2lvbi5hbnN3ZXJzIHx8ICFhcGlTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb25LZXldKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFwaUFuc3dlciA9IGFwaVN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbktleV07XG4gICAgICAgICAgLy8g4pyFIENBU0UgMTogRmlsZSB1cGxvYWQgKGFycmF5IHdpdGggbmFtZSAmIHVybClcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGFwaUFuc3dlcikgJiZcbiAgICAgICAgICAgIGFwaUFuc3dlci5sZW5ndGggJiZcbiAgICAgICAgICAgIGFwaUFuc3dlclswXS5uYW1lICYmXG4gICAgICAgICAgICBhcGlBbnN3ZXJbMF0udXJsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhbnN3ZXJzLnB1c2goe1xuICAgICAgICAgICAgICBxdWVzdGlvbklkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICBhbnN3ZXI6IG51bGwsXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBhcGlBbnN3ZXIubWFwKChmaWxlOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlLmlkLFxuICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZVVybDogZmlsZS51cmxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBjb3BpZWRBdHRhY2htZW50czogYXBpQW5zd2VyLm1hcCgoZmlsZTogYW55KSA9PiBmaWxlLmlkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g4pyFIENBU0UgMjogTm9ybWFsIHF1ZXN0aW9uIG9iamVjdFxuICAgICAgICAgIGFuc3dlcnMucHVzaCh7XG4gICAgICAgICAgICBxdWVzdGlvbklkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgYW5zd2VyOiBhcGlBbnN3ZXIuYW5zd2VyID8/IG51bGwsXG4gICAgICAgICAgICBhdHRhY2htZW50czogYXBpQW5zd2VyLmZpbGVcbiAgICAgICAgICAgICAgPyBhcGlBbnN3ZXIuZmlsZS5tYXAoKGZpbGU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBmaWxlVXJsOiBmaWxlLnVybFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNjb3JlczogYXBpQW5zd2VyLnNjb3JlcyxcbiAgICAgICAgICAgIG1heGltdW1Qb3NzaWJsZVNjb3JlOiBhcGlBbnN3ZXIubWF4aW11bVBvc3NpYmxlU2NvcmVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VibWlzc2lvbklkOiB1dWlkdjQoKSxcbiAgICAgICAgc291cmNlU3VibWlzc2lvbklkOiBhcGlTdWJtaXNzaW9uLnN1Ym1pc3Npb25JZCxcbiAgICAgICAgYW5zd2VycyxcbiAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgYWxsb3dEZWxldGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgc2NvcmVzOiBhcGlTdWJtaXNzaW9uLnNjb3JlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGlzSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLmdldEVycm9yTWVzc2FnZSh0aGlzLnN1YkZvcm0uaWQpO1xuICB9XG5cbiAgZ2V0IGVycm9yTWVzc2FnZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRFcnJvck1lc3NhZ2UodGhpcy5zdWJGb3JtLmlkKTtcbiAgfVxuXG4gIGNsZWFySW52YWxpZCgpe1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UuY2xlYXJJbnZhbGlkKHRoaXMuc3ViRm9ybS5pZCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgb25BbnlDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJJbnZhbGlkKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cblxufVxuIiwiPGRpdlxuICBjbGFzcz1cIm91dGVyLWNvbnRhaW5lciBtYi00IHB4LTNcIlxuICBbaWRdPVwiJ3F1ZXN0aW9uLScgKyBzdWJGb3JtLmlkXCJcbiAgW2F0dHIubmFtZV09XCJzdWJGb3JtLnRlc3RFbGVtZW50TmFtZVwiXG4gICpuZ0lmPVwiIXN1YkZvcm0uZGVsZXRlZFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJib2R5IHB5LTEgcHgtMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudCBwdC00IHBiLTMgcHgtM1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzdWJGb3JtLmNvcGllZDsgZWxzZSBjb3B5U3ViZm9ybUNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ViZm9ybS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvblRpdGxlXCI+e3sgc3ViRm9ybS50aXRsZSB9fTwvcD5cbiAgICAgICAgICAgIDxwIFtpbm5lckhUTUxdPVwiZGVjb2RlZERlc2NyaXB0aW9uXCIgY2xhc3M9XCJkZXNjcmlwdGlvblwiPjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmluYWxTY29yZVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzIG9mIHN1YkZvcm0/LnNjb3Jlc1wiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICBnb29kU2NvcmU6IHMuc2NvcmVUeXBlID09PSAnR09PRF9TQ09SRScsXG4gICAgICAgICAgICAgICAgYmFkU2NvcmU6IHMuc2NvcmVUeXBlID09PSAnQkFEX1NDT1JFJ1xuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY29yZVRpdGxlXCI+U2NvcmU8L3NwYW4+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IHMuc2NvcmUgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2NvcHktaWNvbi5zdmdcIlxuICAgICAgICAgICAgICAgIGFsdD1cImNvcHktaWNvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlTdWJmb3JtKClcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dDb3B5XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9kZWxldGUtaWNvbi5zdmdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGVsZXRlLWljb24gbXMtM1wiXG4gICAgICAgICAgICAgICAgYWx0PVwiZGVsZXRlIGljb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVNYWluU3ViZm9ybShzdWJGb3JtLmlkKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJhbGxvd0RlbGV0ZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY29weVN1YmZvcm1Db250YWluZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtNFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmaW5hbFNjb3JlXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHMgb2Ygc3ViRm9ybT8uc2NvcmVzXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGdvb2RTY29yZTogcy5zY29yZVR5cGUgPT09ICdHT09EX1NDT1JFJyxcbiAgICAgICAgICAgICAgICBiYWRTY29yZTogcy5zY29yZVR5cGUgPT09ICdCQURfU0NPUkUnXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjb3JlVGl0bGVcIj5TY29yZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgcy5zY29yZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiIChjbGljayk9XCJkZWxldGVDb3B5U3ViZm9ybShzdWJGb3JtLmlkKVwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvZGVsZXRlLWljb24uc3ZnXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgIGFsdD1cImRlbGV0ZSBpY29uXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29weS1zdWJmb3JtLWNvbnRhaW5lciBtYi0zXCI+XG4gICAgICAgICAgPHA+VGl0bGU8L3A+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN1YmZvcm1UaXRsZVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVTdWJmb3JtRGF0YSgkZXZlbnQsIHN1YkZvcm0uaWQsICd0aXRsZScpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxwIGNsYXNzPVwibXQtM1wiPkRlc2NyaXB0aW9uPC9wPlxuICAgICAgICAgIDxxdWlsbC1lZGl0b3JcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3ViZm9ybURlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICB1cGRhdGVTdWJmb3JtRGF0YSgkZXZlbnQsIHN1YkZvcm0uaWQsICdkZXNjcmlwdGlvbicpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG9uRWRpdG9yQ3JlYXRlZCk9XCJlZGl0b3JDcmVhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgICAgID48L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwic3ViRm9ybS5wcm9wZXJ0eS5zdWJGb3JtU3RydWN0dXJlID09ICdtdWx0aXBsZSdcIj5cbiAgICAgICAgPGxpYi1tdWx0aXBsZS1zdWJmb3JtXG4gICAgICAgICAgKm5nSWY9XCJzdWJGb3JtLnByb3BlcnR5LnN1YkZvcm1UeXBlID09PSAndGFibGUnXCJcbiAgICAgICAgICBbc3ViRm9ybV09XCJzdWJGb3JtXCJcbiAgICAgICAgICAoc3ViRm9ybUNoYW5nZSk9XCJ1cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCRldmVudClcIlxuICAgICAgICAgIFthY2NlcHRlZExhbmd1YWdlXT1cImFjY2VwdGVkTGFuZ3VhZ2VcIlxuICAgICAgICA+PC9saWItbXVsdGlwbGUtc3ViZm9ybT5cblxuICAgICAgICA8bGliLWlubGluZS1tdWx0aXBsZS1zdWJmb3JtXG4gICAgICAgICAgKm5nSWY9XCJzdWJGb3JtLnByb3BlcnR5LnN1YkZvcm1UeXBlID09PSAnaW5saW5lJ1wiXG4gICAgICAgICAgW3N1YkZvcm1dPVwic3ViRm9ybVwiXG4gICAgICAgICAgKHN1YkZvcm1DaGFuZ2UpPVwidXBkYXRlU3ViRm9ybVdpdGhTdWJtaXNzaW9ucygkZXZlbnQpXCJcbiAgICAgICAgICBbYWNjZXB0ZWRMYW5ndWFnZV09XCJhY2NlcHRlZExhbmd1YWdlXCJcbiAgICAgICAgPjwvbGliLWlubGluZS1tdWx0aXBsZS1zdWJmb3JtPlxuICAgICAgICA8bGliLWNhcmQtc3ViZm9ybVxuICAgICAgICAgICpuZ0lmPVwic3ViRm9ybS5wcm9wZXJ0eS5zdWJGb3JtVHlwZSA9PT0gJ2NhcmQnXCJcbiAgICAgICAgICBbc3ViRm9ybV09XCJzdWJGb3JtXCJcbiAgICAgICAgICBbYWNjZXB0ZWRMYW5ndWFnZV09XCJhY2NlcHRlZExhbmd1YWdlXCJcbiAgICAgICAgICAoc3ViRm9ybUNoYW5nZSk9XCJ1cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCRldmVudClcIlxuICAgICAgICAgIFtlZGl0XT1cImVkaXRcIlxuICAgICAgICA+PC9saWItY2FyZC1zdWJmb3JtPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic3ViRm9ybS5wcm9wZXJ0eS5zdWJGb3JtU3RydWN0dXJlID09ICdzaW5nbGUnXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBzdWJGb3JtLnJvd3NcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBncmlkIG9mIHJvdy5ncmlkXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGguJSc6IGdyaWQuZWxlbWVudC5jb3VudCAqICgxMDAgLyAxMikgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJncmlkLmVudGl0eVR5cGUgPT09ICdRVUVTVElPTicgJiYgZ3JpZC5zaG93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlXCI+XG4gICAgICAgICAgICAgICAgICA8bGliLWNoZWNrLWJveC1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidDSEVDS19CT1gnXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItY2hlY2stYm94LWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItZGF0ZS10aW1lLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ0RBVEVfVElNRSdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi1kYXRlLXRpbWUtZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi1kcm9wLWRvd24tZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInRFJPUF9ET1dOJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLWRyb3AtZG93bi1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLWZpbGUtcGlja2VyLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ0ZJTEVfUElDS0VSJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLWZpbGUtcGlja2VyLWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItbG9jYXRpb24tZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInTE9DQVRJT04nXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItbG9jYXRpb24tZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi1tYWlsLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ0VNQUlMJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLW1haWwtZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi1tb2JpbGUtZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInTU9CSUxFJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLW1vYmlsZS1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLW51bWJlci1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidOVU1CRVInXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJZF09XCInMCdcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLW51bWJlci1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLXBhc3N3b3JkLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1BBU1NXT1JEJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgPjwvbGliLXBhc3N3b3JkLWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItcmFkaW8tYnV0dG9uLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1JBRElPX0JVVFRPTidcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi1yYWRpby1idXR0b24tZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi1yaWNoLXRleHQtZWRpdG9yLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1JJQ0hfVEVYVF9FRElUT1InXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItcmljaC10ZXh0LWVkaXRvci1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLXNlbGVjdGlvbi1tYXRyaXgtZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInU0VMRUNUSU9OX01BVFJJWCdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW2FjY2VwdGVkTGFuZ3VhZ2VdPVwiYWNjZXB0ZWRMYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItc2VsZWN0aW9uLW1hdHJpeC1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLXNpZ25hdHVyZS1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidTSUdOQVRVUkUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItc2lnbmF0dXJlLWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItc2xpZGVyLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1NMSURFUidcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi1zbGlkZXItZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi10ZXJtcy1hbmQtY29uZGl0aW9uLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1RFUk1TX0FORF9DT05ESVRJT04nXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItdGVybXMtYW5kLWNvbmRpdGlvbi1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLXRleHQtYXJlYS1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidURVhUX0FSRUEnXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItdGV4dC1hcmVhLWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItdGV4dC1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidURVhUX0JPWCdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi10ZXh0LWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItdG9nZ2xlLXN3aXRjaC1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidUT0dHTEVfU1dJVENIJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICBbYWNjZXB0ZWRMYW5ndWFnZV09XCJhY2NlcHRlZExhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi10b2dnbGUtc3dpdGNoLWZpZWxkcz5cbiAgICAgICAgICAgICAgICAgIDxsaWItdXJsLWZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ1VSTCdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi11cmwtZmllbGRzPlxuICAgICAgICAgICAgICAgICAgPGxpYi1jdXJyZW5jeS1maWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidDVVJSRU5DWSdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi1jdXJyZW5jeS1maWVsZHM+XG4gICAgICAgICAgICAgICAgICA8bGliLWFnZ3JlZ2F0ZS1mdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ0FHR1JFR0FURV9GVU5DVElPTidcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0lkXT1cIicwJ1wiXG4gICAgICAgICAgICAgICAgICA+PC9saWItYWdncmVnYXRlLWZ1bmN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGxpYi1oaWRkZW4tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidISURERU5fRklFTEQnXCJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImdyaWQuZWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICA+PC9saWItaGlkZGVuLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgPGxpYi1pZnJhbWUtZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInSUZSQU1FX1dJREdFVCdcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ3JpZC5lbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgID48L2xpYi1pZnJhbWUtZmllbGRzPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5lbGVtZW50LmNoaWxkTG9naWNzXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29tcG9uZW50Rm9yQ2hpbGRMb2dpY3MoZ3JpZC5lbGVtZW50LmNoaWxkTG9naWNzLCAnY2hpbGQnLCBncmlkLmVsZW1lbnQuYW5zd2VyKSBhcyBvdXRsZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJvdXRsZXQuY29tcG9uZW50IHwgYXN5bmM7IGluamVjdG9yOiBvdXRsZXQuaW5qZWN0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQ/LmVsZW1lbnQ/LmNoaWxkTG9naWNzXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcG9uZW50VG9Mb2FkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdDb21wb25lbnRPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvTG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkOiBncmlkPy5lbGVtZW50Py5jaGlsZExvZ2ljcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyOiBncmlkPy5lbGVtZW50Py5hbnN3ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAnY2hpbGQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJncmlkLmVudGl0eVR5cGUgPT09ICdTRUNUSU9OJyAmJiBncmlkLnNob3dcIj5cbiAgICAgICAgICAgICAgICA8bGliLXNlY3Rpb24tZmllbGRzXG4gICAgICAgICAgICAgICAgICBbc2VjdGlvbl09XCJncmlkLmVsZW1lbnRcIlxuICAgICAgICAgICAgICAgID48L2xpYi1zZWN0aW9uLWZpZWxkcz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImlzSW52YWxpZFwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZSBtdC00XCI+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|