@hmcts/rpx-xui-common-lib 1.8.9-eui-6408-callback-copy-user → 1.8.10-generic-filter-readonly-changes

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 (289) hide show
  1. package/bundles/hmcts-rpx-xui-common-lib.umd.js +4122 -7579
  2. package/bundles/hmcts-rpx-xui-common-lib.umd.js.map +1 -1
  3. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js +1 -1
  4. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/hmcts-rpx-xui-common-lib.js +2 -7
  6. package/esm2015/lib/components/accessibility/accessibility.component.js +2 -8
  7. package/esm2015/lib/components/checkbox-list/checkbox-list.component.js +14 -112
  8. package/esm2015/lib/components/contact-details/contact-details.component.js +2 -12
  9. package/esm2015/lib/components/cookie-banner/cookie-banner.component.js +4 -65
  10. package/esm2015/lib/components/due-date/due-date.component.js +2 -97
  11. package/esm2015/lib/components/exui-main-wrapper/exui-page-wrapper.component.js +7 -21
  12. package/esm2015/lib/components/find-location/find-location.component.js +14 -130
  13. package/esm2015/lib/components/find-person/find-person.component.js +14 -154
  14. package/esm2015/lib/components/find-service/find-service.component.js +54 -104
  15. package/esm2015/lib/components/find-task-name/find-task-name.component.js +8 -136
  16. package/esm2015/lib/components/generic-filter/generic-filter-utils.js +11 -55
  17. package/esm2015/lib/components/generic-filter/generic-filter.component.js +101 -503
  18. package/esm2015/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +3 -18
  19. package/esm2015/lib/components/index.js +2 -7
  20. package/esm2015/lib/components/invite-user-form/invite-user-form.component.js +2 -22
  21. package/esm2015/lib/components/invite-user-permissions/invite-user-permission.component.js +2 -21
  22. package/esm2015/lib/components/loading-spinner/loading-spinner.component.js +3 -12
  23. package/esm2015/lib/components/pagination/pagination.component.js +2 -24
  24. package/esm2015/lib/components/public_api.js +33 -33
  25. package/esm2015/lib/components/search-judicials/search-judicials.component.js +11 -134
  26. package/esm2015/lib/components/search-location/search-location.component.js +31 -169
  27. package/esm2015/lib/components/search-service/search-service.component.js +15 -46
  28. package/esm2015/lib/components/search-venue/search-venue.component.js +11 -134
  29. package/esm2015/lib/components/selected-case/selected-case.component.js +20 -175
  30. package/esm2015/lib/components/selected-case-confirm/selected-case-confirm.component.js +3 -41
  31. package/esm2015/lib/components/selected-case-list/selected-case-list.component.js +4 -55
  32. package/esm2015/lib/components/service-message/service-message.component.js +2 -20
  33. package/esm2015/lib/components/service-messages/service-messages.component.js +7 -65
  34. package/esm2015/lib/components/share-case/share-case.component.js +23 -169
  35. package/esm2015/lib/components/share-case-confirm/share-case-confirm.component.js +4 -37
  36. package/esm2015/lib/components/tab/tab.component.js +2 -26
  37. package/esm2015/lib/components/tc-confirm/tc-confirm.component.js +2 -17
  38. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +2 -8
  39. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +2 -8
  40. package/esm2015/lib/components/terms-and-conditions/terms-and-conditions.component.js +2 -12
  41. package/esm2015/lib/components/user-details/user-details.component.js +2 -39
  42. package/esm2015/lib/components/user-list/user-list.component.js +2 -32
  43. package/esm2015/lib/components/user-select/user-select.component.js +5 -52
  44. package/esm2015/lib/directives/feature-toggle/feature-toggle.directive.js +3 -56
  45. package/esm2015/lib/directives/index.js +2 -7
  46. package/esm2015/lib/directives/let/let.directive.js +1 -39
  47. package/esm2015/lib/directives/public-api.js +3 -8
  48. package/esm2015/lib/exui-common-lib.module.js +1 -9
  49. package/esm2015/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +2 -22
  50. package/esm2015/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +3 -49
  51. package/esm2015/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +4 -54
  52. package/esm2015/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +2 -14
  53. package/esm2015/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +2 -17
  54. package/esm2015/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +2 -24
  55. package/esm2015/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +2 -16
  56. package/esm2015/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +2 -22
  57. package/esm2015/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +2 -12
  58. package/esm2015/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +6 -24
  59. package/esm2015/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +2 -13
  60. package/esm2015/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +2 -21
  61. package/esm2015/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +2 -32
  62. package/esm2015/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +2 -18
  63. package/esm2015/lib/gov-ui/components/hmcts-banner/hmcts-banner-info.interface.js +2 -22
  64. package/esm2015/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +2 -19
  65. package/esm2015/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +2 -44
  66. package/esm2015/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +2 -16
  67. package/esm2015/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +2 -36
  68. package/esm2015/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +2 -23
  69. package/esm2015/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +2 -22
  70. package/esm2015/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +3 -30
  71. package/esm2015/lib/gov-ui/components/index.js +2 -7
  72. package/esm2015/lib/gov-ui/components/public_api.js +22 -8
  73. package/esm2015/lib/gov-ui/directives/remove-host.directive.js +1 -22
  74. package/esm2015/lib/gov-ui/gov-ui.service.js +2 -8
  75. package/esm2015/lib/gov-ui/index.js +2 -7
  76. package/esm2015/lib/gov-ui/models/checkboxes-model.js +2 -20
  77. package/esm2015/lib/gov-ui/models/error-messages-model.js +2 -16
  78. package/esm2015/lib/gov-ui/models/gov-ui-config-model.js +2 -40
  79. package/esm2015/lib/gov-ui/models/index.js +2 -7
  80. package/esm2015/lib/gov-ui/models/isession-storage.interface.js +2 -24
  81. package/esm2015/lib/gov-ui/models/public_api.js +4 -9
  82. package/esm2015/lib/gov-ui/models/radio-buttons.model.js +2 -22
  83. package/esm2015/lib/gov-ui/public_api.js +5 -9
  84. package/esm2015/lib/gov-ui/util/helpers/html-templates.helper.js +4 -14
  85. package/esm2015/lib/gov-ui/util/session-storage/session-storage-utils.js +12 -48
  86. package/esm2015/lib/gov-ui/validators/checkboxes-be-checked.validator.js +5 -24
  87. package/esm2015/lib/gov-ui/validators/date.validator.js +3 -20
  88. package/esm2015/lib/gov-ui/validators/index.js +2 -7
  89. package/esm2015/lib/gov-ui/validators/public_api.js +4 -9
  90. package/esm2015/lib/gov-ui/validators/radio-group.validator.js +3 -15
  91. package/esm2015/lib/models/case-share.model.js +7 -33
  92. package/esm2015/lib/models/contact-details.model.js +7 -31
  93. package/esm2015/lib/models/due-date.model.js +7 -14
  94. package/esm2015/lib/models/feature-user.js +1 -16
  95. package/esm2015/lib/models/filter.model.js +1 -193
  96. package/esm2015/lib/models/idle-config.model.js +2 -20
  97. package/esm2015/lib/models/index.js +16 -21
  98. package/esm2015/lib/models/location.model.js +7 -129
  99. package/esm2015/lib/models/pagination.model.js +2 -18
  100. package/esm2015/lib/models/person.model.js +19 -96
  101. package/esm2015/lib/models/public_api.js +6 -11
  102. package/esm2015/lib/models/search-options.model.js +2 -22
  103. package/esm2015/lib/models/task-name.model.js +2 -16
  104. package/esm2015/lib/models/tcDocument.model.js +2 -18
  105. package/esm2015/lib/models/timeout-notification.model.js +2 -18
  106. package/esm2015/lib/models/user-details.model.js +2 -22
  107. package/esm2015/lib/models/user.model.js +2 -25
  108. package/esm2015/lib/pipes/capitalize.pipe.js +1 -11
  109. package/esm2015/lib/services/case-sharing-state/case-sharing-state.service.js +11 -96
  110. package/esm2015/lib/services/cookie/cookie.service.js +8 -71
  111. package/esm2015/lib/services/feature-toggle/feature-toggle.guard.js +4 -43
  112. package/esm2015/lib/services/feature-toggle/feature-toggle.service.js +2 -28
  113. package/esm2015/lib/services/feature-toggle/launch-darkly.service.js +12 -94
  114. package/esm2015/lib/services/filter/filter.service.js +2 -71
  115. package/esm2015/lib/services/find-person/find-person.service.js +15 -123
  116. package/esm2015/lib/services/google-analytics/google-analytics.service.js +8 -63
  117. package/esm2015/lib/services/google-tag-manager/google-tag-manager.service.js +10 -64
  118. package/esm2015/lib/services/index.js +2 -7
  119. package/esm2015/lib/services/loading/loading.service.js +2 -41
  120. package/esm2015/lib/services/locations/location.service.js +12 -30
  121. package/esm2015/lib/services/manage-session/manage-session.services.js +10 -63
  122. package/esm2015/lib/services/public-api.js +13 -18
  123. package/esm2015/lib/services/role-guard/role.guard.js +14 -59
  124. package/esm2015/lib/services/role-guard/role.service.js +3 -22
  125. package/esm2015/lib/services/storage/session-storage/session-storage.service.js +3 -17
  126. package/esm2015/lib/services/task-name/task-name.service.js +5 -34
  127. package/esm2015/lib/services/timeout-notifications/timeout-notifications.service.js +16 -78
  128. package/esm2015/lib/window.js +1 -10
  129. package/esm2015/public-api.js +8 -13
  130. package/fesm2015/hmcts-rpx-xui-common-lib.js +966 -3691
  131. package/fesm2015/hmcts-rpx-xui-common-lib.js.map +1 -1
  132. package/hmcts-rpx-xui-common-lib.metadata.json +1 -1
  133. package/lib/components/checkbox-list/checkbox-list.component.d.ts +6 -5
  134. package/lib/components/due-date/due-date.component.d.ts +4 -4
  135. package/lib/components/find-location/find-location.component.d.ts +4 -2
  136. package/lib/components/find-person/find-person.component.d.ts +1 -1
  137. package/lib/components/find-service/find-service.component.d.ts +4 -1
  138. package/lib/components/generic-filter/generic-filter.component.d.ts +7 -2
  139. package/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.d.ts +1 -1
  140. package/lib/components/invite-user-form/invite-user-form.component.d.ts +2 -2
  141. package/lib/components/public_api.d.ts +5 -0
  142. package/lib/components/search-judicials/search-judicials.component.d.ts +1 -1
  143. package/lib/components/search-location/search-location.component.d.ts +4 -2
  144. package/lib/components/search-service/search-service.component.d.ts +4 -2
  145. package/lib/components/search-venue/search-venue.component.d.ts +1 -1
  146. package/lib/components/user-list/user-list.component.d.ts +1 -1
  147. package/lib/directives/feature-toggle/feature-toggle.directive.d.ts +1 -1
  148. package/lib/directives/let/let.directive.d.ts +1 -1
  149. package/lib/exui-common-lib.module.d.ts +2 -1
  150. package/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.d.ts +1 -1
  151. package/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.d.ts +1 -1
  152. package/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.d.ts +1 -1
  153. package/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.d.ts +1 -1
  154. package/lib/gov-ui/components/public_api.d.ts +19 -0
  155. package/lib/gov-ui/public_api.d.ts +1 -0
  156. package/lib/models/filter.model.d.ts +3 -0
  157. package/lib/models/person.model.d.ts +1 -1
  158. package/lib/services/case-sharing-state/case-sharing-state.service.d.ts +1 -1
  159. package/lib/services/loading/loading.service.d.ts +2 -2
  160. package/lib/services/role-guard/role.service.d.ts +3 -3
  161. package/lib/window.d.ts +2 -2
  162. package/package.json +6 -16
  163. package/esm5/hmcts-rpx-xui-common-lib.js +0 -78
  164. package/esm5/lib/components/accessibility/accessibility.component.js +0 -22
  165. package/esm5/lib/components/checkbox-list/checkbox-list.component.js +0 -391
  166. package/esm5/lib/components/contact-details/contact-details.component.js +0 -29
  167. package/esm5/lib/components/cookie-banner/cookie-banner.component.js +0 -154
  168. package/esm5/lib/components/due-date/due-date.component.js +0 -254
  169. package/esm5/lib/components/exui-main-wrapper/exui-page-wrapper.component.js +0 -45
  170. package/esm5/lib/components/find-location/find-location.component.js +0 -297
  171. package/esm5/lib/components/find-person/find-person.component.js +0 -287
  172. package/esm5/lib/components/find-service/find-service.component.js +0 -218
  173. package/esm5/lib/components/find-task-name/find-task-name.component.js +0 -243
  174. package/esm5/lib/components/generic-filter/generic-filter-utils.js +0 -66
  175. package/esm5/lib/components/generic-filter/generic-filter.component.js +0 -1229
  176. package/esm5/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +0 -47
  177. package/esm5/lib/components/index.js +0 -7
  178. package/esm5/lib/components/invite-user-form/invite-user-form.component.js +0 -54
  179. package/esm5/lib/components/invite-user-permissions/invite-user-permission.component.js +0 -46
  180. package/esm5/lib/components/loading-spinner/loading-spinner.component.js +0 -29
  181. package/esm5/lib/components/pagination/pagination.component.js +0 -58
  182. package/esm5/lib/components/public_api.js +0 -33
  183. package/esm5/lib/components/search-judicials/search-judicials.component.js +0 -291
  184. package/esm5/lib/components/search-location/search-location.component.js +0 -329
  185. package/esm5/lib/components/search-service/search-service.component.js +0 -81
  186. package/esm5/lib/components/search-venue/search-venue.component.js +0 -290
  187. package/esm5/lib/components/selected-case/selected-case.component.js +0 -424
  188. package/esm5/lib/components/selected-case-confirm/selected-case-confirm.component.js +0 -84
  189. package/esm5/lib/components/selected-case-list/selected-case-list.component.js +0 -115
  190. package/esm5/lib/components/service-message/service-message.component.js +0 -46
  191. package/esm5/lib/components/service-messages/service-messages.component.js +0 -122
  192. package/esm5/lib/components/share-case/share-case.component.js +0 -435
  193. package/esm5/lib/components/share-case-confirm/share-case-confirm.component.js +0 -70
  194. package/esm5/lib/components/tab/tab.component.js +0 -51
  195. package/esm5/lib/components/tc-confirm/tc-confirm.component.js +0 -42
  196. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +0 -22
  197. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +0 -22
  198. package/esm5/lib/components/terms-and-conditions/terms-and-conditions.component.js +0 -29
  199. package/esm5/lib/components/user-details/user-details.component.js +0 -92
  200. package/esm5/lib/components/user-list/user-list.component.js +0 -76
  201. package/esm5/lib/components/user-select/user-select.component.js +0 -131
  202. package/esm5/lib/directives/feature-toggle/feature-toggle.directive.js +0 -104
  203. package/esm5/lib/directives/index.js +0 -7
  204. package/esm5/lib/directives/let/let.directive.js +0 -78
  205. package/esm5/lib/directives/public-api.js +0 -8
  206. package/esm5/lib/exui-common-lib.module.js +0 -174
  207. package/esm5/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +0 -56
  208. package/esm5/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +0 -130
  209. package/esm5/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +0 -135
  210. package/esm5/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +0 -37
  211. package/esm5/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +0 -49
  212. package/esm5/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +0 -65
  213. package/esm5/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +0 -40
  214. package/esm5/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +0 -66
  215. package/esm5/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +0 -35
  216. package/esm5/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +0 -67
  217. package/esm5/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +0 -36
  218. package/esm5/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +0 -52
  219. package/esm5/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +0 -77
  220. package/esm5/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +0 -50
  221. package/esm5/lib/gov-ui/components/hmcts-banner/hmcts-banner-info.interface.js +0 -22
  222. package/esm5/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +0 -42
  223. package/esm5/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +0 -108
  224. package/esm5/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +0 -40
  225. package/esm5/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +0 -87
  226. package/esm5/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +0 -51
  227. package/esm5/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +0 -49
  228. package/esm5/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +0 -46
  229. package/esm5/lib/gov-ui/components/index.js +0 -7
  230. package/esm5/lib/gov-ui/components/public_api.js +0 -8
  231. package/esm5/lib/gov-ui/directives/remove-host.directive.js +0 -52
  232. package/esm5/lib/gov-ui/gov-ui.service.js +0 -22
  233. package/esm5/lib/gov-ui/index.js +0 -7
  234. package/esm5/lib/gov-ui/models/checkboxes-model.js +0 -20
  235. package/esm5/lib/gov-ui/models/error-messages-model.js +0 -16
  236. package/esm5/lib/gov-ui/models/gov-ui-config-model.js +0 -40
  237. package/esm5/lib/gov-ui/models/index.js +0 -7
  238. package/esm5/lib/gov-ui/models/isession-storage.interface.js +0 -24
  239. package/esm5/lib/gov-ui/models/public_api.js +0 -12
  240. package/esm5/lib/gov-ui/models/radio-buttons.model.js +0 -22
  241. package/esm5/lib/gov-ui/public_api.js +0 -12
  242. package/esm5/lib/gov-ui/util/helpers/html-templates.helper.js +0 -57
  243. package/esm5/lib/gov-ui/util/session-storage/session-storage-utils.js +0 -58
  244. package/esm5/lib/gov-ui/validators/checkboxes-be-checked.validator.js +0 -38
  245. package/esm5/lib/gov-ui/validators/date.validator.js +0 -32
  246. package/esm5/lib/gov-ui/validators/index.js +0 -7
  247. package/esm5/lib/gov-ui/validators/public_api.js +0 -12
  248. package/esm5/lib/gov-ui/validators/radio-group.validator.js +0 -27
  249. package/esm5/lib/models/case-share.model.js +0 -33
  250. package/esm5/lib/models/contact-details.model.js +0 -31
  251. package/esm5/lib/models/due-date.model.js +0 -15
  252. package/esm5/lib/models/feature-user.js +0 -28
  253. package/esm5/lib/models/filter.model.js +0 -199
  254. package/esm5/lib/models/idle-config.model.js +0 -20
  255. package/esm5/lib/models/index.js +0 -21
  256. package/esm5/lib/models/location.model.js +0 -129
  257. package/esm5/lib/models/pagination.model.js +0 -18
  258. package/esm5/lib/models/person.model.js +0 -96
  259. package/esm5/lib/models/public_api.js +0 -11
  260. package/esm5/lib/models/search-options.model.js +0 -22
  261. package/esm5/lib/models/task-name.model.js +0 -16
  262. package/esm5/lib/models/tcDocument.model.js +0 -18
  263. package/esm5/lib/models/timeout-notification.model.js +0 -18
  264. package/esm5/lib/models/user-details.model.js +0 -22
  265. package/esm5/lib/models/user.model.js +0 -25
  266. package/esm5/lib/pipes/capitalize.pipe.js +0 -29
  267. package/esm5/lib/services/case-sharing-state/case-sharing-state.service.js +0 -313
  268. package/esm5/lib/services/cookie/cookie.service.js +0 -136
  269. package/esm5/lib/services/feature-toggle/feature-toggle.guard.js +0 -89
  270. package/esm5/lib/services/feature-toggle/feature-toggle.service.js +0 -90
  271. package/esm5/lib/services/feature-toggle/launch-darkly.service.js +0 -187
  272. package/esm5/lib/services/filter/filter.service.js +0 -208
  273. package/esm5/lib/services/find-person/find-person.service.js +0 -246
  274. package/esm5/lib/services/google-analytics/google-analytics.service.js +0 -128
  275. package/esm5/lib/services/google-tag-manager/google-tag-manager.service.js +0 -135
  276. package/esm5/lib/services/index.js +0 -7
  277. package/esm5/lib/services/loading/loading.service.js +0 -109
  278. package/esm5/lib/services/locations/location.service.js +0 -86
  279. package/esm5/lib/services/manage-session/manage-session.services.js +0 -111
  280. package/esm5/lib/services/public-api.js +0 -21
  281. package/esm5/lib/services/role-guard/role.guard.js +0 -88
  282. package/esm5/lib/services/role-guard/role.service.js +0 -45
  283. package/esm5/lib/services/storage/session-storage/session-storage.service.js +0 -96
  284. package/esm5/lib/services/task-name/task-name.service.js +0 -70
  285. package/esm5/lib/services/timeout-notifications/timeout-notifications.service.js +0 -190
  286. package/esm5/lib/window.js +0 -13
  287. package/esm5/public-api.js +0 -16
  288. package/fesm5/hmcts-rpx-xui-common-lib.js +0 -9064
  289. package/fesm5/hmcts-rpx-xui-common-lib.js.map +0 -1
@@ -1,1229 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/components/generic-filter/generic-filter.component.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import * as tslib_1 from "tslib";
7
- import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
8
- import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
9
- import { FilterService } from './../../services/filter/filter.service';
10
- import { getValues, maxSelectedValidator, minSelectedValidator } from './generic-filter-utils';
11
- var GenericFilterComponent = /** @class */ (function () {
12
- function GenericFilterComponent(filterService, fb) {
13
- this.filterService = filterService;
14
- this.fb = fb;
15
- this.submitted = false;
16
- this.previousSelectedNestedCheckbox = [];
17
- }
18
- Object.defineProperty(GenericFilterComponent.prototype, "config", {
19
- get: /**
20
- * @return {?}
21
- */
22
- function () {
23
- return this._config;
24
- },
25
- set: /**
26
- * @param {?} value
27
- * @return {?}
28
- */
29
- function (value) {
30
- this._config = tslib_1.__assign({}, value, { fields: value.fields.map((/**
31
- * @param {?} field
32
- * @return {?}
33
- */
34
- function (field) { return (tslib_1.__assign({}, field, { displayMinSelectedError: false, displayMaxSelectedError: false })); })) });
35
- this._config = value;
36
- },
37
- enumerable: true,
38
- configurable: true
39
- });
40
- Object.defineProperty(GenericFilterComponent.prototype, "settings", {
41
- get: /**
42
- * @return {?}
43
- */
44
- function () {
45
- return this._settings;
46
- },
47
- set: /**
48
- * @param {?} value
49
- * @return {?}
50
- */
51
- function (value) {
52
- if (!value) {
53
- this.getSettings();
54
- }
55
- if (value && value.fields) {
56
- this.mergeDefaultFields(value);
57
- }
58
- this._settings = value;
59
- },
60
- enumerable: true,
61
- configurable: true
62
- });
63
- /**
64
- * @private
65
- * @param {?} field
66
- * @return {?}
67
- */
68
- GenericFilterComponent.addFormValidators = /**
69
- * @private
70
- * @param {?} field
71
- * @return {?}
72
- */
73
- function (field) {
74
- /** @type {?} */
75
- var validators = [];
76
- if (field && field.minSelected > 0) {
77
- validators.push(minSelectedValidator(field.minSelected));
78
- }
79
- if (field && field.maxSelected > 0) {
80
- validators.push(maxSelectedValidator(field.maxSelected));
81
- }
82
- return validators;
83
- };
84
- /**
85
- * @return {?}
86
- */
87
- GenericFilterComponent.prototype.ngOnInit = /**
88
- * @return {?}
89
- */
90
- function () {
91
- var _this = this;
92
- if (!this.settings) {
93
- this.getSettings();
94
- }
95
- this.mergeDefaultFields(this.settings);
96
- this.buildForm(this.config, this.settings);
97
- if (this._config.copyFields) {
98
- this.form = this._config.copyFields(this.form);
99
- }
100
- this.formSub = this.form.valueChanges.subscribe((/**
101
- * @return {?}
102
- */
103
- function () { return _this.submitted = false; }));
104
- this.filterSkillsByServices(null, this.config);
105
- /** @type {?} */
106
- var services = this.config.fields.find((/**
107
- * @param {?} field
108
- * @return {?}
109
- */
110
- function (field) { return field.name === 'user-services'; }));
111
- if (services) {
112
- this.startFilterSkillsByServices(this.form, services);
113
- this.initValuesFromCacheForSkillsByServices();
114
- }
115
- };
116
- /**
117
- * @return {?}
118
- */
119
- GenericFilterComponent.prototype.ngOnDestroy = /**
120
- * @return {?}
121
- */
122
- function () {
123
- if (this.formSub) {
124
- this.formSub.unsubscribe();
125
- }
126
- };
127
- /**
128
- * @param {?} field
129
- * @param {?} form
130
- * @return {?}
131
- */
132
- GenericFilterComponent.prototype.hidden = /**
133
- * @param {?} field
134
- * @param {?} form
135
- * @return {?}
136
- */
137
- function (field, form) {
138
- if (!field.showCondition) {
139
- return false;
140
- }
141
- if (typeof field.showCondition === 'string') {
142
- /** @type {?} */
143
- var control = (/** @type {?} */ (form.get(field.name)));
144
- var _a = tslib_1.__read(field.showCondition.split('='), 2), name_1 = _a[0], value = _a[1];
145
- if (form.value && form.value[name_1] === value) {
146
- if (field.type === 'find-person') {
147
- control.get('email').setValidators(Validators.required);
148
- control.get('email').updateValueAndValidity();
149
- }
150
- else {
151
- control.setValidators(Validators.required);
152
- control.updateValueAndValidity();
153
- }
154
- return false;
155
- }
156
- else {
157
- if (field.type === 'find-person') {
158
- control.get('email').clearValidators();
159
- control.get('email').updateValueAndValidity();
160
- }
161
- else {
162
- control.clearValidators();
163
- control.updateValueAndValidity();
164
- }
165
- }
166
- }
167
- return true;
168
- };
169
- /**
170
- * @param {?} field
171
- * @param {?} form
172
- * @return {?}
173
- */
174
- GenericFilterComponent.prototype.disabled = /**
175
- * @param {?} field
176
- * @param {?} form
177
- * @return {?}
178
- */
179
- function (field, form) {
180
- if (!field.enableCondition) {
181
- return null;
182
- }
183
- if (typeof field.enableCondition === 'string') {
184
- /** @type {?} */
185
- var control = (/** @type {?} */ (form.get(field.name)));
186
- var _a = tslib_1.__read(field.enableCondition.split('='), 2), name_2 = _a[0], value = _a[1];
187
- if (form.value && form.value[name_2] === value) {
188
- if (field.type === 'find-person') {
189
- control.get('email').setValidators(Validators.required);
190
- control.get('email').updateValueAndValidity();
191
- }
192
- else {
193
- control.setValidators(Validators.required);
194
- control.updateValueAndValidity();
195
- }
196
- return null;
197
- }
198
- else {
199
- if (field.type === 'find-person') {
200
- control.get('email').clearValidators();
201
- control.get('email').updateValueAndValidity();
202
- }
203
- else {
204
- control.clearValidators();
205
- control.updateValueAndValidity();
206
- }
207
- }
208
- }
209
- // find-location is special case where need to reset textbox (by existing disabling functionality)
210
- // field.disable referred to component itself
211
- if (field.type === 'find-location') {
212
- return true;
213
- }
214
- // Note: field.disable decides whether to actually disable or not
215
- return field.disable ? field.disable : null;
216
- };
217
- /**
218
- * @param {?} form
219
- * @return {?}
220
- */
221
- GenericFilterComponent.prototype.applyFilter = /**
222
- * @param {?} form
223
- * @return {?}
224
- */
225
- function (form) {
226
- this.submitted = true;
227
- form.markAsTouched();
228
- if (form.valid) {
229
- this._settings = {
230
- id: this.config.id,
231
- idamId: this.filterService.getUserId(),
232
- fields: this.getSelectedValues(form.value, this.config)
233
- };
234
- this.filterService.givenErrors.next(null);
235
- /** @type {?} */
236
- var settings = tslib_1.__assign({}, this.settings, { reset: false });
237
- this.filterService.persist(settings, this.config.persistence);
238
- }
239
- else {
240
- this.emitFormErrors(form);
241
- }
242
- if (this._config.applyButtonCallback) {
243
- this._config.applyButtonCallback();
244
- }
245
- };
246
- // when domain changes ensure that person field is reset
247
- // when domain changes ensure that person field is reset
248
- /**
249
- * @param {?} field
250
- * @param {?} form
251
- * @return {?}
252
- */
253
- GenericFilterComponent.prototype.fieldChanged =
254
- // when domain changes ensure that person field is reset
255
- /**
256
- * @param {?} field
257
- * @param {?} form
258
- * @return {?}
259
- */
260
- function (field, form) {
261
- var e_1, _a;
262
- // TODO - Do similar with jurisdiction/service for caseworkers by services
263
- if (field.changeResetFields && field.changeResetFields.length) {
264
- try {
265
- for (var _b = tslib_1.__values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
266
- var resetField = _c.value;
267
- this.resetField(resetField, form);
268
- }
269
- }
270
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
271
- finally {
272
- try {
273
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
274
- }
275
- finally { if (e_1) throw e_1.error; }
276
- }
277
- }
278
- };
279
- // when user enters input change radio button
280
- // when user enters input change radio button
281
- /**
282
- * @param {?} field
283
- * @return {?}
284
- */
285
- GenericFilterComponent.prototype.inputChanged =
286
- // when user enters input change radio button
287
- /**
288
- * @param {?} field
289
- * @return {?}
290
- */
291
- function (field) {
292
- if (field.name === 'user-services') {
293
- /** @type {?} */
294
- var selectedServices = this.getSelectedValuesForFields(this.form.controls, field);
295
- this.filterSkillsByServices(selectedServices, this.config);
296
- }
297
- if (field.radioSelectionChange && typeof field.radioSelectionChange === 'string') {
298
- var _a = tslib_1.__read(field.enableCondition.split('='), 2), name_3 = _a[0], value = _a[1];
299
- this.form.get(name_3).patchValue(value);
300
- }
301
- };
302
- /**
303
- * @return {?}
304
- */
305
- GenericFilterComponent.prototype.cancelFilter = /**
306
- * @return {?}
307
- */
308
- function () {
309
- this.buildForm(this.config, this.settings, true);
310
- if (this.config && this.config.cancelSetting) {
311
- this._settings.fields = JSON.parse(JSON.stringify(this.config.cancelSetting.fields));
312
- }
313
- /** @type {?} */
314
- var settings = tslib_1.__assign({}, this.settings, { reset: true });
315
- this.filterService.persist(settings, this.config.persistence);
316
- this.filterService.givenErrors.next(null);
317
- this.submitted = false;
318
- if (this.config.cancelButtonCallback) {
319
- this.config.cancelButtonCallback();
320
- }
321
- };
322
- /**
323
- * @param {?} values
324
- * @param {?} field
325
- * @return {?}
326
- */
327
- GenericFilterComponent.prototype.updatePersonControls = /**
328
- * @param {?} values
329
- * @param {?} field
330
- * @return {?}
331
- */
332
- function (values, field) {
333
- var e_2, _a;
334
- /** @type {?} */
335
- var keys;
336
- if (!values) {
337
- keys = Object.keys(this.form.get(field.name).value);
338
- }
339
- else {
340
- keys = Object.keys(values);
341
- }
342
- try {
343
- for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
344
- var key = keys_1_1.value;
345
- if (this.form.get(field.name) && this.form.get(field.name).get(key)) {
346
- /** @type {?} */
347
- var value = values && values[key] ? values[key] : null;
348
- this.form.get(field.name).get(key).patchValue(value);
349
- }
350
- }
351
- }
352
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
353
- finally {
354
- try {
355
- if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
356
- }
357
- finally { if (e_2) throw e_2.error; }
358
- }
359
- };
360
- /**
361
- * @param {?} field
362
- * @param {?} i
363
- * @return {?}
364
- */
365
- GenericFilterComponent.prototype.checkBoxChecked = /**
366
- * @param {?} field
367
- * @param {?} i
368
- * @return {?}
369
- */
370
- function (field, i) {
371
- return ((/** @type {?} */ (this.form.get(field.name))))['controls'][i]['value'];
372
- };
373
- /**
374
- * @param {?} values
375
- * @param {?} field
376
- * @return {?}
377
- */
378
- GenericFilterComponent.prototype.updateTaskNameControls = /**
379
- * @param {?} values
380
- * @param {?} field
381
- * @return {?}
382
- */
383
- function (values, field) {
384
- this.form.get(field.name).patchValue(values);
385
- };
386
- /**
387
- * @param {?} event
388
- * @param {?} form
389
- * @param {?} item
390
- * @param {?} field
391
- * @return {?}
392
- */
393
- GenericFilterComponent.prototype.toggleSelectAll = /**
394
- * @param {?} event
395
- * @param {?} form
396
- * @param {?} item
397
- * @param {?} field
398
- * @return {?}
399
- */
400
- function (event, form, item, field) {
401
- var e_3, _a;
402
- /** @type {?} */
403
- var isChecked = event.target.checked;
404
- /** @type {?} */
405
- var formArray = (/** @type {?} */ (form.get(field.name)));
406
- if (!item.selectAll) {
407
- /** @type {?} */
408
- var allChecked = formArray.controls.every((/**
409
- * @param {?} control
410
- * @return {?}
411
- */
412
- function (control) { return control.value; }));
413
- /** @type {?} */
414
- var index_1 = null;
415
- /** @type {?} */
416
- var hasSelectAllOption = field.options.find((/**
417
- * @param {?} option
418
- * @param {?} i
419
- * @return {?}
420
- */
421
- function (option, i) {
422
- if (option.hasOwnProperty('selectAll')) {
423
- index_1 = i;
424
- return true;
425
- }
426
- return false;
427
- }));
428
- // tslint:disable-next-line:variable-name
429
- /** @type {?} */
430
- var isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((/**
431
- * @param {?} _control
432
- * @param {?} i
433
- * @return {?}
434
- */
435
- function (_control, i) { return i !== index_1; }))
436
- .every((/**
437
- * @param {?} control
438
- * @return {?}
439
- */
440
- function (control) { return control.value; }));
441
- if (!allChecked && hasSelectAllOption && !isChecked) {
442
- formArray.controls.forEach((/**
443
- * @param {?} control
444
- * @param {?} i
445
- * @return {?}
446
- */
447
- function (control, i) {
448
- if (index_1 === i) {
449
- control.patchValue(false);
450
- return;
451
- }
452
- }));
453
- }
454
- else if (hasSelectAllOption && !allChecked && isChecked && isAllCheckedExcludingTheSelectAllOption) {
455
- formArray.controls[index_1].patchValue(true);
456
- }
457
- }
458
- else {
459
- formArray.controls.forEach((/**
460
- * @param {?} control
461
- * @return {?}
462
- */
463
- function (control) {
464
- if (isChecked) {
465
- control.patchValue(true);
466
- }
467
- else {
468
- control.patchValue(false);
469
- }
470
- }));
471
- }
472
- if (field.changeResetFields && field.changeResetFields.length) {
473
- try {
474
- for (var _b = tslib_1.__values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
475
- var resetField = _c.value;
476
- this.resetField(resetField, form);
477
- }
478
- }
479
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
480
- finally {
481
- try {
482
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
483
- }
484
- finally { if (e_3) throw e_3.error; }
485
- }
486
- }
487
- if (field.name === 'user-services') {
488
- this.startFilterSkillsByServices(form, field);
489
- }
490
- else if (field.name === 'user-skills') {
491
- if (isChecked) {
492
- /** @type {?} */
493
- var selectedIndex = field.options.findIndex((/**
494
- * @param {?} option
495
- * @return {?}
496
- */
497
- function (option) { return Number(option.key) === Number(event.target.value); }));
498
- /** @type {?} */
499
- var selectedCheckbox = this.form.get('user-skills').value;
500
- selectedCheckbox[selectedIndex] = true;
501
- this.form.get('user-skills').setValue(selectedCheckbox);
502
- this.previousSelectedNestedCheckbox.push(event.target.value);
503
- }
504
- else {
505
- /** @type {?} */
506
- var index = this.previousSelectedNestedCheckbox.indexOf(event.target.value);
507
- if (index !== -1) {
508
- this.previousSelectedNestedCheckbox.splice(index, 1);
509
- }
510
- }
511
- }
512
- };
513
- /**
514
- * @private
515
- * @param {?} form
516
- * @param {?} field
517
- * @return {?}
518
- */
519
- GenericFilterComponent.prototype.startFilterSkillsByServices = /**
520
- * @private
521
- * @param {?} form
522
- * @param {?} field
523
- * @return {?}
524
- */
525
- function (form, field) {
526
- /** @type {?} */
527
- var servicesArray = [];
528
- form.value[field.name].map((/**
529
- * @param {?} service
530
- * @param {?} index
531
- * @return {?}
532
- */
533
- function (service, index) {
534
- if (service) {
535
- servicesArray.push(field.options[index].key);
536
- }
537
- }));
538
- this.filterSkillsByServices(servicesArray, this.config);
539
- };
540
- /**
541
- * @private
542
- * @param {?} resetField
543
- * @param {?} form
544
- * @return {?}
545
- */
546
- GenericFilterComponent.prototype.resetField = /**
547
- * @private
548
- * @param {?} resetField
549
- * @param {?} form
550
- * @return {?}
551
- */
552
- function (resetField, form) {
553
- var e_4, _a;
554
- /** @type {?} */
555
- var control = form.get(resetField);
556
- /** @type {?} */
557
- var defaultValue = this.config.cancelSetting.fields.find((/**
558
- * @param {?} f
559
- * @return {?}
560
- */
561
- function (f) { return f.name === resetField; }));
562
- if (control instanceof FormArray) {
563
- for (var i = 0; i < control.length; i++) {
564
- control.removeAt(i);
565
- }
566
- }
567
- else if (control instanceof FormGroup) {
568
- /** @type {?} */
569
- var keys = Object.keys(control.value);
570
- try {
571
- for (var keys_2 = tslib_1.__values(keys), keys_2_1 = keys_2.next(); !keys_2_1.done; keys_2_1 = keys_2.next()) {
572
- var key = keys_2_1.value;
573
- this.resetField(key, control);
574
- }
575
- }
576
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
577
- finally {
578
- try {
579
- if (keys_2_1 && !keys_2_1.done && (_a = keys_2.return)) _a.call(keys_2);
580
- }
581
- finally { if (e_4) throw e_4.error; }
582
- }
583
- }
584
- else if (control instanceof FormControl) {
585
- /** @type {?} */
586
- var value = defaultValue && defaultValue.value && defaultValue.value.length ? defaultValue.value[0] : null;
587
- control.setValue(value);
588
- }
589
- };
590
- /**
591
- * @private
592
- * @param {?} filter
593
- * @return {?}
594
- */
595
- GenericFilterComponent.prototype.mergeDefaultFields = /**
596
- * @private
597
- * @param {?} filter
598
- * @return {?}
599
- */
600
- function (filter) {
601
- if (filter) {
602
- filter.fields = this.filterService.get(this.config.id) ? this.filterService.get(this.config.id).fields : filter.fields;
603
- }
604
- else if (this.config && this.config.cancelSetting) {
605
- this._settings = {
606
- id: this.config.id,
607
- fields: JSON.parse(JSON.stringify(this.config.cancelSetting.fields))
608
- };
609
- }
610
- };
611
- /**
612
- * @private
613
- * @return {?}
614
- */
615
- GenericFilterComponent.prototype.getSettings = /**
616
- * @private
617
- * @return {?}
618
- */
619
- function () {
620
- this._settings = this.filterService.get(this.config.id);
621
- };
622
- /**
623
- * @private
624
- * @param {?} config
625
- * @param {?} settings
626
- * @param {?=} reset
627
- * @return {?}
628
- */
629
- GenericFilterComponent.prototype.buildForm = /**
630
- * @private
631
- * @param {?} config
632
- * @param {?} settings
633
- * @param {?=} reset
634
- * @return {?}
635
- */
636
- function (config, settings, reset) {
637
- var e_5, _a;
638
- /** @type {?} */
639
- var findPersonControl = this.form ? this.form.get('findPersonControl') : null;
640
- this.form = this.fb.group({});
641
- if (findPersonControl) {
642
- // in order to maintain find person component, control needs to be kept
643
- this.form.addControl('findPersonControl', findPersonControl);
644
- }
645
- var _loop_1 = function (field) {
646
- if (field.type === 'checkbox' || field.type === 'checkbox-large' || field.type === 'nested-checkbox') {
647
- /** @type {?} */
648
- var formArray = this_1.buildCheckBoxFormArray(field, settings);
649
- this_1.form.addControl(field.name, formArray);
650
- }
651
- else if (field.type === 'find-location' || field.type === 'find-service') {
652
- /** @type {?} */
653
- var formArray = this_1.buildFormArray(field, settings);
654
- this_1.form.addControl(field.name, formArray);
655
- }
656
- else {
657
- /** @type {?} */
658
- var validators = [];
659
- if (field.minSelected && field.minSelected > 0) {
660
- validators.push(Validators.required);
661
- if (field.type === 'text-input') {
662
- validators.push(Validators.minLength(field.minSelected));
663
- }
664
- if (field.type === 'email-input') {
665
- validators.push(Validators.email);
666
- }
667
- }
668
- /** @type {?} */
669
- var defaultValue = null;
670
- if (reset && config.cancelSetting) {
671
- /** @type {?} */
672
- var cancelField = config.cancelSetting.fields.find((/**
673
- * @param {?} f
674
- * @return {?}
675
- */
676
- function (f) { return f.name === field.name; }));
677
- defaultValue = cancelField && cancelField.value ? cancelField.value[0] : '';
678
- }
679
- else if (settings && settings.fields) {
680
- /** @type {?} */
681
- var lastSavedValue = settings.fields.find((/**
682
- * @param {?} f
683
- * @return {?}
684
- */
685
- function (f) { return f.name === field.name; }));
686
- defaultValue = lastSavedValue && lastSavedValue ? lastSavedValue.value[0] : '';
687
- }
688
- // if field is find-person build a form group;
689
- if (field.type === 'find-person') {
690
- /** @type {?} */
691
- var formGroup = new FormGroup({
692
- domain: new FormControl(defaultValue && defaultValue.hasOwnProperty('domain') ? defaultValue.domain : ''),
693
- email: new FormControl(defaultValue && defaultValue.hasOwnProperty('email') ? defaultValue.email : '', validators),
694
- id: new FormControl(defaultValue && defaultValue.hasOwnProperty('id') ? defaultValue.id : ''),
695
- name: new FormControl(defaultValue && defaultValue.hasOwnProperty('name') ? defaultValue.name : ''),
696
- knownAs: new FormControl(defaultValue && defaultValue.hasOwnProperty('knownAs') ? defaultValue.knownAs : ''),
697
- });
698
- this_1.form.addControl(field.name, formGroup);
699
- }
700
- else if (field.type !== 'group-title') {
701
- /** @type {?} */
702
- var control = new FormControl(defaultValue, validators);
703
- this_1.form.addControl(field.name, control);
704
- }
705
- // if field updates find person component set the initial domain
706
- if (field.findPersonField) {
707
- this_1.fieldChanged(field, this_1.form);
708
- }
709
- }
710
- };
711
- var this_1 = this;
712
- try {
713
- for (var _b = tslib_1.__values(config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
714
- var field = _c.value;
715
- _loop_1(field);
716
- }
717
- }
718
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
719
- finally {
720
- try {
721
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
722
- }
723
- finally { if (e_5) throw e_5.error; }
724
- }
725
- };
726
- /**
727
- * @private
728
- * @param {?} field
729
- * @param {?} settings
730
- * @return {?}
731
- */
732
- GenericFilterComponent.prototype.buildCheckBoxFormArray = /**
733
- * @private
734
- * @param {?} field
735
- * @param {?} settings
736
- * @return {?}
737
- */
738
- function (field, settings) {
739
- var e_6, _a;
740
- /** @type {?} */
741
- var validators = GenericFilterComponent.addFormValidators(field);
742
- /** @type {?} */
743
- var formArray = this.fb.array([], validators);
744
- /** @type {?} */
745
- var defaultValues;
746
- if (settings && settings.fields) {
747
- defaultValues = settings.fields.find((/**
748
- * @param {?} f
749
- * @return {?}
750
- */
751
- function (f) { return f.name === field.name; }));
752
- }
753
- var _loop_2 = function (option) {
754
- /** @type {?} */
755
- var checked = false;
756
- if (defaultValues && Array.isArray(defaultValues.value)) {
757
- checked = !!defaultValues.value.find((/**
758
- * @param {?} value
759
- * @return {?}
760
- */
761
- function (value) { return value === option.key; }));
762
- }
763
- formArray.push(new FormControl(checked));
764
- };
765
- try {
766
- for (var _b = tslib_1.__values(field.options), _c = _b.next(); !_c.done; _c = _b.next()) {
767
- var option = _c.value;
768
- _loop_2(option);
769
- }
770
- }
771
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
772
- finally {
773
- try {
774
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
775
- }
776
- finally { if (e_6) throw e_6.error; }
777
- }
778
- return formArray;
779
- };
780
- /**
781
- * @private
782
- * @param {?} field
783
- * @param {?} settings
784
- * @return {?}
785
- */
786
- GenericFilterComponent.prototype.buildFormArray = /**
787
- * @private
788
- * @param {?} field
789
- * @param {?} settings
790
- * @return {?}
791
- */
792
- function (field, settings) {
793
- var e_7, _a;
794
- /** @type {?} */
795
- var validators = GenericFilterComponent.addFormValidators(field);
796
- /** @type {?} */
797
- var formArray = this.fb.array([], validators);
798
- /** @type {?} */
799
- var defaultValues;
800
- if (settings && settings.fields) {
801
- defaultValues = settings.fields.find((/**
802
- * @param {?} f
803
- * @return {?}
804
- */
805
- function (f) { return f.name === field.name; }));
806
- if (defaultValues && defaultValues.value && defaultValues.value.length > 0) {
807
- try {
808
- for (var _b = tslib_1.__values(defaultValues.value), _c = _b.next(); !_c.done; _c = _b.next()) {
809
- var defaultValue = _c.value;
810
- formArray.push(new FormControl(defaultValue));
811
- }
812
- }
813
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
814
- finally {
815
- try {
816
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
817
- }
818
- finally { if (e_7) throw e_7.error; }
819
- }
820
- }
821
- }
822
- return formArray;
823
- };
824
- /**
825
- * @private
826
- * @param {?} formValues
827
- * @param {?} config
828
- * @return {?}
829
- */
830
- GenericFilterComponent.prototype.getSelectedValues = /**
831
- * @private
832
- * @param {?} formValues
833
- * @param {?} config
834
- * @return {?}
835
- */
836
- function (formValues, config) {
837
- return Object.keys(formValues).map((/**
838
- * @param {?} name
839
- * @return {?}
840
- */
841
- function (name) {
842
- /** @type {?} */
843
- var values = formValues[name];
844
- if (Array.isArray(values)) {
845
- /** @type {?} */
846
- var field = config.fields.find((/**
847
- * @param {?} f
848
- * @return {?}
849
- */
850
- function (f) { return f.name === name; }));
851
- if (field.type === 'find-location' || field.type === 'find-service') {
852
- return { value: values, name: name };
853
- }
854
- else {
855
- return { value: getValues(field.options, values), name: name };
856
- }
857
- }
858
- else {
859
- return { value: [values], name: name };
860
- }
861
- }));
862
- };
863
- /**
864
- * @private
865
- * @param {?} form
866
- * @return {?}
867
- */
868
- GenericFilterComponent.prototype.emitFormErrors = /**
869
- * @private
870
- * @param {?} form
871
- * @return {?}
872
- */
873
- function (form) {
874
- var e_8, _a;
875
- /** @type {?} */
876
- var errors = [];
877
- try {
878
- for (var _b = tslib_1.__values(this.config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
879
- var field = _c.value;
880
- /** @type {?} */
881
- var formGroup = form.get(field.name);
882
- if (formGroup && formGroup.errors && (formGroup.errors.minlength || formGroup.errors.required)) {
883
- errors.push({ name: field.name, error: field.minSelectedError });
884
- }
885
- if (formGroup && formGroup.errors && formGroup.errors.maxlength) {
886
- errors.push({ name: field.name, error: field.maxSelectedError });
887
- }
888
- }
889
- }
890
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
891
- finally {
892
- try {
893
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
894
- }
895
- finally { if (e_8) throw e_8.error; }
896
- }
897
- // remove duplicates
898
- errors = errors.filter((/**
899
- * @param {?} filterError
900
- * @param {?} i
901
- * @param {?} arr
902
- * @return {?}
903
- */
904
- function (filterError, i, arr) {
905
- return errors.indexOf(arr.find((/**
906
- * @param {?} item
907
- * @return {?}
908
- */
909
- function (item) { return item.name === filterError.name; }))) === i;
910
- }));
911
- if (errors.length) {
912
- this.filterService.givenErrors.next(errors);
913
- }
914
- };
915
- /**
916
- * @return {?}
917
- */
918
- GenericFilterComponent.prototype.initValuesFromCacheForSkillsByServices = /**
919
- * @return {?}
920
- */
921
- function () {
922
- var _this = this;
923
- /** @type {?} */
924
- var cachedValues = this.filteredSkillsByServicesCheckbox.map((/**
925
- * @param {?} skill
926
- * @return {?}
927
- */
928
- function (skill) {
929
- /** @type {?} */
930
- var selected = false;
931
- if (_this.settings && _this.settings.fields) {
932
- /** @type {?} */
933
- var isSelectedUserSkill = void 0;
934
- /** @type {?} */
935
- var selectedUserSkills = _this.settings.fields.find((/**
936
- * @param {?} setting
937
- * @return {?}
938
- */
939
- function (setting) { return setting.name === 'user-skills'; }));
940
- if (selectedUserSkills && selectedUserSkills.value && selectedUserSkills.value.length > 0) {
941
- isSelectedUserSkill = selectedUserSkills.value.findIndex((/**
942
- * @param {?} val
943
- * @return {?}
944
- */
945
- function (val) {
946
- return String(val) === String(skill.key);
947
- }));
948
- selected = isSelectedUserSkill !== -1;
949
- }
950
- }
951
- return selected;
952
- }));
953
- this.form.get('user-skills').setValue(cachedValues);
954
- };
955
- /**
956
- * @param {?} services
957
- * @param {?} config
958
- * @return {?}
959
- */
960
- GenericFilterComponent.prototype.filterSkillsByServices = /**
961
- * @param {?} services
962
- * @param {?} config
963
- * @return {?}
964
- */
965
- function (services, config) {
966
- var _this = this;
967
- this.filteredSkillsByServices = [];
968
- this.filteredSkillsByServicesCheckbox = [];
969
- /** @type {?} */
970
- var userSkillsSelectField = config.fields.find((/**
971
- * @param {?} f
972
- * @return {?}
973
- */
974
- function (f) { return f.name === 'user-skills' && f.type === 'group-select'; }));
975
- /** @type {?} */
976
- var userSkillsCheckboxField = config.fields.find((/**
977
- * @param {?} f
978
- * @return {?}
979
- */
980
- function (f) { return f.name === 'user-skills' && f.type === 'nested-checkbox'; }));
981
- if (userSkillsSelectField) {
982
- /** @type {?} */
983
- var userSkills_1 = userSkillsSelectField.groupOptions;
984
- if (!services || services.length === 0) {
985
- this.filteredSkillsByServices = userSkills_1;
986
- }
987
- else {
988
- services.forEach((/**
989
- * @param {?} s
990
- * @return {?}
991
- */
992
- function (s) {
993
- /** @type {?} */
994
- var groupOption = userSkills_1.find((/**
995
- * @param {?} u
996
- * @return {?}
997
- */
998
- function (u) { return u.group.toLowerCase() === s.toLowerCase(); }));
999
- if (groupOption) {
1000
- _this.filteredSkillsByServices.push(groupOption);
1001
- }
1002
- }));
1003
- }
1004
- }
1005
- else if (userSkillsCheckboxField) {
1006
- /** @type {?} */
1007
- var userSkills_2 = userSkillsCheckboxField.groupOptions;
1008
- if (!services || services.length === 0) {
1009
- this.filteredSkillsByServices = userSkills_2;
1010
- }
1011
- else {
1012
- services.forEach((/**
1013
- * @param {?} s
1014
- * @return {?}
1015
- */
1016
- function (s) {
1017
- /** @type {?} */
1018
- var groupOption = userSkills_2.find((/**
1019
- * @param {?} u
1020
- * @return {?}
1021
- */
1022
- function (u) { return u.group.toLowerCase() === s.toLowerCase(); }));
1023
- if (groupOption) {
1024
- _this.filteredSkillsByServices.push(groupOption);
1025
- }
1026
- }));
1027
- this.filteredSkillsByServicesCheckbox = this.filteredSkillsByServices.map((/**
1028
- * @param {?} skill
1029
- * @return {?}
1030
- */
1031
- function (skill) {
1032
- return skill.options;
1033
- })).reduce((/**
1034
- * @param {?} a
1035
- * @param {?} b
1036
- * @return {?}
1037
- */
1038
- function (a, b) {
1039
- return a.concat(b);
1040
- }), []);
1041
- userSkillsCheckboxField.options = [];
1042
- userSkillsCheckboxField.options = this.filteredSkillsByServicesCheckbox;
1043
- this.form.setControl('user-skills', new FormArray([]));
1044
- this.filteredSkillsByServicesCheckbox.forEach((/**
1045
- * @return {?}
1046
- */
1047
- function () {
1048
- ((/** @type {?} */ (_this.form.get('user-skills')))).push(new FormControl(false));
1049
- }));
1050
- /** @type {?} */
1051
- var prevValues = this.filteredSkillsByServicesCheckbox.map((/**
1052
- * @param {?} skill
1053
- * @return {?}
1054
- */
1055
- function (skill) {
1056
- /** @type {?} */
1057
- var selected = false;
1058
- if (_this.settings && _this.settings.fields) {
1059
- if (_this.previousSelectedNestedCheckbox.length > 0) {
1060
- selected = _this.previousSelectedNestedCheckbox.includes(skill.key);
1061
- }
1062
- /** @type {?} */
1063
- var isSelectedUserSkill = void 0;
1064
- /** @type {?} */
1065
- var selectedUserSkills = _this.settings.fields.find((/**
1066
- * @param {?} setting
1067
- * @return {?}
1068
- */
1069
- function (setting) { return setting.name === 'user-skills'; }));
1070
- if (selectedUserSkills && selectedUserSkills.value && selectedUserSkills.value.length > 0) {
1071
- isSelectedUserSkill = selectedUserSkills.value.findIndex((/**
1072
- * @param {?} val
1073
- * @return {?}
1074
- */
1075
- function (val) { return Number(val) === Number(skill.key); }));
1076
- selected = isSelectedUserSkill !== -1;
1077
- }
1078
- if (_this.previousSelectedNestedCheckbox.length > 0) {
1079
- // Pick up from previous selected
1080
- selected = _this.previousSelectedNestedCheckbox.includes(String(skill.key));
1081
- }
1082
- }
1083
- return selected;
1084
- }));
1085
- this.form.get('user-skills').setValue(prevValues);
1086
- return this.filteredSkillsByServicesCheckbox;
1087
- }
1088
- }
1089
- this.filteredSkillsByServices = this.sortGroupOptions(this.filteredSkillsByServices);
1090
- return this.filteredSkillsByServices;
1091
- };
1092
- /**
1093
- * @private
1094
- * @param {?} formValues
1095
- * @param {?} field
1096
- * @return {?}
1097
- */
1098
- GenericFilterComponent.prototype.getSelectedValuesForFields = /**
1099
- * @private
1100
- * @param {?} formValues
1101
- * @param {?} field
1102
- * @return {?}
1103
- */
1104
- function (formValues, field) {
1105
- /** @type {?} */
1106
- var selectedValues = [];
1107
- Object.keys(formValues).map((/**
1108
- * @param {?} name
1109
- * @return {?}
1110
- */
1111
- function (name) {
1112
- /** @type {?} */
1113
- var values = formValues[name].value;
1114
- if (name === field.name) {
1115
- values.forEach((/**
1116
- * @param {?} v
1117
- * @return {?}
1118
- */
1119
- function (v) {
1120
- selectedValues.push(v.key);
1121
- }));
1122
- }
1123
- }));
1124
- return selectedValues;
1125
- };
1126
- /**
1127
- * @private
1128
- * @param {?} groupOptions
1129
- * @return {?}
1130
- */
1131
- GenericFilterComponent.prototype.sortGroupOptions = /**
1132
- * @private
1133
- * @param {?} groupOptions
1134
- * @return {?}
1135
- */
1136
- function (groupOptions) {
1137
- /** @type {?} */
1138
- var sortedResults = [];
1139
- /** @type {?} */
1140
- var groups = groupOptions.map((/**
1141
- * @param {?} go
1142
- * @return {?}
1143
- */
1144
- function (go) { return go.group; }));
1145
- groups.sort().forEach((/**
1146
- * @param {?} g
1147
- * @return {?}
1148
- */
1149
- function (g) {
1150
- /** @type {?} */
1151
- var options = groupOptions.find((/**
1152
- * @param {?} go
1153
- * @return {?}
1154
- */
1155
- function (go) { return go.group === g; })).options;
1156
- /** @type {?} */
1157
- var sortedOptions = options.sort((/**
1158
- * @param {?} a
1159
- * @param {?} b
1160
- * @return {?}
1161
- */
1162
- function (a, b) {
1163
- return a.label.toLowerCase() > b.label.toLowerCase() ? 1 : (b.label.toLowerCase() > a.label.toLowerCase() ? -1 : 0);
1164
- }));
1165
- /** @type {?} */
1166
- var result = {
1167
- group: g,
1168
- options: sortedOptions
1169
- };
1170
- sortedResults.push(result);
1171
- }));
1172
- return sortedResults;
1173
- };
1174
- GenericFilterComponent.decorators = [
1175
- { type: Component, args: [{
1176
- selector: 'xuilib-generic-filter',
1177
- template: "<form [formGroup]=\"form\" (ngSubmit)=\"applyFilter(form)\">\n <div class=\"contain-classes\" *ngFor=\"let field of config.fields\">\n <hr *ngIf=\"field.lineBreakBefore\" class=\"govuk-section-break govuk-section-break--visible elevated-break\">\n <ng-container [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'group-title'\">\n <div [class]=\"field.titleClasses ? field.titleClasses: 'govuk-label govuk-label--m govuk-!-margin-bottom-4'\">\n {{ field.name | capitalize }}\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <div class=\"govuk-form-group xui-generic-filter\"\n [hidden]=\"hidden(field, form)\"\n [id]=\"field.name\"\n [ngClass]=\"{'form-group-error': submitted && (form.get(field.name).errors?.minLength || form.get(field.name).errors?.maxLength)}\">\n <div *ngIf=\"field.title\" class=\"xui-generic-filter__field-title\">\n <h3 [class]=\"field.titleClasses ? field.titleClasses : 'govuk-heading-s'\" style=\"margin-bottom: 0!important\">\n {{field.title | capitalize}}\n </h3>\n <div *ngIf=\"field?.titleHint\" class=\"govuk-!-margin-left-2\">\n {{ field.titleHint }}\n </div>\n </div>\n <p class=\"govuk-body\" *ngIf=\"field.subTitle\">{{field.subTitle}}</p>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMinSelectedError && submitted && form.get(field.name).errors?.minLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.minSelectedError}}\n </span>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMaxSelectedError && submitted && form.get(field.name).errors?.maxLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.maxSelectedError}}\n </span>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\"\n *ngIf=\"field.emailError && submitted && form.get(field.name).errors?.email\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.emailError}}\n </span>\n <div class=\"govuk-body\" [class.govuk-body--maxWidth480px]=\"field.maxWidth480px\" [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <select class=\"govuk-select\" (change)=\"fieldChanged(field, form)\" [attr.disabled]=\"disabled(field, form)\" [name]=\"'select_' + field.name\" [id]=\"'select_' + field.name\" [formControlName]=\"field.name\">\n <option disabled selected hidden value=\"\">{{field.disabledText}}</option>\n <option *ngIf=\"field.defaultOption\" [attr.selected]=\"true\" [value]=\"field.defaultOption.key\">{{field.defaultOption.label}}</option>\n <option class=\"govuk-radios__item\" *ngFor=\"let item of field.options\" [value]=\"item.key\">{{item.label}}</option>\n </select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'group-select'\">\n <select class=\"govuk-select\" (change)=\"fieldChanged(field, form)\" [attr.disabled]=\"disabled(field, form)\" [name]=\"'select_' + field.name\" [id]=\"'select_' + field.name\" [formControlName]=\"field.name\">\n <option disabled selected hidden value=\"\">{{field.disabledText}}</option>\n <option *ngIf=\"field.defaultOption\" selected [value]=\"field.defaultOption.key\">{{field.defaultOption.label}}</option>\n <optgroup *ngFor = 'let grp of filteredSkillsByServices' label=\"{{grp.group | titlecase}}\">\n <option *ngFor = 'let item of grp.options' [value]=\"item.key\">{{item.label}}</option>\n </optgroup>\n </select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'nested-checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of filteredSkillsByServicesCheckbox; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox-large'\">\n <div class=\"govuk-checkboxes\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radio'\">\n <div class=\"govuk-radios\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-radios__item\">\n <input type=\"radio\"\n [formControlName]=\"field.name\"\n [id]=\"'radio_' + item.key\"\n [attr.disabled]=\"disabled(field, form)\"\n [checked]=\"item.key === form.get(field.name).value\"\n class=\"govuk-radios__input\"\n [value]=\"item.key\"\n (change)=\"fieldChanged(field, form)\"\n />\n <label [for]=\"'radio_' + item.key\" class=\"govuk-label govuk-radios__label\">{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-person'\">\n <xuilib-find-person subTitle=\"\" (personSelected)=\"updatePersonControls($event, field)\"\n (personFieldChanged)=\"inputChanged(field)\"\n [submitted]=\"submitted\"\n [disabled]=\"disabled(field, form)\"\n [domain]=\"form.get(field.domainField)?.value\"\n [findPersonGroup]=\"form\"\n [selectedPerson]=\"form.get(field.name)?.value?.email\"\n [userIncluded]=\"false\"\n [placeholderContent]=\"field.placeholderContent ? field.placeholderContent : ''\"\n ></xuilib-find-person>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-location'\">\n <xuilib-find-location (locationFieldChanged)=\"inputChanged(field)\"\n [form]=\"form\"\n [fields]=\"config.fields\"\n [locationTitle]=\"field.locationTitle\"\n [enableAddLocationButton]=\"field.enableAddButton\"\n [disabled]=\"disabled(field, form)\"\n [disableInputField]=\"field.disable\"\n [selectedLocations]=\"form.get(field.name)?.value\"\n [submitted]=\"submitted\"\n [services]=\"form.get(field.findLocationField)?.value\"\n [field]=\"field\"\n ></xuilib-find-location>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-task-name'\">\n <xuilib-find-task-name subTitle=\"\" (taskNameSelected)=\"updateTaskNameControls($event, field)\"\n (taskNameFieldChanged)=\"inputChanged(field)\"\n [submitted]=\"submitted\"\n [disabled]=\"disabled(field, form)\"\n [domain]=\"form.get(field.domainField)?.value\"\n [findTaskNameGroup]=\"form\"\n [selectedTaskName]=\"form.get(field.name).value.taskName\"\n [userIncluded]=\"false\"\n ></xuilib-find-task-name>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-service'\">\n <xuilib-find-service (serviceFieldChanged)=\"inputChanged(field)\"\n [form]=\"form\"\n [enableAddServiceButton]=\"field.enableAddButton\"\n [disabled]=\"disabled(field, form)\"\n [selectedServices]=\"form.get(field.name)?.value\"\n [services]=\"field.options\"\n [field]=\"field\">\n </xuilib-find-service>\n </ng-container>\n <ng-container *ngSwitchCase=\"'text-input'\">\n <input class=\"govuk-input\" type=\"text\"\n [formControlName]=\"field.name\"\n [id]=\"field.name\"\n [attr.disabled]=\"disabled(field, form)\"\n (change)=\"fieldChanged(field, form)\"\n [attr.maxlength]=\"field.maxlength ? field.maxlength : null\"\n />\n </ng-container>\n <ng-container *ngSwitchCase=\"'email-input'\">\n <input class=\"govuk-input\" type=\"email\"\n [formControlName]=\"field.name\"\n [id]=\"field.name\"\n [attr.disabled]=\"disabled(field, form)\"\n (change)=\"fieldChanged(field, form)\"\n />\n </ng-container>\n </div>\n </div>\n </ng-container>\n</ng-container>\n </div>\n <hr class=\"govuk-section-break govuk-section-break--m govuk-section-break--visible\"/>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <button\n class=\"govuk-button govuk-!-margin-right-1 govuk-!-margin-bottom-0\"\n type=\"submit\"\n id=\"applyFilter\"\n [disabled]=\"config.enableDisabledButton && form.invalid\"\n >{{config.applyButtonText || 'Apply'}}</button>\n <button *ngIf=\"config.showCancelFilterButton\"\n class=\"govuk-button govuk-button--secondary govuk-!-margin-bottom-0\"\n type=\"button\"\n id=\"cancelFilter\"\n (click)=\"cancelFilter()\">{{ config.cancelButtonText || 'Cancel'}}</button>\n </div>\n </div>\n</form>\n",
1178
- changeDetection: ChangeDetectionStrategy.OnPush,
1179
- encapsulation: ViewEncapsulation.None,
1180
- styles: [".contain-classes .elevated-break{margin-bottom:20px}@media (min-width:40.0625em){.contain-classes .elevated-break{margin-bottom:30px}}.contain-classes .govuk-body--maxWidth480px{max-width:480px}.contain-classes .xui-generic-filter .select-all{margin-bottom:10px}.contain-classes .xui-generic-filter .govuk-checkboxes{display:flex;flex-direction:column;flex-wrap:wrap}.contain-classes .xui-generic-filter .govuk-checkboxes>div{flex-grow:1;flex-shrink:0}.contain-classes .xui-generic-filter__field-title{display:flex;align-items:center;margin-bottom:10px}.contain-classes .govuk-select{width:100%}"]
1181
- }] }
1182
- ];
1183
- /** @nocollapse */
1184
- GenericFilterComponent.ctorParameters = function () { return [
1185
- { type: FilterService },
1186
- { type: FormBuilder }
1187
- ]; };
1188
- GenericFilterComponent.propDecorators = {
1189
- config: [{ type: Input }],
1190
- settings: [{ type: Input }]
1191
- };
1192
- return GenericFilterComponent;
1193
- }());
1194
- export { GenericFilterComponent };
1195
- if (false) {
1196
- /** @type {?} */
1197
- GenericFilterComponent.prototype.form;
1198
- /** @type {?} */
1199
- GenericFilterComponent.prototype.submitted;
1200
- /** @type {?} */
1201
- GenericFilterComponent.prototype.formSub;
1202
- /** @type {?} */
1203
- GenericFilterComponent.prototype.filteredSkillsByServices;
1204
- /** @type {?} */
1205
- GenericFilterComponent.prototype.filteredSkillsByServicesCheckbox;
1206
- /** @type {?} */
1207
- GenericFilterComponent.prototype.previousSelectedNestedCheckbox;
1208
- /**
1209
- * @type {?}
1210
- * @private
1211
- */
1212
- GenericFilterComponent.prototype._config;
1213
- /**
1214
- * @type {?}
1215
- * @private
1216
- */
1217
- GenericFilterComponent.prototype._settings;
1218
- /**
1219
- * @type {?}
1220
- * @private
1221
- */
1222
- GenericFilterComponent.prototype.filterService;
1223
- /**
1224
- * @type {?}
1225
- * @private
1226
- */
1227
- GenericFilterComponent.prototype.fb;
1228
- }
1229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFtQixTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRjtJQWVFLGdDQUE2QixhQUE0QixFQUFtQixFQUFlO1FBQTlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQW1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFOcEYsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUlsQixtQ0FBOEIsR0FBYSxFQUFFLENBQUM7SUFHckQsQ0FBQztJQUtELHNCQUFXLDBDQUFNOzs7O1FBQWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7Ozs7O1FBRUQsVUFDa0IsS0FBbUI7WUFDbkMsSUFBSSxDQUFDLE9BQU8sd0JBQ1AsS0FBSyxJQUNSLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUc7Ozs7Z0JBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxzQkFDN0IsS0FBSyxJQUNSLHVCQUF1QixFQUFFLEtBQUssRUFDOUIsdUJBQXVCLEVBQUUsS0FBSyxJQUM5QixFQUpnQyxDQUloQyxFQUFDLEdBQ0osQ0FBQztZ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Ozs7WUFBQyxVQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RILENBQUMsRUFBQzs7Z0JBQ0ksTUFBTSxHQUFHO2dCQUNiLEtBQUssRUFBRyxDQUFDO2dCQUNULE9BQU8sRUFBRSxhQUFhO2FBQ3ZCO1lBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7O2dCQW5sQkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLDRpWUFBNEM7b0JBRTVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7aUJBQ3RDOzs7O2dCQVRRLGFBQWE7Z0JBSGUsV0FBVzs7O3lCQStCN0MsS0FBSzsyQkFvQkwsS0FBSzs7SUF1aUJSLDZCQUFDO0NBQUEsQUFwbEJELElBb2xCQztTQTdrQlksc0JBQXNCOzs7SUFDakMsc0NBQXVCOztJQUN2QiwyQ0FBeUI7O0lBQ3pCLHlDQUE2Qjs7SUFDN0IsMERBQWdEOztJQUNoRCxrRUFBOEQ7O0lBQzlELGdFQUFxRDs7Ozs7SUFNckQseUNBQThCOzs7OztJQW9COUIsMkNBQWtDOzs7OztJQXhCdEIsK0NBQTZDOzs7OztJQUFFLG9DQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRmlsdGVyQ29uZmlnT3B0aW9uLCBGaWx0ZXJFcnJvciwgRmlsdGVyRmllbGRDb25maWcsIEZpbHRlclNldHRpbmcsIEdyb3VwT3B0aW9ucyB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9maWx0ZXIvZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VmFsdWVzLCBtYXhTZWxlY3RlZFZhbGlkYXRvciwgbWluU2VsZWN0ZWRWYWxpZGF0b3IgfSBmcm9tICcuL2dlbmVyaWMtZmlsdGVyLXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneHVpbGliLWdlbmVyaWMtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICdnZW5lcmljLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydnZW5lcmljLWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgc3VibWl0dGVkID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JtU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBmaWx0ZXJlZFNraWxsc0J5U2VydmljZXM6IEdyb3VwT3B0aW9uc1tdO1xuICBwdWJsaWMgZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3g6IEZpbHRlckNvbmZpZ09wdGlvbltdO1xuICBwdWJsaWMgcHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94OiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2NvbmZpZzogRmlsdGVyQ29uZmlnO1xuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IEZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBGaWx0ZXJDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGZpZWxkczogdmFsdWUuZmllbGRzLm1hcChmaWVsZCA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgZGlzcGxheU1pblNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TWF4U2VsZWN0ZWRFcnJvcjogZmFsc2UsXG4gICAgICB9KSlcbiAgICB9O1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfc2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5nO1xuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogRmlsdGVyU2V0dGluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZXR0aW5ncyh2YWx1ZTogRmlsdGVyU2V0dGluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmZpZWxkcykge1xuICAgICAgdGhpcy5tZXJnZURlZmF1bHRGaWVsZHModmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXR0aW5ncyA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogVmFsaWRhdG9ycyB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5taW5TZWxlY3RlZCA+IDApIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChtaW5TZWxlY3RlZFZhbGlkYXRvcihmaWVsZC5taW5TZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5tYXhTZWxlY3RlZCA+IDApIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChtYXhTZWxlY3RlZFZhbGlkYXRvcihmaWVsZC5tYXhTZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICB0aGlzLm1lcmdlRGVmYXVsdEZpZWxkcyh0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmNvcHlGaWVsZHMpIHtcbiAgICAgIHRoaXMuZm9ybSA9IHRoaXMuX2NvbmZpZy5jb3B5RmllbGRzKHRoaXMuZm9ybSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtU3ViID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5maWx0ZXJTa2lsbHNCeVNlcnZpY2VzKG51bGwsIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICd1c2VyLXNlcnZpY2VzJyk7XG4gICAgaWYgKHNlcnZpY2VzKSB7XG4gICAgICB0aGlzLnN0YXJ0RmlsdGVyU2tpbGxzQnlTZXJ2aWNlcyh0aGlzLmZvcm0sIHNlcnZpY2VzKTtcbiAgICAgIHRoaXMuaW5pdFZhbHVlc0Zyb21DYWNoZUZvclNraWxsc0J5U2VydmljZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybVN1Yikge1xuICAgICAgdGhpcy5mb3JtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGRlbihmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuc2hvd0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLnNob3dDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuc2hvd0NvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgaWYgKGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZVtuYW1lXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuZW5hYmxlQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWVsZC5lbmFibGVDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuZW5hYmxlQ29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmluZC1sb2NhdGlvbiBpcyBzcGVjaWFsIGNhc2Ugd2hlcmUgbmVlZCB0byByZXNldCB0ZXh0Ym94IChieSBleGlzdGluZyBkaXNhYmxpbmcgZnVuY3Rpb25hbGl0eSlcbiAgICAvLyBmaWVsZC5kaXNhYmxlIHJlZmVycmVkIHRvIGNvbXBvbmVudCBpdHNlbGZcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gTm90ZTogZmllbGQuZGlzYWJsZSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0dWFsbHkgZGlzYWJsZSBvciBub3RcbiAgICByZXR1cm4gZmllbGQuZGlzYWJsZSA/IGZpZWxkLmRpc2FibGUgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICBmb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICBpZiAoZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5fc2V0dGluZ3MgPSB7XG4gICAgICAgIGlkOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICAgaWRhbUlkOiB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0VXNlcklkKCksXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRTZWxlY3RlZFZhbHVlcyhmb3JtLnZhbHVlLCB0aGlzLmNvbmZpZylcbiAgICAgIH07XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChudWxsKTtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gey4uLnRoaXMuc2V0dGluZ3MsIHJlc2V0OiBmYWxzZX07XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdChzZXR0aW5ncywgdGhpcy5jb25maWcucGVyc2lzdGVuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRGb3JtRXJyb3JzKGZvcm0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuYXBwbHlCdXR0b25DYWxsYmFjaykge1xuICAgICAgdGhpcy5fY29uZmlnLmFwcGx5QnV0dG9uQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyB3aGVuIGRvbWFpbiBjaGFuZ2VzIGVuc3VyZSB0aGF0IHBlcnNvbiBmaWVsZCBpcyByZXNldFxuICBwdWJsaWMgZmllbGRDaGFuZ2VkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgLy8gVE9ETyAtIERvIHNpbWlsYXIgd2l0aCBqdXJpc2RpY3Rpb24vc2VydmljZSBmb3IgY2FzZXdvcmtlcnMgYnkgc2VydmljZXNcbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHdoZW4gdXNlciBlbnRlcnMgaW5wdXQgY2hhbmdlIHJhZGlvIGJ1dHRvblxuICBwdWJsaWMgaW5wdXRDaGFuZ2VkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmIChmaWVsZC5uYW1lID09PSAndXNlci1zZXJ2aWNlcycpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkU2VydmljZXMgPSB0aGlzLmdldFNlbGVjdGVkVmFsdWVzRm9yRmllbGRzKHRoaXMuZm9ybS5jb250cm9scywgZmllbGQpO1xuICAgICAgdGhpcy5maWx0ZXJTa2lsbHNCeVNlcnZpY2VzKHNlbGVjdGVkU2VydmljZXMsIHRoaXMuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLnJhZGlvU2VsZWN0aW9uQ2hhbmdlICYmIHR5cGVvZiBmaWVsZC5yYWRpb1NlbGVjdGlvbkNoYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5lbmFibGVDb25kaXRpb24uc3BsaXQoJz0nKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQobmFtZSkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncywgdHJ1ZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzLmZpZWxkcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMpKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB7Li4udGhpcy5zZXR0aW5ncywgcmVzZXQ6IHRydWV9O1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5wZXJzaXN0KHNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQobnVsbCk7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5jYW5jZWxCdXR0b25DYWxsYmFjaykge1xuICAgICAgdGhpcy5jb25maWcuY2FuY2VsQnV0dG9uQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUGVyc29uQ29udHJvbHModmFsdWVzOiBhbnksIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGxldCBrZXlzO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAodGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKSAmJiB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzICYmIHZhbHVlc1trZXldID8gdmFsdWVzW2tleV0gOiBudWxsO1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGVja0JveENoZWNrZWQoZmllbGQ6IGFueSwgaTogbnVtYmVyKSB7XG4gICAgcmV0dXJuICh0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpIGFzIEZvcm1BcnJheSlbJ2NvbnRyb2xzJ11baV1bJ3ZhbHVlJ107XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlVGFza05hbWVDb250cm9scyh2YWx1ZXM6IHN0cmluZywgZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5wYXRjaFZhbHVlKHZhbHVlcyk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBhbnksIGZvcm06IEZvcm1Hcm91cCwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgc2VsZWN0QWxsPzogdHJ1ZSB9LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcbiAgICBjb25zdCBmb3JtQXJyYXk6IEZvcm1BcnJheSA9IGZvcm0uZ2V0KGZpZWxkLm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAoIWl0ZW0uc2VsZWN0QWxsKSB7XG4gICAgICBjb25zdCBhbGxDaGVja2VkID0gZm9ybUFycmF5LmNvbnRyb2xzLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgICAgY29uc3QgaGFzU2VsZWN0QWxsT3B0aW9uID0gZmllbGQub3B0aW9ucy5maW5kKChvcHRpb24sIGkpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0QWxsJykpIHtcbiAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgICAgY29uc3QgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbHRlcigoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICBpZiAoIWFsbENoZWNrZWQgJiYgaGFzU2VsZWN0QWxsT3B0aW9uICYmICFpc0NoZWNrZWQpIHtcbiAgICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc1NlbGVjdEFsbE9wdGlvbiAmJiAhYWxsQ2hlY2tlZCAmJiBpc0NoZWNrZWQgJiYgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICAgIGZvcm1BcnJheS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGQubmFtZSA9PT0gJ3VzZXItc2VydmljZXMnKSB7XG4gICAgICB0aGlzLnN0YXJ0RmlsdGVyU2tpbGxzQnlTZXJ2aWNlcyhmb3JtLCBmaWVsZCk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09PSAndXNlci1za2lsbHMnKSB7XG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBmaWVsZC5vcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gTnVtYmVyKG9wdGlvbi5rZXkpID09PSBOdW1iZXIoZXZlbnQudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2hlY2tib3ggPSB0aGlzLmZvcm0uZ2V0KCd1c2VyLXNraWxscycpLnZhbHVlO1xuICAgICAgICBzZWxlY3RlZENoZWNrYm94W3NlbGVjdGVkSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndXNlci1za2lsbHMnKS5zZXRWYWx1ZShzZWxlY3RlZENoZWNrYm94KTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3gucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnByZXZpb3VzU2VsZWN0ZWROZXN0ZWRDaGVja2JveC5pbmRleE9mKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzU2VsZWN0ZWROZXN0ZWRDaGVja2JveC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEZpbHRlclNraWxsc0J5U2VydmljZXMoZm9ybTogRm9ybUdyb3VwLCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpIHtcbiAgICBjb25zdCBzZXJ2aWNlc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvcm0udmFsdWVbZmllbGQubmFtZV0ubWFwKChzZXJ2aWNlOiBib29sZWFuLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICBzZXJ2aWNlc0FycmF5LnB1c2goZmllbGQub3B0aW9uc1tpbmRleF0ua2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZpbHRlclNraWxsc0J5U2VydmljZXMoc2VydmljZXNBcnJheSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZpZWxkKHJlc2V0RmllbGQ6IHN0cmluZywgZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IGZvcm0uZ2V0KHJlc2V0RmllbGQpO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZTogeyBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnlbXSB9ID0gdGhpcy5jb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSByZXNldEZpZWxkKTtcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2wucmVtb3ZlQXQoaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY29udHJvbC52YWx1ZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWVsZChrZXksIGNvbnRyb2wpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUudmFsdWUgJiYgZGVmYXVsdFZhbHVlLnZhbHVlLmxlbmd0aCA/IGRlZmF1bHRWYWx1ZS52YWx1ZVswXSA6IG51bGw7XG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlRGVmYXVsdEZpZWxkcyhmaWx0ZXI6IEZpbHRlclNldHRpbmcpOiB2b2lkIHtcbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIuZmllbGRzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCkgPyB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKS5maWVsZHMgOiBmaWx0ZXIuZmllbGRzO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuY2FuY2VsU2V0dGluZykge1xuICAgICAgdGhpcy5fc2V0dGluZ3MgPSB7XG4gICAgICAgIGlkOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICAgZmllbGRzOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzKSlcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm0oY29uZmlnOiBGaWx0ZXJDb25maWcsIHNldHRpbmdzOiBGaWx0ZXJTZXR0aW5nLCByZXNldD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kUGVyc29uQ29udHJvbCA9IHRoaXMuZm9ybSA/IHRoaXMuZm9ybS5nZXQoJ2ZpbmRQZXJzb25Db250cm9sJykgOiBudWxsO1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIGlmIChmaW5kUGVyc29uQ29udHJvbCkge1xuICAgICAgLy8gaW4gb3JkZXIgdG8gbWFpbnRhaW4gZmluZCBwZXJzb24gY29tcG9uZW50LCBjb250cm9sIG5lZWRzIHRvIGJlIGtlcHRcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKCdmaW5kUGVyc29uQ29udHJvbCcsIGZpbmRQZXJzb25Db250cm9sKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBjb25maWcuZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBmaWVsZC50eXBlID09PSAnY2hlY2tib3gtbGFyZ2UnIHx8IGZpZWxkLnR5cGUgPT09ICduZXN0ZWQtY2hlY2tib3gnKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYnVpbGRDaGVja0JveEZvcm1BcnJheShmaWVsZCwgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBmb3JtQXJyYXkpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1sb2NhdGlvbicgfHwgZmllbGQudHlwZSA9PT0gJ2ZpbmQtc2VydmljZScpIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5idWlsZEZvcm1BcnJheShmaWVsZCwgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBmb3JtQXJyYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgICAgICBpZiAoZmllbGQubWluU2VsZWN0ZWQgJiYgZmllbGQubWluU2VsZWN0ZWQgPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICd0ZXh0LWlucHV0Jykge1xuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGZpZWxkLm1pblNlbGVjdGVkKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdlbWFpbC1pbnB1dCcpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgICAgICBjb25zdCBjYW5jZWxGaWVsZCA9IGNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNhbmNlbEZpZWxkICYmIGNhbmNlbEZpZWxkLnZhbHVlID8gY2FuY2VsRmllbGQudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBsYXN0U2F2ZWRWYWx1ZSA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGxhc3RTYXZlZFZhbHVlICYmIGxhc3RTYXZlZFZhbHVlID8gbGFzdFNhdmVkVmFsdWUudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZCBpcyBmaW5kLXBlcnNvbiBidWlsZCBhIGZvcm0gZ3JvdXA7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBkb21haW46IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLmhhc093blByb3BlcnR5KCdkb21haW4nKSA/IGRlZmF1bHRWYWx1ZS5kb21haW4gOiAnJyksXG4gICAgICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2VtYWlsJykgPyBkZWZhdWx0VmFsdWUuZW1haWwgOiAnJywgdmFsaWRhdG9ycyksXG4gICAgICAgICAgICBpZDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2lkJykgPyBkZWZhdWx0VmFsdWUuaWQgOiAnJyksXG4gICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpID8gZGVmYXVsdFZhbHVlLm5hbWUgOiAnJyksXG4gICAgICAgICAgICBrbm93bkFzOiBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgna25vd25BcycpID8gZGVmYXVsdFZhbHVlLmtub3duQXMgOiAnJyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUdyb3VwKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlICE9PSAnZ3JvdXAtdGl0bGUnKSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZmllbGQgdXBkYXRlcyBmaW5kIHBlcnNvbiBjb21wb25lbnQgc2V0IHRoZSBpbml0aWFsIGRvbWFpblxuICAgICAgICBpZiAoZmllbGQuZmluZFBlcnNvbkZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5maWVsZENoYW5nZWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgZmllbGQub3B0aW9ucykge1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlcy52YWx1ZSkpIHtcbiAgICAgICAgY2hlY2tlZCA9ICEhZGVmYXVsdFZhbHVlcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG9wdGlvbi5rZXkpO1xuICAgICAgfVxuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGNoZWNrZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1BcnJheShmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIHNldHRpbmdzOiBGaWx0ZXJTZXR0aW5nKTogRm9ybUFycmF5IHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gR2VuZXJpY0ZpbHRlckNvbXBvbmVudC5hZGRGb3JtVmFsaWRhdG9ycyhmaWVsZCk7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShbXSwgdmFsaWRhdG9ycyk7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55W10gfTtcbiAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gc2V0dGluZ3MuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzLnZhbHVlICYmIGRlZmF1bHRWYWx1ZXMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlZmF1bHRWYWx1ZSBvZiBkZWZhdWx0VmFsdWVzLnZhbHVlKSB7XG4gICAgICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkVmFsdWVzKGZvcm1WYWx1ZXM6IGFueSwgY29uZmlnOiBGaWx0ZXJDb25maWcpOiBhbnkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhmb3JtVmFsdWVzKS5tYXAoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gZm9ybVZhbHVlc1tuYW1lXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nIHx8IGZpZWxkLnR5cGUgPT09ICdmaW5kLXNlcnZpY2UnKSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdmFsdWVzLCBuYW1lfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBnZXRWYWx1ZXMoZmllbGQub3B0aW9ucywgdmFsdWVzKSwgbmFtZX07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IFt2YWx1ZXNdLCBuYW1lfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEZvcm1FcnJvcnMoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgbGV0IGVycm9yczogRmlsdGVyRXJyb3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5jb25maWcuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiAoZm9ybUdyb3VwLmVycm9ycy5taW5sZW5ndGggfHwgZm9ybUdyb3VwLmVycm9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5tYXhsZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5tYXhTZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICBlcnJvcnMgPSBlcnJvcnMuZmlsdGVyKCAoZmlsdGVyRXJyb3IsIGksIGFycikgPT4ge1xuICAgICAgcmV0dXJuIGVycm9ycy5pbmRleE9mKGFyci5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJFcnJvci5uYW1lKSkgPT09IGk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQoZXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdFZhbHVlc0Zyb21DYWNoZUZvclNraWxsc0J5U2VydmljZXMoKSB7XG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXNDaGVja2JveC5tYXAoc2tpbGwgPT4ge1xuICAgICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzICYmIHRoaXMuc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICAgIGxldCBpc1NlbGVjdGVkVXNlclNraWxsOiBudW1iZXI7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVXNlclNraWxscyA9IHRoaXMuc2V0dGluZ3MuZmllbGRzLmZpbmQoc2V0dGluZyA9PiBzZXR0aW5nLm5hbWUgPT09ICd1c2VyLXNraWxscycpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyU2tpbGxzICYmIHNlbGVjdGVkVXNlclNraWxscy52YWx1ZSAmJiBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlzU2VsZWN0ZWRVc2VyU2tpbGwgPSBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUuZmluZEluZGV4KHZhbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbCkgPT09IFN0cmluZyhza2lsbC5rZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGVjdGVkID0gaXNTZWxlY3RlZFVzZXJTa2lsbCAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtLmdldCgndXNlci1za2lsbHMnKS5zZXRWYWx1ZShjYWNoZWRWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlclNraWxsc0J5U2VydmljZXMoc2VydmljZXM6IHN0cmluZ1tdLCBjb25maWc6IEZpbHRlckNvbmZpZykge1xuICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzID0gW107XG4gICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXNDaGVja2JveCA9IFtdO1xuICAgIGNvbnN0IHVzZXJTa2lsbHNTZWxlY3RGaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gJ3VzZXItc2tpbGxzJyAmJiBmLnR5cGUgPT09ICdncm91cC1zZWxlY3QnKTtcbiAgICBjb25zdCB1c2VyU2tpbGxzQ2hlY2tib3hGaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gJ3VzZXItc2tpbGxzJyAmJiBmLnR5cGUgPT09ICduZXN0ZWQtY2hlY2tib3gnKTtcblxuICAgIGlmICh1c2VyU2tpbGxzU2VsZWN0RmllbGQpIHtcbiAgICAgIGNvbnN0IHVzZXJTa2lsbHMgPSB1c2VyU2tpbGxzU2VsZWN0RmllbGQuZ3JvdXBPcHRpb25zO1xuICAgICAgaWYgKCFzZXJ2aWNlcyB8fCBzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMgPSB1c2VyU2tpbGxzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmljZXMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cE9wdGlvbiA9IHVzZXJTa2lsbHMuZmluZCh1ID0+IHUuZ3JvdXAudG9Mb3dlckNhc2UoKSA9PT0gcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICBpZiAoZ3JvdXBPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzLnB1c2goZ3JvdXBPcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1c2VyU2tpbGxzQ2hlY2tib3hGaWVsZCkge1xuICAgICAgY29uc3QgdXNlclNraWxscyA9IHVzZXJTa2lsbHNDaGVja2JveEZpZWxkLmdyb3VwT3B0aW9ucztcbiAgICAgIGlmICghc2VydmljZXMgfHwgc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzID0gdXNlclNraWxscztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBPcHRpb24gPSB1c2VyU2tpbGxzLmZpbmQodSA9PiB1Lmdyb3VwLnRvTG93ZXJDYXNlKCkgPT09IHMudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgaWYgKGdyb3VwT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlcy5wdXNoKGdyb3VwT3B0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlc0NoZWNrYm94ID0gdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMubWFwKHNraWxsID0+IHtcbiAgICAgICAgICByZXR1cm4gc2tpbGwub3B0aW9ucztcbiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHVzZXJTa2lsbHNDaGVja2JveEZpZWxkLm9wdGlvbnMgPSBbXTtcbiAgICAgICAgdXNlclNraWxsc0NoZWNrYm94RmllbGQub3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3g7XG5cbiAgICAgICAgdGhpcy5mb3JtLnNldENvbnRyb2woJ3VzZXItc2tpbGxzJywgbmV3IEZvcm1BcnJheShbXSkpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlc0NoZWNrYm94LmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgICh0aGlzLmZvcm0uZ2V0KCd1c2VyLXNraWxscycpIGFzIEZvcm1BcnJheSkucHVzaChuZXcgRm9ybUNvbnRyb2woZmFsc2UpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcHJldlZhbHVlcyA9IHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3gubWFwKHNraWxsID0+IHtcbiAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncyAmJiB0aGlzLnNldHRpbmdzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLnByZXZpb3VzU2VsZWN0ZWROZXN0ZWRDaGVja2JveC5pbmNsdWRlcyhza2lsbC5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGlzU2VsZWN0ZWRVc2VyU2tpbGw6IG51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVXNlclNraWxscyA9IHRoaXMuc2V0dGluZ3MuZmllbGRzLmZpbmQoc2V0dGluZyA9PiBzZXR0aW5nLm5hbWUgPT09ICd1c2VyLXNraWxscycpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVXNlclNraWxscyAmJiBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUgJiYgc2VsZWN0ZWRVc2VyU2tpbGxzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaXNTZWxlY3RlZFVzZXJTa2lsbCA9IHNlbGVjdGVkVXNlclNraWxscy52YWx1ZS5maW5kSW5kZXgodmFsID0+IE51bWJlcih2YWwpID09PSBOdW1iZXIoc2tpbGwua2V5KSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkID0gaXNTZWxlY3RlZFVzZXJTa2lsbCAhPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAvLyBQaWNrIHVwIGZyb20gcHJldmlvdXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLnByZXZpb3VzU2VsZWN0ZWROZXN0ZWRDaGVja2JveC5pbmNsdWRlcyhTdHJpbmcoc2tpbGwua2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd1c2VyLXNraWxscycpLnNldFZhbHVlKHByZXZWYWx1ZXMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlc0NoZWNrYm94O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzID0gdGhpcy5zb3J0R3JvdXBPcHRpb25zKHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzKTtcblxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRWYWx1ZXNGb3JGaWVsZHMoZm9ybVZhbHVlczogYW55LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgT2JqZWN0LmtleXMoZm9ybVZhbHVlcykubWFwKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1WYWx1ZXNbbmFtZV0udmFsdWU7XG4gICAgICBpZiAobmFtZSA9PT0gZmllbGQubmFtZSkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodjogYW55KSA9PiB7XG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMucHVzaCh2LmtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlcztcbiAgfVxuXG4gIHByaXZhdGUgc29ydEdyb3VwT3B0aW9ucyhncm91cE9wdGlvbnM6IEdyb3VwT3B0aW9uc1tdKTogR3JvdXBPcHRpb25zW10ge1xuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHM6IEdyb3VwT3B0aW9uc1tdID0gW107XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBPcHRpb25zLm1hcChnbyA9PiBnby5ncm91cCk7XG4gICAgZ3JvdXBzLnNvcnQoKS5mb3JFYWNoKGcgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdyb3VwT3B0aW9ucy5maW5kKChnbzogYW55KSA9PiBnby5ncm91cCA9PT0gZykub3B0aW9ucztcbiAgICAgIGNvbnN0IHNvcnRlZE9wdGlvbnMgPSBvcHRpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIGEubGFiZWwudG9Mb3dlckNhc2UoKSA+IGIubGFiZWwudG9Mb3dlckNhc2UoKSA/IDEgOiAoYi5sYWJlbC50b0xvd2VyQ2FzZSgpID4gYS5sYWJlbC50b0xvd2VyQ2FzZSgpID8gLTEgOiAwKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBncm91cCA6IGcsXG4gICAgICAgIG9wdGlvbnM6IHNvcnRlZE9wdGlvbnNcbiAgICAgIH07XG4gICAgICBzb3J0ZWRSZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc29ydGVkUmVzdWx0cztcbiAgfVxufVxuIl19