@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.
Files changed (443) hide show
  1. package/README.md +24 -24
  2. package/ng-package.json +30 -0
  3. package/package.json +33 -46
  4. package/{assets → src/assets}/icons/close-sidebar-mark-icon.svg +3 -3
  5. package/{assets → src/assets}/icons/copy-icon.svg +5 -5
  6. package/{assets → src/assets}/icons/delete-icon.svg +7 -7
  7. package/{assets → src/assets}/icons/delete-no-outline-icon.svg +7 -7
  8. package/src/environment/environment.ts +6 -0
  9. package/src/form-fields/aggregate-function/aggregate-function.component.html +63 -0
  10. package/src/form-fields/aggregate-function/aggregate-function.component.scss +1 -0
  11. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +21 -0
  12. package/src/form-fields/aggregate-function/aggregate-function.component.ts +148 -0
  13. package/src/form-fields/check-box-fields/check-box-fields.component.html +81 -0
  14. package/src/form-fields/check-box-fields/check-box-fields.component.scss +28 -0
  15. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +21 -0
  16. package/src/form-fields/check-box-fields/check-box-fields.component.ts +538 -0
  17. package/src/form-fields/currency-fields/currency-fields.component.html +85 -0
  18. package/src/form-fields/currency-fields/currency-fields.component.scss +48 -0
  19. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +21 -0
  20. package/src/form-fields/currency-fields/currency-fields.component.ts +589 -0
  21. package/src/form-fields/date-time-fields/date-time-fields.component.html +268 -0
  22. package/src/form-fields/date-time-fields/date-time-fields.component.scss +88 -0
  23. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +21 -0
  24. package/src/form-fields/date-time-fields/date-time-fields.component.ts +693 -0
  25. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +77 -0
  26. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +12 -0
  27. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +21 -0
  28. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +698 -0
  29. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +72 -0
  30. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +33 -0
  31. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +21 -0
  32. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +256 -0
  33. package/src/form-fields/form-fields.module.ts +110 -0
  34. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  35. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +21 -0
  36. package/src/form-fields/hidden-field/hidden-field.component.ts +156 -0
  37. package/src/form-fields/iframe-fields/iframe-fields.component.html +31 -0
  38. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  39. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +21 -0
  40. package/src/form-fields/iframe-fields/iframe-fields.component.ts +225 -0
  41. package/src/form-fields/location-fields/location-fields.component.html +54 -0
  42. package/src/form-fields/location-fields/location-fields.component.scss +22 -0
  43. package/src/form-fields/location-fields/location-fields.component.spec.ts +21 -0
  44. package/src/form-fields/location-fields/location-fields.component.ts +83 -0
  45. package/src/form-fields/mail-fields/mail-fields.component.html +66 -0
  46. package/src/form-fields/mail-fields/mail-fields.component.scss +10 -0
  47. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +21 -0
  48. package/src/form-fields/mail-fields/mail-fields.component.ts +127 -0
  49. package/src/form-fields/mobile-fields/mobile-fields.component.html +97 -0
  50. package/src/form-fields/mobile-fields/mobile-fields.component.scss +52 -0
  51. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +21 -0
  52. package/src/form-fields/mobile-fields/mobile-fields.component.ts +310 -0
  53. package/src/form-fields/number-fields/number-fields.component.html +70 -0
  54. package/src/form-fields/number-fields/number-fields.component.scss +17 -0
  55. package/src/form-fields/number-fields/number-fields.component.spec.ts +21 -0
  56. package/src/form-fields/number-fields/number-fields.component.ts +256 -0
  57. package/src/form-fields/password-fields/password-fields.component.html +113 -0
  58. package/src/form-fields/password-fields/password-fields.component.scss +61 -0
  59. package/src/form-fields/password-fields/password-fields.component.spec.ts +21 -0
  60. package/src/form-fields/password-fields/password-fields.component.ts +273 -0
  61. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +82 -0
  62. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +28 -0
  63. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +21 -0
  64. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +391 -0
  65. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +67 -0
  66. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +23 -0
  67. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +21 -0
  68. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +145 -0
  69. package/src/form-fields/section-fields/section-fields.component.html +4 -0
  70. package/src/form-fields/section-fields/section-fields.component.scss +37 -0
  71. package/src/form-fields/section-fields/section-fields.component.spec.ts +21 -0
  72. package/src/form-fields/section-fields/section-fields.component.ts +25 -0
  73. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +93 -0
  74. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +52 -0
  75. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +21 -0
  76. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +155 -0
  77. package/src/form-fields/signature-fields/signature-fields.component.html +43 -0
  78. package/src/form-fields/signature-fields/signature-fields.component.scss +10 -0
  79. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +21 -0
  80. package/src/form-fields/signature-fields/signature-fields.component.ts +25 -0
  81. package/src/form-fields/slider-fields/slider-fields.component.html +67 -0
  82. package/src/form-fields/slider-fields/slider-fields.component.scss +55 -0
  83. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +21 -0
  84. package/src/form-fields/slider-fields/slider-fields.component.ts +63 -0
  85. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +52 -0
  86. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +85 -0
  87. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +21 -0
  88. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +62 -0
  89. package/src/form-fields/text-area-fields/text-area-fields.component.html +68 -0
  90. package/src/form-fields/text-area-fields/text-area-fields.component.scss +19 -0
  91. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +21 -0
  92. package/src/form-fields/text-area-fields/text-area-fields.component.ts +166 -0
  93. package/src/form-fields/text-fields/text-fields.component.html +67 -0
  94. package/src/form-fields/text-fields/text-fields.component.scss +26 -0
  95. package/src/form-fields/text-fields/text-fields.component.spec.ts +21 -0
  96. package/src/form-fields/text-fields/text-fields.component.ts +248 -0
  97. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +70 -0
  98. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +112 -0
  99. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +21 -0
  100. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +74 -0
  101. package/src/form-fields/url-fields/url-fields.component.html +109 -0
  102. package/src/form-fields/url-fields/url-fields.component.scss +22 -0
  103. package/src/form-fields/url-fields/url-fields.component.spec.ts +21 -0
  104. package/src/form-fields/url-fields/url-fields.component.ts +123 -0
  105. package/src/form-submission/form-submission.module.ts +40 -0
  106. package/src/form-submission/header/header.component.html +6 -0
  107. package/src/form-submission/header/header.component.scss +26 -0
  108. package/src/form-submission/header/header.component.spec.ts +21 -0
  109. package/src/form-submission/header/header.component.ts +12 -0
  110. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +134 -0
  111. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +200 -0
  112. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +21 -0
  113. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +134 -0
  114. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +207 -0
  115. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +208 -0
  116. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +21 -0
  117. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +74 -0
  118. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +60 -0
  119. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +33 -0
  120. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +195 -0
  121. package/src/form-submission/submission-container/submission-container.component.html +30 -0
  122. package/src/form-submission/submission-container/submission-container.component.scss +67 -0
  123. package/src/form-submission/submission-container/submission-container.component.spec.ts +21 -0
  124. package/src/form-submission/submission-container/submission-container.component.ts +14 -0
  125. package/src/form-submission/submit-form/submit-form.component.html +76 -0
  126. package/src/form-submission/submit-form/submit-form.component.scss +88 -0
  127. package/src/form-submission/submit-form/submit-form.component.spec.ts +21 -0
  128. package/src/form-submission/submit-form/submit-form.component.ts +1953 -0
  129. package/src/lib/form-submission.component.html +15 -0
  130. package/src/lib/form-submission.component.scss +1 -0
  131. package/src/lib/form-submission.component.ts +120 -0
  132. package/src/lib/form-submission.module.ts +31 -0
  133. package/src/lib/form-submission.service.spec.ts +16 -0
  134. package/src/lib/form-submission.service.ts +9 -0
  135. package/src/models/aggregate.model.ts +4 -0
  136. package/{models/answer.model.d.ts → src/models/answer.model.ts} +25 -23
  137. package/src/models/appearance.model.ts +64 -0
  138. package/{models/attachment.model.d.ts → src/models/attachment.model.ts} +6 -6
  139. package/{models/defaultAnswerEntry.model.d.ts → src/models/defaultAnswerEntry.model.ts} +7 -5
  140. package/{models/defaultAnswersModel.model.d.ts → src/models/defaultAnswersModel.model.ts} +5 -4
  141. package/{models/defaultQuestionAnswer.model.d.ts → src/models/defaultQuestionAnswer.model.ts} +6 -6
  142. package/src/models/elementOptionAPI.model.ts +13 -0
  143. package/src/models/elementOptionAPIData.model.ts +5 -0
  144. package/src/models/elementOptionDB.model.ts +9 -0
  145. package/src/models/elementOptionDBCriteria.model.ts +7 -0
  146. package/{models/emitters.model.d.ts → src/models/emitters.model.ts} +8 -8
  147. package/{models/enum/condition.enum.d.ts → src/models/enum/condition.enum.ts} +2 -2
  148. package/src/models/enum/elementType .enum.ts +22 -0
  149. package/src/models/enum/entityType.enum.ts +10 -0
  150. package/{models/formConfiguration.model.d.ts → src/models/formConfiguration.model.ts} +2 -2
  151. package/{models/formElement.model.d.ts → src/models/formElement.model.ts} +22 -22
  152. package/{models/formElementType.model.d.ts → src/models/formElementType.model.ts} +3 -2
  153. package/{models/grid.model.d.ts → src/models/grid.model.ts} +14 -13
  154. package/{models/hiddenField.model.d.ts → src/models/hiddenField.model.ts} +5 -5
  155. package/{models/iFrameProperties.model.d.ts → src/models/iFrameProperties.model.ts} +13 -13
  156. package/src/models/logic.model.ts +11 -0
  157. package/src/models/multifields.model.ts +12 -0
  158. package/{models/option.model.d.ts → src/models/option.model.ts} +5 -5
  159. package/src/models/page.model.ts +7 -0
  160. package/src/models/publicForm.model.ts +19 -0
  161. package/src/models/question.model.ts +27 -0
  162. package/src/models/questionAnswer.model.ts +8 -0
  163. package/src/models/questionGroup.model.ts +12 -0
  164. package/src/models/response.model.ts +9 -0
  165. package/src/models/result.model.ts +5 -0
  166. package/{models/row.model.d.ts → src/models/row.model.ts} +2 -1
  167. package/src/models/scoring.model.ts +10 -0
  168. package/src/models/section.model.ts +6 -0
  169. package/src/models/subForm.model.ts +25 -0
  170. package/src/models/subformConfiguration.model.ts +4 -0
  171. package/src/models/subformPropery.model.ts +8 -0
  172. package/{models/submission.model.d.ts → src/models/submission.model.ts} +16 -14
  173. package/{models/submissionCopyConfig.mopdel.d.ts → src/models/submissionCopyConfig.mopdel.ts} +4 -4
  174. package/{models/terms&condition.model.d.ts → src/models/terms&condition.model.ts} +1 -1
  175. package/src/models/validation.model.ts +48 -0
  176. package/src/models/whenClause.model.ts +7 -0
  177. package/{models/whenClauseCondition.model.d.ts → src/models/whenClauseCondition.model.ts} +6 -6
  178. package/{models/whenClauseElements.model.d.ts → src/models/whenClauseElements.model.ts} +6 -5
  179. package/{public-api.d.ts → src/public-api.ts} +4 -0
  180. package/src/question/card-subform/card-subform.component.html +282 -0
  181. package/src/question/card-subform/card-subform.component.scss +49 -0
  182. package/src/question/card-subform/card-subform.component.spec.ts +21 -0
  183. package/src/question/card-subform/card-subform.component.ts +407 -0
  184. package/src/question/confirm-dialog/confirm-dialog.component.html +32 -0
  185. package/src/question/confirm-dialog/confirm-dialog.component.scss +109 -0
  186. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +21 -0
  187. package/src/question/confirm-dialog/confirm-dialog.component.ts +24 -0
  188. package/src/question/form-elements/form-elements.component.html +28 -0
  189. package/src/question/form-elements/form-elements.component.scss +0 -0
  190. package/src/question/form-elements/form-elements.component.spec.ts +21 -0
  191. package/src/question/form-elements/form-elements.component.ts +41 -0
  192. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +321 -0
  193. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +78 -0
  194. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +21 -0
  195. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +425 -0
  196. package/src/question/multifields/multifields.component.html +78 -0
  197. package/src/question/multifields/multifields.component.scss +6 -0
  198. package/src/question/multifields/multifields.component.spec.ts +21 -0
  199. package/src/question/multifields/multifields.component.ts +27 -0
  200. package/src/question/multiple-subform/multiple-subform.component.html +185 -0
  201. package/src/question/multiple-subform/multiple-subform.component.scss +52 -0
  202. package/src/question/multiple-subform/multiple-subform.component.spec.ts +21 -0
  203. package/src/question/multiple-subform/multiple-subform.component.ts +481 -0
  204. package/src/question/question/question.component.html +51 -0
  205. package/src/question/question/question.component.scss +0 -0
  206. package/src/question/question/question.component.spec.ts +21 -0
  207. package/src/question/question/question.component.ts +129 -0
  208. package/src/question/question-group/question-group.component.html +147 -0
  209. package/src/question/question-group/question-group.component.scss +36 -0
  210. package/src/question/question-group/question-group.component.spec.ts +21 -0
  211. package/src/question/question-group/question-group.component.ts +94 -0
  212. package/src/question/question.module.ts +22 -0
  213. package/src/question/recursive-logic/recursive-logic.component.html +33 -0
  214. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  215. package/src/question/recursive-logic/recursive-logic.component.spec.ts +21 -0
  216. package/src/question/recursive-logic/recursive-logic.component.ts +29 -0
  217. package/src/question/sub-form/sub-form.component.html +254 -0
  218. package/src/question/sub-form/sub-form.component.scss +83 -0
  219. package/src/question/sub-form/sub-form.component.spec.ts +21 -0
  220. package/src/question/sub-form/sub-form.component.ts +421 -0
  221. package/src/services/aggregate.service.ts +148 -0
  222. package/src/services/countryService.ts +92 -0
  223. package/src/services/data.service.ts +36 -0
  224. package/src/services/element-tracker.service.spec.ts +16 -0
  225. package/src/services/element-tracker.service.ts +24 -0
  226. package/src/services/form-validation.service.ts +151 -0
  227. package/src/services/form.service.spec.ts +16 -0
  228. package/src/services/form.service.ts +407 -0
  229. package/src/services/mapper.service.ts +625 -0
  230. package/src/services/recaptcha.service.spec.ts +16 -0
  231. package/src/services/recaptcha.service.ts +179 -0
  232. package/src/services/score.service.ts +352 -0
  233. package/src/services/subform-copy.service.ts +148 -0
  234. package/src/services/validation.service.spec.ts +16 -0
  235. package/src/services/validation.service.ts +33 -0
  236. package/src/services/whenClause.service.ts +502 -0
  237. package/src/shared/shared.module.ts +58 -0
  238. package/src/styles/shared-style.scss +86 -0
  239. package/src/sub-form/sub-form.module.ts +24 -0
  240. package/src/sub-form/submission-modal/submission-modal.component.html +160 -0
  241. package/src/sub-form/submission-modal/submission-modal.component.scss +54 -0
  242. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +21 -0
  243. package/src/sub-form/submission-modal/submission-modal.component.ts +127 -0
  244. package/tsconfig.lib.json +14 -0
  245. package/tsconfig.lib.prod.json +10 -0
  246. package/tsconfig.spec.json +14 -0
  247. package/environment/environment.d.ts +0 -5
  248. package/esm2022/environment/environment.mjs +0 -6
  249. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +0 -146
  250. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +0 -473
  251. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +0 -502
  252. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +0 -608
  253. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +0 -585
  254. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +0 -224
  255. package/esm2022/form-fields/form-fields.module.mjs +0 -174
  256. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +0 -137
  257. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +0 -198
  258. package/esm2022/form-fields/location-fields/location-fields.component.mjs +0 -85
  259. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +0 -131
  260. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +0 -270
  261. package/esm2022/form-fields/number-fields/number-fields.component.mjs +0 -242
  262. package/esm2022/form-fields/password-fields/password-fields.component.mjs +0 -257
  263. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +0 -346
  264. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +0 -148
  265. package/esm2022/form-fields/section-fields/section-fields.component.mjs +0 -29
  266. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +0 -158
  267. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +0 -32
  268. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +0 -73
  269. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +0 -66
  270. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +0 -159
  271. package/esm2022/form-fields/text-fields/text-fields.component.mjs +0 -245
  272. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +0 -85
  273. package/esm2022/form-fields/url-fields/url-fields.component.mjs +0 -124
  274. package/esm2022/form-submission/form-submission.module.mjs +0 -64
  275. package/esm2022/form-submission/header/header.component.mjs +0 -20
  276. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +0 -171
  277. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +0 -124
  278. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +0 -50
  279. package/esm2022/form-submission/submission-container/submission-container.component.mjs +0 -17
  280. package/esm2022/form-submission/submit-form/submit-form.component.mjs +0 -1610
  281. package/esm2022/lib/form-submission.component.mjs +0 -113
  282. package/esm2022/lib/form-submission.module.mjs +0 -56
  283. package/esm2022/lib/form-submission.service.mjs +0 -14
  284. package/esm2022/models/aggregate.model.mjs +0 -2
  285. package/esm2022/models/answer.model.mjs +0 -2
  286. package/esm2022/models/appearance.model.mjs +0 -2
  287. package/esm2022/models/attachment.model.mjs +0 -2
  288. package/esm2022/models/defaultAnswerEntry.model.mjs +0 -2
  289. package/esm2022/models/defaultAnswersModel.model.mjs +0 -2
  290. package/esm2022/models/defaultQuestionAnswer.model.mjs +0 -2
  291. package/esm2022/models/elementOptionAPI.model.mjs +0 -2
  292. package/esm2022/models/elementOptionAPIData.model.mjs +0 -2
  293. package/esm2022/models/elementOptionDB.model.mjs +0 -2
  294. package/esm2022/models/elementOptionDBCriteria.model.mjs +0 -2
  295. package/esm2022/models/emitters.model.mjs +0 -2
  296. package/esm2022/models/enum/condition.enum.mjs +0 -18
  297. package/esm2022/models/enum/elementType .enum.mjs +0 -24
  298. package/esm2022/models/enum/entityType.enum.mjs +0 -12
  299. package/esm2022/models/formConfiguration.model.mjs +0 -2
  300. package/esm2022/models/formElement.model.mjs +0 -2
  301. package/esm2022/models/formElementType.model.mjs +0 -2
  302. package/esm2022/models/grid.model.mjs +0 -2
  303. package/esm2022/models/hiddenField.model.mjs +0 -2
  304. package/esm2022/models/iFrameProperties.model.mjs +0 -2
  305. package/esm2022/models/logic.model.mjs +0 -2
  306. package/esm2022/models/multifields.model.mjs +0 -2
  307. package/esm2022/models/option.model.mjs +0 -2
  308. package/esm2022/models/page.model.mjs +0 -2
  309. package/esm2022/models/publicForm.model.mjs +0 -2
  310. package/esm2022/models/question.model.mjs +0 -2
  311. package/esm2022/models/questionAnswer.model.mjs +0 -2
  312. package/esm2022/models/questionGroup.model.mjs +0 -2
  313. package/esm2022/models/row.model.mjs +0 -2
  314. package/esm2022/models/scoring.model.mjs +0 -2
  315. package/esm2022/models/section.model.mjs +0 -2
  316. package/esm2022/models/subForm.model.mjs +0 -2
  317. package/esm2022/models/subformConfiguration.model.mjs +0 -2
  318. package/esm2022/models/subformPropery.model.mjs +0 -2
  319. package/esm2022/models/submission.model.mjs +0 -2
  320. package/esm2022/models/submissionCopyConfig.mopdel.mjs +0 -2
  321. package/esm2022/models/terms&condition.model.mjs +0 -2
  322. package/esm2022/models/validation.model.mjs +0 -2
  323. package/esm2022/models/whenClause.model.mjs +0 -2
  324. package/esm2022/models/whenClauseCondition.model.mjs +0 -2
  325. package/esm2022/models/whenClauseElements.model.mjs +0 -2
  326. package/esm2022/piserve-tech-form-submission.mjs +0 -5
  327. package/esm2022/public-api.mjs +0 -7
  328. package/esm2022/question/card-subform/card-subform.component.mjs +0 -354
  329. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +0 -27
  330. package/esm2022/question/form-elements/form-elements.component.mjs +0 -62
  331. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +0 -384
  332. package/esm2022/question/multifields/multifields.component.mjs +0 -54
  333. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +0 -413
  334. package/esm2022/question/question/question.component.mjs +0 -145
  335. package/esm2022/question/question-group/question-group.component.mjs +0 -102
  336. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +0 -49
  337. package/esm2022/question/sub-form/sub-form.component.mjs +0 -351
  338. package/esm2022/services/aggregate.service.mjs +0 -139
  339. package/esm2022/services/countryService.mjs +0 -89
  340. package/esm2022/services/data.service.mjs +0 -36
  341. package/esm2022/services/element-tracker.service.mjs +0 -27
  342. package/esm2022/services/form-validation.service.mjs +0 -128
  343. package/esm2022/services/form.service.mjs +0 -333
  344. package/esm2022/services/mapper.service.mjs +0 -519
  345. package/esm2022/services/recaptcha.service.mjs +0 -136
  346. package/esm2022/services/score.service.mjs +0 -268
  347. package/esm2022/services/subform-copy.service.mjs +0 -122
  348. package/esm2022/services/validation.service.mjs +0 -35
  349. package/esm2022/services/whenClause.service.mjs +0 -423
  350. package/esm2022/shared/shared.module.mjs +0 -97
  351. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +0 -133
  352. package/fesm2022/piserve-tech-form-submission.mjs +0 -11658
  353. package/fesm2022/piserve-tech-form-submission.mjs.map +0 -1
  354. package/form-fields/aggregate-function/aggregate-function.component.d.ts +0 -43
  355. package/form-fields/check-box-fields/check-box-fields.component.d.ts +0 -73
  356. package/form-fields/currency-fields/currency-fields.component.d.ts +0 -62
  357. package/form-fields/date-time-fields/date-time-fields.component.d.ts +0 -96
  358. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +0 -88
  359. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +0 -72
  360. package/form-fields/form-fields.module.d.ts +0 -40
  361. package/form-fields/hidden-field/hidden-field.component.d.ts +0 -38
  362. package/form-fields/iframe-fields/iframe-fields.component.d.ts +0 -35
  363. package/form-fields/location-fields/location-fields.component.d.ts +0 -29
  364. package/form-fields/mail-fields/mail-fields.component.d.ts +0 -41
  365. package/form-fields/mobile-fields/mobile-fields.component.d.ts +0 -71
  366. package/form-fields/number-fields/number-fields.component.d.ts +0 -53
  367. package/form-fields/password-fields/password-fields.component.d.ts +0 -57
  368. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +0 -70
  369. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +0 -46
  370. package/form-fields/section-fields/section-fields.component.d.ts +0 -10
  371. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +0 -45
  372. package/form-fields/signature-fields/signature-fields.component.d.ts +0 -13
  373. package/form-fields/slider-fields/slider-fields.component.d.ts +0 -32
  374. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +0 -26
  375. package/form-fields/text-area-fields/text-area-fields.component.d.ts +0 -49
  376. package/form-fields/text-fields/text-fields.component.d.ts +0 -49
  377. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +0 -29
  378. package/form-fields/url-fields/url-fields.component.d.ts +0 -41
  379. package/form-submission/form-submission.module.d.ts +0 -20
  380. package/form-submission/header/header.component.d.ts +0 -7
  381. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +0 -57
  382. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +0 -46
  383. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +0 -17
  384. package/form-submission/submission-container/submission-container.component.d.ts +0 -7
  385. package/form-submission/submit-form/submit-form.component.d.ts +0 -237
  386. package/index.d.ts +0 -5
  387. package/lib/form-submission.component.d.ts +0 -30
  388. package/lib/form-submission.module.d.ts +0 -16
  389. package/lib/form-submission.service.d.ts +0 -6
  390. package/models/aggregate.model.d.ts +0 -4
  391. package/models/appearance.model.d.ts +0 -64
  392. package/models/elementOptionAPI.model.d.ts +0 -12
  393. package/models/elementOptionAPIData.model.d.ts +0 -5
  394. package/models/elementOptionDB.model.d.ts +0 -8
  395. package/models/elementOptionDBCriteria.model.d.ts +0 -7
  396. package/models/enum/elementType .enum.d.ts +0 -22
  397. package/models/enum/entityType.enum.d.ts +0 -10
  398. package/models/logic.model.d.ts +0 -9
  399. package/models/multifields.model.d.ts +0 -11
  400. package/models/page.model.d.ts +0 -6
  401. package/models/publicForm.model.d.ts +0 -18
  402. package/models/question.model.d.ts +0 -26
  403. package/models/questionAnswer.model.d.ts +0 -7
  404. package/models/questionGroup.model.d.ts +0 -11
  405. package/models/scoring.model.d.ts +0 -10
  406. package/models/section.model.d.ts +0 -6
  407. package/models/subForm.model.d.ts +0 -24
  408. package/models/subformConfiguration.model.d.ts +0 -4
  409. package/models/subformPropery.model.d.ts +0 -7
  410. package/models/validation.model.d.ts +0 -48
  411. package/models/whenClause.model.d.ts +0 -6
  412. package/question/card-subform/card-subform.component.d.ts +0 -44
  413. package/question/confirm-dialog/confirm-dialog.component.d.ts +0 -12
  414. package/question/form-elements/form-elements.component.d.ts +0 -20
  415. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +0 -47
  416. package/question/multifields/multifields.component.d.ts +0 -11
  417. package/question/multiple-subform/multiple-subform.component.d.ts +0 -39
  418. package/question/question/question.component.d.ts +0 -30
  419. package/question/question-group/question-group.component.d.ts +0 -29
  420. package/question/recursive-logic/recursive-logic.component.d.ts +0 -19
  421. package/question/sub-form/sub-form.component.d.ts +0 -70
  422. package/services/aggregate.service.d.ts +0 -29
  423. package/services/countryService.d.ts +0 -21
  424. package/services/data.service.d.ts +0 -19
  425. package/services/element-tracker.service.d.ts +0 -10
  426. package/services/form-validation.service.d.ts +0 -16
  427. package/services/form.service.d.ts +0 -27
  428. package/services/mapper.service.d.ts +0 -31
  429. package/services/recaptcha.service.d.ts +0 -46
  430. package/services/score.service.d.ts +0 -27
  431. package/services/subform-copy.service.d.ts +0 -10
  432. package/services/validation.service.d.ts +0 -14
  433. package/services/whenClause.service.d.ts +0 -45
  434. package/shared/shared.module.d.ts +0 -25
  435. package/sub-form/submission-modal/submission-modal.component.d.ts +0 -31
  436. /package/{assets → src/assets}/fonts/Garamond.woff2 +0 -0
  437. /package/{assets → src/assets}/fonts/Georgia.woff2 +0 -0
  438. /package/{assets → src/assets}/fonts/Poppins.woff2 +0 -0
  439. /package/{assets → src/assets}/fonts/Tahoma.woff2 +0 -0
  440. /package/{assets → src/assets}/fonts/Tajawal.woff2 +0 -0
  441. /package/{assets → src/assets}/fonts/Verdana.woff2 +0 -0
  442. /package/{assets → src/assets}/icons/left_arrow.svg +0 -0
  443. /package/{assets → src/assets}/icons/right_arrow.svg +0 -0
@@ -1,257 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../services/validation.service";
4
- import * as i2 from "../../services/element-tracker.service";
5
- import * as i3 from "@angular/common";
6
- import * as i4 from "@angular/forms";
7
- export class PasswordFieldsComponent {
8
- constructor(validationService, tracker) {
9
- this.validationService = validationService;
10
- this.tracker = tracker;
11
- this.question = {};
12
- this.inLine = false;
13
- this.inCard = false;
14
- this.answerChange = new EventEmitter();
15
- this.count = 0;
16
- this.required = false;
17
- this.hint = '';
18
- this.allowedSpecialCharacters = [];
19
- this.validationMessage = '';
20
- this.cnfrmValidationMessage = '';
21
- this.validationFailed = false;
22
- this.validatedCnfrmPassword = false;
23
- this.enteredPassword = '';
24
- this.enteredCnfrmPassword = '';
25
- this.passwordStrength = 0;
26
- this.questionId = '';
27
- this.elementId = '';
28
- this.disableEdit = false;
29
- }
30
- ngOnInit() {
31
- this.valueAssigned();
32
- }
33
- valueAssigned() {
34
- this.questionId = this.question.id;
35
- this.count = this.question.count;
36
- this.required = this.question.required;
37
- this.hint = this.question.hint;
38
- this.confirmPassword = this.question.formElement.appearance.confirmPassword;
39
- this.displayStrength = this.question.formElement.appearance.displayStrong;
40
- this.viewButton = this.question.formElement.appearance.viewButton;
41
- this.maxLength = this.question.formElement.validation.maxLength;
42
- this.minLength = this.question.formElement.validation.minLength;
43
- this.requireLowercaseLetters =
44
- this.question.formElement.validation.requireLowercaseLetters;
45
- this.requireUppercaseLetters =
46
- this.question.formElement.validation.requireUppercaseLetters;
47
- this.requireNumbers = this.question.formElement.validation.requireNumbers;
48
- this.requireSpecialCharacters =
49
- this.question.formElement.validation.requireSpecialCharacters;
50
- if (this.requireSpecialCharacters) {
51
- this.allowedSpecialCharacters =
52
- this.question.formElement.validation.allowedSpecialCharacters
53
- .split(',')
54
- .map((char) => char.trim());
55
- }
56
- this.enteredPassword = this.question?.answer;
57
- }
58
- togglePasswordVisibility() {
59
- let passwordField = document.getElementById('passwordField' + this.questionId);
60
- let eyeIcon = document.getElementById('passwordEyeIcon' + this.questionId);
61
- if (passwordField.type === 'password') {
62
- passwordField.type = 'text';
63
- eyeIcon.classList.remove('bi-eye-fill');
64
- eyeIcon.classList.add('bi-eye-slash-fill');
65
- }
66
- else {
67
- passwordField.type = 'password';
68
- eyeIcon.classList.remove('bi-eye-slash-fill');
69
- eyeIcon.classList.add('bi-eye-fill');
70
- }
71
- }
72
- toggleCnfrmPasswordVisibility() {
73
- let passwordField = document.getElementById('cnfrmPasswordField' + this.questionId);
74
- let eyeIcon = document.getElementById('CnfrmPasswordEyeIcon' + this.questionId);
75
- if (passwordField.type === 'password') {
76
- passwordField.type = 'text';
77
- eyeIcon.classList.remove('bi-eye-fill');
78
- eyeIcon.classList.add('bi-eye-slash-fill');
79
- }
80
- else {
81
- passwordField.type = 'password';
82
- eyeIcon.classList.remove('bi-eye-slash-fill');
83
- eyeIcon.classList.add('bi-eye-fill');
84
- }
85
- }
86
- checkPasswordMatch() {
87
- this.validationService.clearInvalid(this.buildElementId());
88
- this.validatedCnfrmPassword = false;
89
- this.cnfrmValidationMessage = '';
90
- if (this.required && this.confirmPassword && !this.enteredCnfrmPassword) {
91
- this.validatedCnfrmPassword = true;
92
- this.cnfrmValidationMessage = `Please enter a valid password`;
93
- this.question.validation = false;
94
- }
95
- else if (this.enteredPassword != this.enteredCnfrmPassword && this.confirmPassword) {
96
- this.validatedCnfrmPassword = true;
97
- this.cnfrmValidationMessage = 'Passwords do not match';
98
- this.question.validation = false;
99
- }
100
- else {
101
- this.question.validation = true;
102
- }
103
- this.validatePassword();
104
- }
105
- validatePassword() {
106
- this.validationFailed = false;
107
- this.validationService.clearInvalid(this.buildElementId());
108
- this.validationMessage = '';
109
- if (this.required && !this.enteredPassword) {
110
- this.validationFailed = true;
111
- this.validationMessage = `Please enter a valid password`;
112
- this.question.validation = false;
113
- this.question.validationMessage = `Please enter a valid password`;
114
- }
115
- else if (this.requireLowercaseLetters ||
116
- this.requireUppercaseLetters ||
117
- this.requireNumbers ||
118
- this.requireSpecialCharacters ||
119
- this.minLength ||
120
- this.maxLength) {
121
- const lowercaseRegex = /[a-z]/;
122
- const uppercaseRegex = /[A-Z]/;
123
- const numberRegex = /\d/;
124
- const specialCharacterRegex = new RegExp(`[${this.allowedSpecialCharacters.join('')}]`);
125
- const otherSpecialCharacterRegex = new RegExp(`[^a-zA-Z0-9${this.allowedSpecialCharacters.join('')}]`);
126
- let lowerCaseValidate = lowercaseRegex.test(this.enteredPassword);
127
- let upperCaseValidate = uppercaseRegex.test(this.enteredPassword);
128
- let containsNumber = numberRegex.test(this.enteredPassword);
129
- let containsSpecialCharacter = specialCharacterRegex.test(this.enteredPassword);
130
- let containsOtherSpecialCharacter = otherSpecialCharacterRegex.test(this.enteredPassword);
131
- if (!lowerCaseValidate && this.requireLowercaseLetters) {
132
- this.validationFailed = true;
133
- this.validationMessage = 'Password must contain at least one lowercase letter';
134
- this.question.validation = false;
135
- this.question.validationMessage = 'Password must contain at least one lowercase letter';
136
- }
137
- else if (!upperCaseValidate && this.requireUppercaseLetters) {
138
- this.validationFailed = true;
139
- this.validationMessage = 'Password must contain at least one uppercase letter';
140
- this.question.validation = false;
141
- this.question.validationMessage = 'Password must contain at least one uppercase letter';
142
- }
143
- else if (!containsNumber && this.requireNumbers) {
144
- this.validationFailed = true;
145
- this.validationMessage = 'Password must contain at least one number';
146
- this.question.validation = false;
147
- this.question.validationMessage = 'Password must contain at least one number';
148
- }
149
- else if (this.enteredPassword.length < this.minLength) {
150
- this.validationFailed = true;
151
- this.validationMessage = `Password must contain at least ${this.minLength} characters`;
152
- this.question.validation = false;
153
- this.question.validationMessage = `Password must contain at least ${this.minLength} characters`;
154
- }
155
- else if (this.enteredPassword.length > this.maxLength) {
156
- this.validationFailed = true;
157
- this.validationMessage = `Password must be less than ${this.maxLength} characters`;
158
- this.question.validation = false;
159
- this.question.validationMessage = `Password must be less than ${this.maxLength} characters`;
160
- }
161
- else if (!containsSpecialCharacter && this.allowedSpecialCharacters.length > 0) {
162
- this.validationFailed = true;
163
- this.validationMessage = `Password must contain at least one special character from ${this.allowedSpecialCharacters}`;
164
- this.question.validation = false;
165
- this.question.validationMessage = `Password must contain at least one special character from ${this.allowedSpecialCharacters}`;
166
- }
167
- else if (containsOtherSpecialCharacter && this.allowedSpecialCharacters.length > 0) {
168
- this.validationFailed = true;
169
- this.validationMessage = 'Password contains an invalid special character';
170
- this.question.validation = false;
171
- this.question.validationMessage = 'Password contains an invalid special character';
172
- }
173
- else if (this.confirmPassword) {
174
- this.checkPasswordMatch();
175
- }
176
- else {
177
- this.question.validation = true;
178
- }
179
- }
180
- else {
181
- this.passwordStrength = this.calculateStrength(this.enteredPassword);
182
- }
183
- this.passwordStrength = this.calculateStrength(this.enteredPassword);
184
- }
185
- validateInput(event) {
186
- const sanitizedValue = event.target.value.replace(/\s+/g, '');
187
- this.enteredPassword = sanitizedValue;
188
- this.question.answer = sanitizedValue;
189
- this.validatePassword();
190
- this.answerChange.emit({ answer: this.question.answer, maxPossibleScore: 0 });
191
- }
192
- validateCnfrm(event) {
193
- const sanitizedValue = event.target.value.replace(/\s+/g, '');
194
- this.enteredCnfrmPassword = sanitizedValue;
195
- this.checkPasswordMatch();
196
- }
197
- calculateStrength(password) {
198
- const lengthStrength = Math.min(100, (password.length / 12) * 100); // Assume maximum length of 12 for full points
199
- const lowercaseStrength = /[a-z]/.test(password) ? 20 : 0;
200
- const uppercaseStrength = /[A-Z]/.test(password) ? 20 : 0;
201
- const numberStrength = /\d/.test(password) ? 20 : 0;
202
- const specialCharacterStrength = /[!@#$%^&*(),.?":{}|<>]/.test(password) ? 20 : 0; // Adjust this regex based on your allowed special characters
203
- return lengthStrength + lowercaseStrength + uppercaseStrength + numberStrength + specialCharacterStrength;
204
- }
205
- handleValidation(isValid, message = 'This field is required') {
206
- if (isValid) {
207
- this.validationService.clearInvalid(this.buildElementId());
208
- }
209
- else {
210
- // this.validationService.setInvalid(this.question.id, message);
211
- }
212
- }
213
- buildElementId() {
214
- return (this.inLine || this.inCard)
215
- ? `${this.submissionIndex}-${this.question.id}`
216
- : `${this.question.id}`;
217
- }
218
- get isInvalid() {
219
- return !!this.validationService.getErrorMessage(this.buildElementId());
220
- }
221
- get errorMessage() {
222
- return this.validationService.getErrorMessage(this.buildElementId());
223
- }
224
- ngAfterViewInit() {
225
- if (this.inLine || this.inCard) {
226
- this.elementId = `question-${this.submissionIndex}-${this.question.id}`;
227
- }
228
- else {
229
- this.elementId = `question-${this.question.id}`;
230
- }
231
- this.tracker.registerElement(this.elementId);
232
- }
233
- ngOnDestroy() {
234
- if (this.elementId) {
235
- this.tracker.unregisterElement(this.elementId);
236
- }
237
- }
238
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PasswordFieldsComponent, deps: [{ token: i1.ValidationService }, { token: i2.ElementTrackerService }], target: i0.ɵɵFactoryTarget.Component }); }
239
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PasswordFieldsComponent, selector: "lib-password-fields", inputs: { question: "question", inLine: "inLine", inCard: "inCard", submissionIndex: "submissionIndex", disableEdit: "disableEdit" }, outputs: { answerChange: "answerChange" }, ngImport: i0, template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label [for]=\"'passwordField' + questionId\">{{ question.question }}</label\n >&nbsp;\n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n <div class=\"passwordWrapper\">\n <input\n type=\"password\"\n class=\"form-control mb-2 height\"\n [id]=\"'passwordField' + questionId\"\n (blur)=\"validatePassword()\"\n [(ngModel)]=\"enteredPassword\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredPassword)\"\n (input)=\"validateInput($event)\"\n [disabled]=\"disableEdit\"\n />\n <button\n id=\"togglePasswordBtn\"\n class=\"toggle-password-btn\"\n (click)=\"togglePasswordVisibility()\"\n *ngIf=\"viewButton\"\n >\n <i class=\"bi bi-eye-fill\" [id]=\"'passwordEyeIcon' + questionId\"></i>\n </button>\n </div>\n <div class=\"password-strength-meter\" *ngIf=\"displayStrength\">\n <div class=\"progress\">\n <div\n class=\"progress-bar\"\n role=\"progressbar\"\n [style.width]=\"passwordStrength + '%'\"\n [class.bg-danger]=\"passwordStrength < 30\"\n [class.bg-warning]=\"passwordStrength >= 30 && passwordStrength < 70\"\n [class.bg-success]=\"passwordStrength >= 70\"\n ></div>\n </div>\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredPassword)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger mb-2\">\n {{ validationMessage }}\n </div>\n\n <div class=\"cnfrmPasswordWrapper\" *ngIf=\"confirmPassword\">\n <label for=\"'cnfrmPasswordField'+questionId\">Confirm password</label>\n <input\n type=\"password\"\n class=\"form-control mb-2 height\"\n [id]=\"'cnfrmPasswordField' + questionId\"\n (blur)=\"checkPasswordMatch()\"\n [(ngModel)]=\"enteredCnfrmPassword\"\n [class.invalid]=\"validatedCnfrmPassword\"\n (input)=\"validateCnfrm($event)\"\n [disabled]=\"disableEdit\"\n />\n <button\n id=\"toggleCnfrmPasswordBtn\"\n class=\"toggle-password-btn\"\n (click)=\"toggleCnfrmPasswordVisibility()\"\n *ngIf=\"viewButton\"\n >\n <i class=\"bi bi-eye-fill\" [id]=\"'CnfrmPasswordEyeIcon' + questionId\"></i>\n </button>\n </div>\n <div *ngIf=\"validatedCnfrmPassword\" class=\"text-danger error-message\">\n {{ cnfrmValidationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.form-control,.password-input-wrapper{position:relative}.password-input{padding-right:40px}.toggle-password-btn{position:absolute;top:70%;right:15px;transform:translateY(-50%);border:none;background-color:transparent;cursor:pointer}.toggle-password-btn:focus{outline:none}.passwordWrapper,.cnfrmPasswordWrapper{position:relative}.password-strength-meter{width:40%;margin-top:10px;margin-left:auto}.progress{height:10px}.progress-bar{transition:width .3s ease-in-out}.bi{font-size:20px}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
240
- }
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PasswordFieldsComponent, decorators: [{
242
- type: Component,
243
- args: [{ selector: 'lib-password-fields', template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label [for]=\"'passwordField' + questionId\">{{ question.question }}</label\n >&nbsp;\n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n <div class=\"passwordWrapper\">\n <input\n type=\"password\"\n class=\"form-control mb-2 height\"\n [id]=\"'passwordField' + questionId\"\n (blur)=\"validatePassword()\"\n [(ngModel)]=\"enteredPassword\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredPassword)\"\n (input)=\"validateInput($event)\"\n [disabled]=\"disableEdit\"\n />\n <button\n id=\"togglePasswordBtn\"\n class=\"toggle-password-btn\"\n (click)=\"togglePasswordVisibility()\"\n *ngIf=\"viewButton\"\n >\n <i class=\"bi bi-eye-fill\" [id]=\"'passwordEyeIcon' + questionId\"></i>\n </button>\n </div>\n <div class=\"password-strength-meter\" *ngIf=\"displayStrength\">\n <div class=\"progress\">\n <div\n class=\"progress-bar\"\n role=\"progressbar\"\n [style.width]=\"passwordStrength + '%'\"\n [class.bg-danger]=\"passwordStrength < 30\"\n [class.bg-warning]=\"passwordStrength >= 30 && passwordStrength < 70\"\n [class.bg-success]=\"passwordStrength >= 70\"\n ></div>\n </div>\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredPassword)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger mb-2\">\n {{ validationMessage }}\n </div>\n\n <div class=\"cnfrmPasswordWrapper\" *ngIf=\"confirmPassword\">\n <label for=\"'cnfrmPasswordField'+questionId\">Confirm password</label>\n <input\n type=\"password\"\n class=\"form-control mb-2 height\"\n [id]=\"'cnfrmPasswordField' + questionId\"\n (blur)=\"checkPasswordMatch()\"\n [(ngModel)]=\"enteredCnfrmPassword\"\n [class.invalid]=\"validatedCnfrmPassword\"\n (input)=\"validateCnfrm($event)\"\n [disabled]=\"disableEdit\"\n />\n <button\n id=\"toggleCnfrmPasswordBtn\"\n class=\"toggle-password-btn\"\n (click)=\"toggleCnfrmPasswordVisibility()\"\n *ngIf=\"viewButton\"\n >\n <i class=\"bi bi-eye-fill\" [id]=\"'CnfrmPasswordEyeIcon' + questionId\"></i>\n </button>\n </div>\n <div *ngIf=\"validatedCnfrmPassword\" class=\"text-danger error-message\">\n {{ cnfrmValidationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.form-control,.password-input-wrapper{position:relative}.password-input{padding-right:40px}.toggle-password-btn{position:absolute;top:70%;right:15px;transform:translateY(-50%);border:none;background-color:transparent;cursor:pointer}.toggle-password-btn:focus{outline:none}.passwordWrapper,.cnfrmPasswordWrapper{position:relative}.password-strength-meter{width:40%;margin-top:10px;margin-left:auto}.progress{height:10px}.progress-bar{transition:width .3s ease-in-out}.bi{font-size:20px}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}\n"] }]
244
- }], ctorParameters: function () { return [{ type: i1.ValidationService }, { type: i2.ElementTrackerService }]; }, propDecorators: { question: [{
245
- type: Input
246
- }], inLine: [{
247
- type: Input
248
- }], inCard: [{
249
- type: Input
250
- }], submissionIndex: [{
251
- type: Input
252
- }], answerChange: [{
253
- type: Output
254
- }], disableEdit: [{
255
- type: Input
256
- }] } });
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtZmllbGRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc3VibWlzc2lvbi9zcmMvZm9ybS1maWVsZHMvcGFzc3dvcmQtZmllbGRzL3Bhc3N3b3JkLWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL2Zvcm0tZmllbGRzL3Bhc3N3b3JkLWZpZWxkcy9wYXNzd29yZC1maWVsZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBU3ZFLE1BQU0sT0FBTyx1QkFBdUI7SUErQmxDLFlBQ1UsaUJBQW9DLEVBQ3BDLE9BQThCO1FBRDlCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFoQy9CLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXZCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFFeEYsVUFBSyxHQUFXLENBQUMsQ0FBQztRQUNsQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFNBQUksR0FBVyxFQUFFLENBQUM7UUFVbEIsNkJBQXdCLEdBQWEsRUFBRSxDQUFDO1FBQ3hDLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUMvQiwyQkFBc0IsR0FBVyxFQUFFLENBQUM7UUFDcEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUN4QyxvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUM3Qix5QkFBb0IsR0FBVyxFQUFFLENBQUM7UUFDbEMscUJBQWdC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QUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ3pFO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNqRDtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7K0dBclFRLHVCQUF1QjttR0FBdkIsdUJBQXVCLDRPQ1RwQyw4eUlBaUhBOzs0RkR4R2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjs0SUFLdEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkF3QkUsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbGVtZW50VHJhY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LXRyYWNrZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1wYXNzd29yZC1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFzc3dvcmQtZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFzc3dvcmQtZmllbGRzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkRmllbGRzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcXVlc3Rpb246IGFueSA9IHt9O1xuICBASW5wdXQoKSBpbkxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5DYXJkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pc3Npb25JbmRleCE6IG51bWJlcjtcbiAgQE91dHB1dCgpIGFuc3dlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhbnN3ZXI6IGFueTsgbWF4UG9zc2libGVTY29yZT86IG51bWJlciB9PigpO1xuXG4gIGNvdW50OiBudW1iZXIgPSAwO1xuICByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBoaW50OiBzdHJpbmcgPSAnJztcbiAgY29uZmlybVBhc3N3b3JkITogYm9vbGVhbjtcbiAgZGlzcGxheVN0cmVuZ3RoITogYm9vbGVhbjtcbiAgdmlld0J1dHRvbiE6IGJvb2xlYW47XG4gIG1heExlbmd0aCE6IG51bWJlcjtcbiAgbWluTGVuZ3RoITogbnVtYmVyO1xuICByZXF1aXJlTG93ZXJjYXNlTGV0dGVycyE6IGJvb2xlYW47XG4gIHJlcXVpcmVVcHBlcmNhc2VMZXR0ZXJzITogYm9vbGVhbjtcbiAgcmVxdWlyZU51bWJlcnMhOiBib29sZWFuO1xuICByZXF1aXJlU3BlY2lhbENoYXJhY3RlcnMhOiBib29sZWFuO1xuICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IHN0cmluZ1tdID0gW107XG4gIHZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgY25mcm1WYWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHZhbGlkYXRpb25GYWlsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdmFsaWRhdGVkQ25mcm1QYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICBlbnRlcmVkUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICBlbnRlcmVkQ25mcm1QYXNzd29yZDogc3RyaW5nID0gJyc7XG4gIHBhc3N3b3JkU3RyZW5ndGg6IG51bWJlciA9IDA7XG4gIHF1ZXN0aW9uSWQ6c3RyaW5nPScnO1xuICBwcml2YXRlIGVsZW1lbnRJZDogc3RyaW5nPScnO1xuICBASW5wdXQoKSBkaXNhYmxlRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFja2VyOiBFbGVtZW50VHJhY2tlclNlcnZpY2VcbiAgKSB7XG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy52YWx1ZUFzc2lnbmVkKCk7XG4gIH1cblxuICB2YWx1ZUFzc2lnbmVkKCkge1xuICAgIHRoaXMucXVlc3Rpb25JZD10aGlzLnF1ZXN0aW9uLmlkO1xuICAgIHRoaXMuY291bnQgPSB0aGlzLnF1ZXN0aW9uLmNvdW50O1xuICAgIHRoaXMucmVxdWlyZWQgPSB0aGlzLnF1ZXN0aW9uLnJlcXVpcmVkO1xuICAgIHRoaXMuaGludCA9IHRoaXMucXVlc3Rpb24uaGludDtcbiAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jb25maXJtUGFzc3dvcmQ7XG4gICAgdGhpcy5kaXNwbGF5U3RyZW5ndGggPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UuZGlzcGxheVN0cm9uZztcbiAgICB0aGlzLnZpZXdCdXR0b24gPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2Uudmlld0J1dHRvbjtcbiAgICB0aGlzLm1heExlbmd0aCA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQudmFsaWRhdGlvbi5tYXhMZW5ndGg7XG4gICAgdGhpcy5taW5MZW5ndGggPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LnZhbGlkYXRpb24ubWluTGVuZ3RoO1xuICAgIHRoaXMucmVxdWlyZUxvd2VyY2FzZUxldHRlcnMgPVxuICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLnJlcXVpcmVMb3dlcmNhc2VMZXR0ZXJzO1xuICAgIHRoaXMucmVxdWlyZVVwcGVyY2FzZUxldHRlcnMgPVxuICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLnJlcXVpcmVVcHBlcmNhc2VMZXR0ZXJzO1xuICAgIHRoaXMucmVxdWlyZU51bWJlcnMgPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LnZhbGlkYXRpb24ucmVxdWlyZU51bWJlcnM7XG4gICAgdGhpcy5yZXF1aXJlU3BlY2lhbENoYXJhY3RlcnMgPVxuICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLnJlcXVpcmVTcGVjaWFsQ2hhcmFjdGVycztcbiAgICBpZiAodGhpcy5yZXF1aXJlU3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIHRoaXMuYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzID1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLmFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyc1xuICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgLm1hcCgoY2hhcjogYW55KSA9PiBjaGFyLnRyaW0oKSk7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJlZFBhc3N3b3JkID0gdGhpcy5xdWVzdGlvbj8uYW5zd2VyO1xuICB9XG5cbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCkge1xuICAgIGxldCBwYXNzd29yZEZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAncGFzc3dvcmRGaWVsZCcrdGhpcy5xdWVzdGlvbklkXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCBleWVJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAncGFzc3dvcmRFeWVJY29uJyt0aGlzLnF1ZXN0aW9uSWRcbiAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBpZiAocGFzc3dvcmRGaWVsZC50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICBwYXNzd29yZEZpZWxkLnR5cGUgPSAndGV4dCc7XG4gICAgICBleWVJY29uLmNsYXNzTGlzdC5yZW1vdmUoJ2JpLWV5ZS1maWxsJyk7XG4gICAgICBleWVJY29uLmNsYXNzTGlzdC5hZGQoJ2JpLWV5ZS1zbGFzaC1maWxsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhc3N3b3JkRmllbGQudHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICBleWVJY29uLmNsYXNzTGlzdC5yZW1vdmUoJ2JpLWV5ZS1zbGFzaC1maWxsJyk7XG4gICAgICBleWVJY29uLmNsYXNzTGlzdC5hZGQoJ2JpLWV5ZS1maWxsJyk7XG4gICAgfVxuICB9XG4gIHRvZ2dsZUNuZnJtUGFzc3dvcmRWaXNpYmlsaXR5KCkge1xuICAgIGxldCBwYXNzd29yZEZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY25mcm1QYXNzd29yZEZpZWxkJyt0aGlzLnF1ZXN0aW9uSWRcbiAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IGV5ZUljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICdDbmZybVBhc3N3b3JkRXllSWNvbicrdGhpcy5xdWVzdGlvbklkXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgaWYgKHBhc3N3b3JkRmllbGQudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgcGFzc3dvcmRGaWVsZC50eXBlID0gJ3RleHQnO1xuICAgICAgZXllSWNvbi5jbGFzc0xpc3QucmVtb3ZlKCdiaS1leWUtZmlsbCcpO1xuICAgICAgZXllSWNvbi5jbGFzc0xpc3QuYWRkKCdiaS1leWUtc2xhc2gtZmlsbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXNzd29yZEZpZWxkLnR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgZXllSWNvbi5jbGFzc0xpc3QucmVtb3ZlKCdiaS1leWUtc2xhc2gtZmlsbCcpO1xuICAgICAgZXllSWNvbi5jbGFzc0xpc3QuYWRkKCdiaS1leWUtZmlsbCcpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrUGFzc3dvcmRNYXRjaCgpIHtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLmNsZWFySW52YWxpZCh0aGlzLmJ1aWxkRWxlbWVudElkKCkpO1xuICAgIHRoaXMudmFsaWRhdGVkQ25mcm1QYXNzd29yZCA9IGZhbHNlO1xuICAgIHRoaXMuY25mcm1WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmIHRoaXMuY29uZmlybVBhc3N3b3JkICYmICF0aGlzLmVudGVyZWRDbmZybVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlZENuZnJtUGFzc3dvcmQgPSB0cnVlO1xuICAgICAgdGhpcy5jbmZybVZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIHZhbGlkIHBhc3N3b3JkYDtcbiAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmVudGVyZWRQYXNzd29yZCAhPSB0aGlzLmVudGVyZWRDbmZybVBhc3N3b3JkICYmIHRoaXMuY29uZmlybVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlZENuZnJtUGFzc3dvcmQgPSB0cnVlO1xuICAgICAgdGhpcy5jbmZybVZhbGlkYXRpb25NZXNzYWdlID0gJ1Bhc3N3b3JkcyBkbyBub3QgbWF0Y2gnO1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUGFzc3dvcmQoKTtcbiAgfVxuXG4gIFxuXG4gIHZhbGlkYXRlUGFzc3dvcmQoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gZmFsc2U7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgIXRoaXMuZW50ZXJlZFBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYXNzd29yZGA7XG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbk1lc3NhZ2UgPSBgUGxlYXNlIGVudGVyIGEgdmFsaWQgcGFzc3dvcmRgO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVMb3dlcmNhc2VMZXR0ZXJzIHx8XG4gICAgICB0aGlzLnJlcXVpcmVVcHBlcmNhc2VMZXR0ZXJzIHx8XG4gICAgICB0aGlzLnJlcXVpcmVOdW1iZXJzIHx8XG4gICAgICB0aGlzLnJlcXVpcmVTcGVjaWFsQ2hhcmFjdGVycyB8fFxuICAgICAgdGhpcy5taW5MZW5ndGggfHxcbiAgICAgIHRoaXMubWF4TGVuZ3RoXG4gICAgKSB7ICAgICAgXG4gICAgICBjb25zdCBsb3dlcmNhc2VSZWdleCA9IC9bYS16XS87XG4gICAgICBjb25zdCB1cHBlcmNhc2VSZWdleCA9IC9bQS1aXS87XG4gICAgICBjb25zdCBudW1iZXJSZWdleCA9IC9cXGQvO1xuICAgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlclJlZ2V4ID0gbmV3IFJlZ0V4cChgWyR7dGhpcy5hbGxvd2VkU3BlY2lhbENoYXJhY3RlcnMuam9pbignJyl9XWApO1xuICAgICAgY29uc3Qgb3RoZXJTcGVjaWFsQ2hhcmFjdGVyUmVnZXggPSBuZXcgUmVnRXhwKGBbXmEtekEtWjAtOSR7dGhpcy5hbGxvd2VkU3BlY2lhbENoYXJhY3RlcnMuam9pbignJyl9XWApO1xuICBcbiAgICAgIGxldCBsb3dlckNhc2VWYWxpZGF0ZSA9IGxvd2VyY2FzZVJlZ2V4LnRlc3QodGhpcy5lbnRlcmVkUGFzc3dvcmQpO1xuICAgICAgbGV0IHVwcGVyQ2FzZVZhbGlkYXRlID0gdXBwZXJjYXNlUmVnZXgudGVzdCh0aGlzLmVudGVyZWRQYXNzd29yZCk7XG4gICAgICBsZXQgY29udGFpbnNOdW1iZXIgPSBudW1iZXJSZWdleC50ZXN0KHRoaXMuZW50ZXJlZFBhc3N3b3JkKTtcbiAgICAgIGxldCBjb250YWluc1NwZWNpYWxDaGFyYWN0ZXIgPSBzcGVjaWFsQ2hhcmFjdGVyUmVnZXgudGVzdCh0aGlzLmVudGVyZWRQYXNzd29yZCk7XG4gICAgICBsZXQgY29udGFpbnNPdGhlclNwZWNpYWxDaGFyYWN0ZXIgPSBvdGhlclNwZWNpYWxDaGFyYWN0ZXJSZWdleC50ZXN0KHRoaXMuZW50ZXJlZFBhc3N3b3JkKTtcbiAgXG4gICAgICBpZiAoIWxvd2VyQ2FzZVZhbGlkYXRlICYmIHRoaXMucmVxdWlyZUxvd2VyY2FzZUxldHRlcnMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICdQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGxvd2VyY2FzZSBsZXR0ZXInO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9ICdQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGxvd2VyY2FzZSBsZXR0ZXInO1xuICAgICAgfSBlbHNlIGlmICghdXBwZXJDYXNlVmFsaWRhdGUgJiYgdGhpcy5yZXF1aXJlVXBwZXJjYXNlTGV0dGVycykge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJ1Bhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGxldHRlcic7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gJ1Bhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGxldHRlcic7XG4gICAgICB9IGVsc2UgaWYgKCFjb250YWluc051bWJlciAmJiB0aGlzLnJlcXVpcmVOdW1iZXJzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkZhaWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAnUGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBudW1iZXInO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9ICdQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG51bWJlcic7XG4gICAgICB9ZWxzZSBpZiAodGhpcy5lbnRlcmVkUGFzc3dvcmQubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHt0aGlzLm1pbkxlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gYFBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCAke3RoaXMubWluTGVuZ3RofSBjaGFyYWN0ZXJzYDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5lbnRlcmVkUGFzc3dvcmQubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQYXNzd29yZCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMubWF4TGVuZ3RofSBjaGFyYWN0ZXJzYDtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbk1lc3NhZ2UgPSBgUGFzc3dvcmQgbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLm1heExlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgICB9IGVsc2UgaWYgKCFjb250YWluc1NwZWNpYWxDaGFyYWN0ZXIgJiYgdGhpcy5hbGxvd2VkU3BlY2lhbENoYXJhY3RlcnMubGVuZ3RoPjApIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNwZWNpYWwgY2hhcmFjdGVyIGZyb20gJHt0aGlzLmFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyc31gO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9IGBQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNwZWNpYWwgY2hhcmFjdGVyIGZyb20gJHt0aGlzLmFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyc31gO1xuICAgICAgfSBlbHNlIGlmKGNvbnRhaW5zT3RoZXJTcGVjaWFsQ2hhcmFjdGVyICYmIHRoaXMuYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzLmxlbmd0aD4wKXtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICdQYXNzd29yZCBjb250YWlucyBhbiBpbnZhbGlkIHNwZWNpYWwgY2hhcmFjdGVyJztcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsaWRhdGlvbk1lc3NhZ2UgPSAnUGFzc3dvcmQgY29udGFpbnMgYW4gaW52YWxpZCBzcGVjaWFsIGNoYXJhY3Rlcic7XG4gICAgICB9IGVsc2UgaWYodGhpcy5jb25maXJtUGFzc3dvcmQpe1xuICAgICAgICB0aGlzLmNoZWNrUGFzc3dvcmRNYXRjaCgpO1xuICAgICAgfVxuICAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgfSAgICBcbiAgICB9IGVsc2UgeyAgICAgICAgICAgIFxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoPXRoaXMuY2FsY3VsYXRlU3RyZW5ndGgodGhpcy5lbnRlcmVkUGFzc3dvcmQpO1xuICAgIH1cbiAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGggPSB0aGlzLmNhbGN1bGF0ZVN0cmVuZ3RoKHRoaXMuZW50ZXJlZFBhc3N3b3JkKVxufVxuXG4gIHZhbGlkYXRlSW5wdXQoZXZlbnQ6YW55KXtcbiAgICBjb25zdCBzYW5pdGl6ZWRWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB0aGlzLmVudGVyZWRQYXNzd29yZCA9IHNhbml0aXplZFZhbHVlO1xuICAgIHRoaXMucXVlc3Rpb24uYW5zd2VyPXNhbml0aXplZFZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXNzd29yZCgpOyAgXG4gICAgdGhpcy5hbnN3ZXJDaGFuZ2UuZW1pdCh7YW5zd2VyOnRoaXMucXVlc3Rpb24uYW5zd2VyLG1heFBvc3NpYmxlU2NvcmU6MH0pOyBcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUNuZnJtKGV2ZW50OmFueSl7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICAgIHRoaXMuZW50ZXJlZENuZnJtUGFzc3dvcmQgPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIHRoaXMuY2hlY2tQYXNzd29yZE1hdGNoKCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlU3RyZW5ndGgocGFzc3dvcmQ6YW55KSB7XG4gICAgICBjb25zdCBsZW5ndGhTdHJlbmd0aCA9IE1hdGgubWluKDEwMCwgKHBhc3N3b3JkLmxlbmd0aCAvIDEyKSAqIDEwMCk7IC8vIEFzc3VtZSBtYXhpbXVtIGxlbmd0aCBvZiAxMiBmb3IgZnVsbCBwb2ludHNcbiAgICAgIGNvbnN0IGxvd2VyY2FzZVN0cmVuZ3RoID0gL1thLXpdLy50ZXN0KHBhc3N3b3JkKSA/IDIwIDogMDtcbiAgICAgIGNvbnN0IHVwcGVyY2FzZVN0cmVuZ3RoID0gL1tBLVpdLy50ZXN0KHBhc3N3b3JkKSA/IDIwIDogMDtcbiAgICAgIGNvbnN0IG51bWJlclN0cmVuZ3RoID0gL1xcZC8udGVzdChwYXNzd29yZCkgPyAyMCA6IDA7XG4gICAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVyU3RyZW5ndGggPSAvWyFAIyQlXiYqKCksLj9cIjp7fXw8Pl0vLnRlc3QocGFzc3dvcmQpID8gMjAgOiAwOyAvLyBBZGp1c3QgdGhpcyByZWdleCBiYXNlZCBvbiB5b3VyIGFsbG93ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgXG4gICAgICByZXR1cm4gbGVuZ3RoU3RyZW5ndGggKyBsb3dlcmNhc2VTdHJlbmd0aCArIHVwcGVyY2FzZVN0cmVuZ3RoICsgbnVtYmVyU3RyZW5ndGggKyBzcGVjaWFsQ2hhcmFjdGVyU3RyZW5ndGg7XG4gICAgfVxuXG4gICAgaGFuZGxlVmFsaWRhdGlvbihpc1ZhbGlkOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcgPSAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcpIHtcbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UuY2xlYXJJbnZhbGlkKHRoaXMuYnVpbGRFbGVtZW50SWQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnNldEludmFsaWQodGhpcy5xdWVzdGlvbi5pZCwgbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICh0aGlzLmluTGluZSB8fCB0aGlzLmluQ2FyZClcbiAgICAgICAgPyBgJHt0aGlzLnN1Ym1pc3Npb25JbmRleH0tJHt0aGlzLnF1ZXN0aW9uLmlkfWBcbiAgICAgICAgOiBgJHt0aGlzLnF1ZXN0aW9uLmlkfWA7XG4gICAgfVxuICBcbiAgICBnZXQgaXNJbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRFcnJvck1lc3NhZ2UodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB9XG4gIFxuICAgIGdldCBlcnJvck1lc3NhZ2UoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRFcnJvck1lc3NhZ2UodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB9XG4gIFxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIGlmICh0aGlzLmluTGluZSB8fCB0aGlzLmluQ2FyZCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRJZCA9IGBxdWVzdGlvbi0ke3RoaXMuc3VibWlzc2lvbkluZGV4fS0ke3RoaXMucXVlc3Rpb24uaWR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudElkID0gYHF1ZXN0aW9uLSR7dGhpcy5xdWVzdGlvbi5pZH1gO1xuICAgICAgfVxuICAgIFxuICAgICAgdGhpcy50cmFja2VyLnJlZ2lzdGVyRWxlbWVudCh0aGlzLmVsZW1lbnRJZCk7XG4gICAgfVxuICBcbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRJZCkge1xuICAgICAgICB0aGlzLnRyYWNrZXIudW5yZWdpc3RlckVsZW1lbnQodGhpcy5lbGVtZW50SWQpO1xuICAgICAgfVxuICAgIH1cbn1cblxuIiwiPGRpdlxuICBbbmdDbGFzc109XCJ7ICdtYi00JzogIWluTGluZSB9XCJcbiAgY2xhc3M9XCJweC0zXCJcbiAgW2lkXT1cIihpbkxpbmUgfHwgaW5DYXJkKSA/ICdxdWVzdGlvbi0nICsgc3VibWlzc2lvbkluZGV4ICsgJy0nICsgcXVlc3Rpb24uaWQgOiAncXVlc3Rpb24tJyArIHF1ZXN0aW9uLmlkXCJcbiAgW2F0dHIubmFtZV09XCJxdWVzdGlvbi50ZXN0RWxlbWVudE5hbWVcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1iLTJcIiAqbmdJZj1cIiFpbkxpbmVcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi5xdWVzdGlvbk51bWJlclwiIFtpbm5lckhUTUxdPVwicXVlc3Rpb24ucXVlc3Rpb25OdW1iZXJcIj48L2Rpdj5cbiAgICAgIDxzcGFuICpuZ0lmPVwicXVlc3Rpb24ucXVlc3Rpb25OdW1iZXJcIiBjbGFzcz1cInNwYWNlXCI+PC9zcGFuPlxuICAgICAgPGxhYmVsIFtmb3JdPVwiJ3Bhc3N3b3JkRmllbGQnICsgcXVlc3Rpb25JZFwiPnt7IHF1ZXN0aW9uLnF1ZXN0aW9uIH19PC9sYWJlbFxuICAgICAgPiZuYnNwO1xuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicXVlc3Rpb24/LnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzdmctd3JhcHBlciBtYi0yIGhpbnRJY29uXCJcbiAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJoaW50XCJcbiAgICAgICAgKm5nSWY9XCJoaW50XCJcbiAgICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIGNsYXNzPVwiaGludFN2Z1wiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAzMCAzMFwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgIGQ9XCJNMTUgMjYuMjVWMjYuMjVDOC43ODYyNSAyNi4yNSAzLjc1IDIxLjIxMzggMy43NSAxNVYxNUMzLjc1IDguNzg2MjUgOC43ODYyNSAzLjc1IDE1IDMuNzVWMy43NUMyMS4yMTM4IDMuNzUgMjYuMjUgOC43ODYyNSAyNi4yNSAxNVYxNUMyNi4yNSAyMS4yMTM4IDIxLjIxMzggMjYuMjUgMTUgMjYuMjVaXCJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMzMjMyMzJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTUgMTYuNTYyM1YxNi4yNDk4QzE1IDE1LjIyODUgMTUuNjMxMiAxNC42NzQ4IDE2LjI2MzcgMTQuMjQ5OEMxNi44ODEyIDEzLjgzMzUgMTcuNSAxMy4yOTEgMTcuNSAxMi4yOTFDMTcuNSAxMC45MDk4IDE2LjM4MTMgOS43OTEwMiAxNSA5Ljc5MTAyQzEzLjYxODcgOS43OTEwMiAxMi41IDEwLjkwOTggMTIuNSAxMi4yOTFcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xNC45OTg4IDIwQzE0LjgyNjMgMjAgMTQuNjg2MyAyMC4xNCAxNC42ODc1IDIwLjMxMjVDMTQuNjg3NSAyMC40ODUgMTQuODI3NSAyMC42MjUgMTUgMjAuNjI1QzE1LjE3MjUgMjAuNjI1IDE1LjMxMjUgMjAuNDg1IDE1LjMxMjUgMjAuMzEyNUMxNS4zMTI1IDIwLjE0IDE1LjE3MjUgMjAgMTQuOTk4OCAyMFwiXG4gICAgICAgICAgICBzdHJva2U9XCIjMzIzMjMyXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYXNzd29yZFdyYXBwZXJcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgaGVpZ2h0XCJcbiAgICAgIFtpZF09XCIncGFzc3dvcmRGaWVsZCcgKyBxdWVzdGlvbklkXCJcbiAgICAgIChibHVyKT1cInZhbGlkYXRlUGFzc3dvcmQoKVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImVudGVyZWRQYXNzd29yZFwiXG4gICAgICBbY2xhc3MuaW52YWxpZF09XCJ2YWxpZGF0aW9uRmFpbGVkXCJcbiAgICAgIFtjbGFzcy5pbnZhbGlkLXF1ZXN0aW9uXT1cImlzSW52YWxpZCAmJiAoIWluTGluZSB8fCAhZW50ZXJlZFBhc3N3b3JkKVwiXG4gICAgICAoaW5wdXQpPVwidmFsaWRhdGVJbnB1dCgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRWRpdFwiXG4gICAgLz5cbiAgICA8YnV0dG9uXG4gICAgICBpZD1cInRvZ2dsZVBhc3N3b3JkQnRuXCJcbiAgICAgIGNsYXNzPVwidG9nZ2xlLXBhc3N3b3JkLWJ0blwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KClcIlxuICAgICAgKm5nSWY9XCJ2aWV3QnV0dG9uXCJcbiAgICA+XG4gICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZS1maWxsXCIgW2lkXT1cIidwYXNzd29yZEV5ZUljb24nICsgcXVlc3Rpb25JZFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInBhc3N3b3JkLXN0cmVuZ3RoLW1ldGVyXCIgKm5nSWY9XCJkaXNwbGF5U3RyZW5ndGhcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIlxuICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwicGFzc3dvcmRTdHJlbmd0aCArICclJ1wiXG4gICAgICAgIFtjbGFzcy5iZy1kYW5nZXJdPVwicGFzc3dvcmRTdHJlbmd0aCA8IDMwXCJcbiAgICAgICAgW2NsYXNzLmJnLXdhcm5pbmddPVwicGFzc3dvcmRTdHJlbmd0aCA+PSAzMCAmJiBwYXNzd29yZFN0cmVuZ3RoIDwgNzBcIlxuICAgICAgICBbY2xhc3MuYmctc3VjY2Vzc109XCJwYXNzd29yZFN0cmVuZ3RoID49IDcwXCJcbiAgICAgID48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWQgJiYgKCFpbkxpbmUgfHwgIWVudGVyZWRQYXNzd29yZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJ2YWxpZGF0aW9uRmFpbGVkICYmICFpc0ludmFsaWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG1iLTJcIj5cbiAgICB7eyB2YWxpZGF0aW9uTWVzc2FnZSB9fVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY25mcm1QYXNzd29yZFdyYXBwZXJcIiAqbmdJZj1cImNvbmZpcm1QYXNzd29yZFwiPlxuICAgIDxsYWJlbCBmb3I9XCInY25mcm1QYXNzd29yZEZpZWxkJytxdWVzdGlvbklkXCI+Q29uZmlybSBwYXNzd29yZDwvbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBoZWlnaHRcIlxuICAgICAgW2lkXT1cIidjbmZybVBhc3N3b3JkRmllbGQnICsgcXVlc3Rpb25JZFwiXG4gICAgICAoYmx1cik9XCJjaGVja1Bhc3N3b3JkTWF0Y2goKVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImVudGVyZWRDbmZybVBhc3N3b3JkXCJcbiAgICAgIFtjbGFzcy5pbnZhbGlkXT1cInZhbGlkYXRlZENuZnJtUGFzc3dvcmRcIlxuICAgICAgKGlucHV0KT1cInZhbGlkYXRlQ25mcm0oJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUVkaXRcIlxuICAgIC8+XG4gICAgPGJ1dHRvblxuICAgICAgaWQ9XCJ0b2dnbGVDbmZybVBhc3N3b3JkQnRuXCJcbiAgICAgIGNsYXNzPVwidG9nZ2xlLXBhc3N3b3JkLWJ0blwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ25mcm1QYXNzd29yZFZpc2liaWxpdHkoKVwiXG4gICAgICAqbmdJZj1cInZpZXdCdXR0b25cIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllLWZpbGxcIiBbaWRdPVwiJ0NuZnJtUGFzc3dvcmRFeWVJY29uJyArIHF1ZXN0aW9uSWRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGVkQ25mcm1QYXNzd29yZFwiIGNsYXNzPVwidGV4dC1kYW5nZXIgZXJyb3ItbWVzc2FnZVwiPlxuICAgIHt7IGNuZnJtVmFsaWRhdGlvbk1lc3NhZ2UgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==