@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,51 +1,36 @@
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
1
  import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
7
2
  import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
8
3
  import { FilterService } from './../../services/filter/filter.service';
9
4
  import { getValues, maxSelectedValidator, minSelectedValidator } from './generic-filter-utils';
10
5
  export class GenericFilterComponent {
11
- /**
12
- * @param {?} filterService
13
- * @param {?} fb
14
- */
15
6
  constructor(filterService, fb) {
16
7
  this.filterService = filterService;
17
8
  this.fb = fb;
18
9
  this.submitted = false;
19
10
  this.previousSelectedNestedCheckbox = [];
11
+ this.clearFormArray = (formArray) => {
12
+ formArray.controls.forEach((el, index) => {
13
+ if (el.value.key === 'All') {
14
+ this.form.get('user-services').removeAt(index);
15
+ }
16
+ });
17
+ };
18
+ this.addAllOption = (field) => {
19
+ if (this.form.get('user-services') && this.form.get('user-services').value.length === 0 && field.minSelected >= 0) {
20
+ this.form.get('user-services').push(new FormControl({ key: 'All', label: 'All' }));
21
+ }
22
+ };
20
23
  }
21
- /**
22
- * @return {?}
23
- */
24
24
  get config() {
25
25
  return this._config;
26
26
  }
27
- /**
28
- * @param {?} value
29
- * @return {?}
30
- */
31
27
  set config(value) {
32
- this._config = Object.assign({}, value, { fields: value.fields.map((/**
33
- * @param {?} field
34
- * @return {?}
35
- */
36
- field => (Object.assign({}, field, { displayMinSelectedError: false, displayMaxSelectedError: false })))) });
28
+ this._config = Object.assign(Object.assign({}, value), { fields: value.fields.map(field => (Object.assign(Object.assign({}, field), { displayMinSelectedError: false, displayMaxSelectedError: false }))) });
37
29
  this._config = value;
38
30
  }
39
- /**
40
- * @return {?}
41
- */
42
31
  get settings() {
43
32
  return this._settings;
44
33
  }
45
- /**
46
- * @param {?} value
47
- * @return {?}
48
- */
49
34
  set settings(value) {
50
35
  if (!value) {
51
36
  this.getSettings();
@@ -55,13 +40,7 @@ export class GenericFilterComponent {
55
40
  }
56
41
  this._settings = value;
57
42
  }
58
- /**
59
- * @private
60
- * @param {?} field
61
- * @return {?}
62
- */
63
43
  static addFormValidators(field) {
64
- /** @type {?} */
65
44
  const validators = [];
66
45
  if (field && field.minSelected > 0) {
67
46
  validators.push(minSelectedValidator(field.minSelected));
@@ -71,9 +50,6 @@ export class GenericFilterComponent {
71
50
  }
72
51
  return validators;
73
52
  }
74
- /**
75
- * @return {?}
76
- */
77
53
  ngOnInit() {
78
54
  if (!this.settings) {
79
55
  this.getSettings();
@@ -83,42 +59,25 @@ export class GenericFilterComponent {
83
59
  if (this._config.copyFields) {
84
60
  this.form = this._config.copyFields(this.form);
85
61
  }
86
- this.formSub = this.form.valueChanges.subscribe((/**
87
- * @return {?}
88
- */
89
- () => this.submitted = false));
62
+ this.formSub = this.form.valueChanges.subscribe(() => this.submitted = false);
90
63
  this.filterSkillsByServices(null, this.config);
91
- /** @type {?} */
92
- const services = this.config.fields.find((/**
93
- * @param {?} field
94
- * @return {?}
95
- */
96
- field => field.name === 'user-services'));
64
+ const services = this.config.fields.find(field => field.name === 'user-services');
97
65
  if (services) {
98
66
  this.startFilterSkillsByServices(this.form, services);
99
67
  this.initValuesFromCacheForSkillsByServices();
100
68
  }
101
69
  }
102
- /**
103
- * @return {?}
104
- */
105
70
  ngOnDestroy() {
106
71
  if (this.formSub) {
107
72
  this.formSub.unsubscribe();
108
73
  }
109
74
  }
110
- /**
111
- * @param {?} field
112
- * @param {?} form
113
- * @return {?}
114
- */
115
75
  hidden(field, form) {
116
76
  if (!field.showCondition) {
117
77
  return false;
118
78
  }
119
79
  if (typeof field.showCondition === 'string') {
120
- /** @type {?} */
121
- const control = (/** @type {?} */ (form.get(field.name)));
80
+ const control = form.get(field.name);
122
81
  const [name, value] = field.showCondition.split('=');
123
82
  if (form.value && form.value[name] === value) {
124
83
  if (field.type === 'find-person') {
@@ -144,18 +103,12 @@ export class GenericFilterComponent {
144
103
  }
145
104
  return true;
146
105
  }
147
- /**
148
- * @param {?} field
149
- * @param {?} form
150
- * @return {?}
151
- */
152
106
  disabled(field, form) {
153
107
  if (!field.enableCondition) {
154
108
  return null;
155
109
  }
156
110
  if (typeof field.enableCondition === 'string') {
157
- /** @type {?} */
158
- const control = (/** @type {?} */ (form.get(field.name)));
111
+ const control = form.get(field.name);
159
112
  const [name, value] = field.enableCondition.split('=');
160
113
  if (form.value && form.value[name] === value) {
161
114
  if (field.type === 'find-person') {
@@ -187,10 +140,6 @@ export class GenericFilterComponent {
187
140
  // Note: field.disable decides whether to actually disable or not
188
141
  return field.disable ? field.disable : null;
189
142
  }
190
- /**
191
- * @param {?} form
192
- * @return {?}
193
- */
194
143
  applyFilter(form) {
195
144
  this.submitted = true;
196
145
  form.markAsTouched();
@@ -201,8 +150,7 @@ export class GenericFilterComponent {
201
150
  fields: this.getSelectedValues(form.value, this.config)
202
151
  };
203
152
  this.filterService.givenErrors.next(null);
204
- /** @type {?} */
205
- const settings = Object.assign({}, this.settings, { reset: false });
153
+ const settings = Object.assign(Object.assign({}, this.settings), { reset: false });
206
154
  this.filterService.persist(settings, this.config.persistence);
207
155
  }
208
156
  else {
@@ -213,11 +161,6 @@ export class GenericFilterComponent {
213
161
  }
214
162
  }
215
163
  // when domain changes ensure that person field is reset
216
- /**
217
- * @param {?} field
218
- * @param {?} form
219
- * @return {?}
220
- */
221
164
  fieldChanged(field, form) {
222
165
  // TODO - Do similar with jurisdiction/service for caseworkers by services
223
166
  if (field.changeResetFields && field.changeResetFields.length) {
@@ -227,31 +170,30 @@ export class GenericFilterComponent {
227
170
  }
228
171
  }
229
172
  // when user enters input change radio button
230
- /**
231
- * @param {?} field
232
- * @return {?}
233
- */
234
173
  inputChanged(field) {
235
- if (field.name === 'user-services') {
236
- /** @type {?} */
237
- const selectedServices = this.getSelectedValuesForFields(this.form.controls, field);
238
- this.filterSkillsByServices(selectedServices, this.config);
239
- }
240
174
  if (field.radioSelectionChange && typeof field.radioSelectionChange === 'string') {
241
175
  const [name, value] = field.enableCondition.split('=');
242
176
  this.form.get(name).patchValue(value);
243
177
  }
244
178
  }
245
- /**
246
- * @return {?}
247
- */
179
+ inputServiceChanged(e, field) {
180
+ if (e === undefined) {
181
+ this.addAllOption(field);
182
+ }
183
+ else {
184
+ this.clearFormArray(this.form.get('user-services'));
185
+ }
186
+ if (field.name === 'user-services') {
187
+ const selectedServices = this.getSelectedValuesForFields(this.form.controls, field);
188
+ this.filterSkillsByServices(selectedServices, this.config);
189
+ }
190
+ }
248
191
  cancelFilter() {
249
192
  this.buildForm(this.config, this.settings, true);
250
193
  if (this.config && this.config.cancelSetting) {
251
194
  this._settings.fields = JSON.parse(JSON.stringify(this.config.cancelSetting.fields));
252
195
  }
253
- /** @type {?} */
254
- const settings = Object.assign({}, this.settings, { reset: true });
196
+ const settings = Object.assign(Object.assign({}, this.settings), { reset: true });
255
197
  this.filterService.persist(settings, this.config.persistence);
256
198
  this.filterService.givenErrors.next(null);
257
199
  this.submitted = false;
@@ -259,13 +201,7 @@ export class GenericFilterComponent {
259
201
  this.config.cancelButtonCallback();
260
202
  }
261
203
  }
262
- /**
263
- * @param {?} values
264
- * @param {?} field
265
- * @return {?}
266
- */
267
204
  updatePersonControls(values, field) {
268
- /** @type {?} */
269
205
  let keys;
270
206
  if (!values) {
271
207
  keys = Object.keys(this.form.get(field.name).value);
@@ -275,105 +211,54 @@ export class GenericFilterComponent {
275
211
  }
276
212
  for (const key of keys) {
277
213
  if (this.form.get(field.name) && this.form.get(field.name).get(key)) {
278
- /** @type {?} */
279
214
  const value = values && values[key] ? values[key] : null;
280
215
  this.form.get(field.name).get(key).patchValue(value);
281
216
  }
282
217
  }
283
218
  }
284
- /**
285
- * @param {?} field
286
- * @param {?} i
287
- * @return {?}
288
- */
289
219
  checkBoxChecked(field, i) {
290
- return ((/** @type {?} */ (this.form.get(field.name))))['controls'][i]['value'];
220
+ return this.form.get(field.name)['controls'][i]['value'];
291
221
  }
292
- /**
293
- * @param {?} values
294
- * @param {?} field
295
- * @return {?}
296
- */
297
222
  updateTaskNameControls(values, field) {
298
223
  this.form.get(field.name).patchValue(values);
299
224
  }
300
- /**
301
- * @param {?} event
302
- * @param {?} form
303
- * @param {?} item
304
- * @param {?} field
305
- * @return {?}
306
- */
307
225
  toggleSelectAll(event, form, item, field) {
308
- /** @type {?} */
309
226
  const isChecked = event.target.checked;
310
- /** @type {?} */
311
- const formArray = (/** @type {?} */ (form.get(field.name)));
227
+ const formArray = form.get(field.name);
312
228
  if (!item.selectAll) {
313
- /** @type {?} */
314
- const allChecked = formArray.controls.every((/**
315
- * @param {?} control
316
- * @return {?}
317
- */
318
- (control) => control.value));
319
- /** @type {?} */
229
+ const allChecked = formArray.controls.every((control) => control.value);
320
230
  let index = null;
321
- /** @type {?} */
322
- const hasSelectAllOption = field.options.find((/**
323
- * @param {?} option
324
- * @param {?} i
325
- * @return {?}
326
- */
327
- (option, i) => {
231
+ const hasSelectAllOption = field.options.find((option, i) => {
328
232
  if (option.hasOwnProperty('selectAll')) {
329
233
  index = i;
330
234
  return true;
331
235
  }
332
236
  return false;
333
- }));
237
+ });
334
238
  // tslint:disable-next-line:variable-name
335
- /** @type {?} */
336
- const isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((/**
337
- * @param {?} _control
338
- * @param {?} i
339
- * @return {?}
340
- */
341
- (_control, i) => i !== index))
342
- .every((/**
343
- * @param {?} control
344
- * @return {?}
345
- */
346
- (control) => control.value));
239
+ const isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((_control, i) => i !== index)
240
+ .every((control) => control.value);
347
241
  if (!allChecked && hasSelectAllOption && !isChecked) {
348
- formArray.controls.forEach((/**
349
- * @param {?} control
350
- * @param {?} i
351
- * @return {?}
352
- */
353
- (control, i) => {
242
+ formArray.controls.forEach((control, i) => {
354
243
  if (index === i) {
355
244
  control.patchValue(false);
356
245
  return;
357
246
  }
358
- }));
247
+ });
359
248
  }
360
249
  else if (hasSelectAllOption && !allChecked && isChecked && isAllCheckedExcludingTheSelectAllOption) {
361
250
  formArray.controls[index].patchValue(true);
362
251
  }
363
252
  }
364
253
  else {
365
- formArray.controls.forEach((/**
366
- * @param {?} control
367
- * @return {?}
368
- */
369
- (control) => {
254
+ formArray.controls.forEach((control) => {
370
255
  if (isChecked) {
371
256
  control.patchValue(true);
372
257
  }
373
258
  else {
374
259
  control.patchValue(false);
375
260
  }
376
- }));
261
+ });
377
262
  }
378
263
  if (field.changeResetFields && field.changeResetFields.length) {
379
264
  for (const resetField of field.changeResetFields) {
@@ -385,20 +270,13 @@ export class GenericFilterComponent {
385
270
  }
386
271
  else if (field.name === 'user-skills') {
387
272
  if (isChecked) {
388
- /** @type {?} */
389
- const selectedIndex = field.options.findIndex((/**
390
- * @param {?} option
391
- * @return {?}
392
- */
393
- option => Number(option.key) === Number(event.target.value)));
394
- /** @type {?} */
273
+ const selectedIndex = field.options.findIndex(option => Number(option.key) === Number(event.target.value));
395
274
  const selectedCheckbox = this.form.get('user-skills').value;
396
275
  selectedCheckbox[selectedIndex] = true;
397
276
  this.form.get('user-skills').setValue(selectedCheckbox);
398
277
  this.previousSelectedNestedCheckbox.push(event.target.value);
399
278
  }
400
279
  else {
401
- /** @type {?} */
402
280
  const index = this.previousSelectedNestedCheckbox.indexOf(event.target.value);
403
281
  if (index !== -1) {
404
282
  this.previousSelectedNestedCheckbox.splice(index, 1);
@@ -406,65 +284,34 @@ export class GenericFilterComponent {
406
284
  }
407
285
  }
408
286
  }
409
- /**
410
- * @private
411
- * @param {?} form
412
- * @param {?} field
413
- * @return {?}
414
- */
415
287
  startFilterSkillsByServices(form, field) {
416
- /** @type {?} */
417
288
  const servicesArray = [];
418
- form.value[field.name].map((/**
419
- * @param {?} service
420
- * @param {?} index
421
- * @return {?}
422
- */
423
- (service, index) => {
289
+ form.value[field.name].map((service, index) => {
424
290
  if (service) {
425
291
  servicesArray.push(field.options[index].key);
426
292
  }
427
- }));
293
+ });
428
294
  this.filterSkillsByServices(servicesArray, this.config);
429
295
  }
430
- /**
431
- * @private
432
- * @param {?} resetField
433
- * @param {?} form
434
- * @return {?}
435
- */
436
296
  resetField(resetField, form) {
437
- /** @type {?} */
438
297
  const control = form.get(resetField);
439
- /** @type {?} */
440
- const defaultValue = this.config.cancelSetting.fields.find((/**
441
- * @param {?} f
442
- * @return {?}
443
- */
444
- (f) => f.name === resetField));
298
+ const defaultValue = this.config.cancelSetting.fields.find((f) => f.name === resetField);
445
299
  if (control instanceof FormArray) {
446
300
  for (let i = 0; i < control.length; i++) {
447
301
  control.removeAt(i);
448
302
  }
449
303
  }
450
304
  else if (control instanceof FormGroup) {
451
- /** @type {?} */
452
305
  const keys = Object.keys(control.value);
453
306
  for (const key of keys) {
454
307
  this.resetField(key, control);
455
308
  }
456
309
  }
457
310
  else if (control instanceof FormControl) {
458
- /** @type {?} */
459
311
  const value = defaultValue && defaultValue.value && defaultValue.value.length ? defaultValue.value[0] : null;
460
312
  control.setValue(value);
461
313
  }
462
314
  }
463
- /**
464
- * @private
465
- * @param {?} filter
466
- * @return {?}
467
- */
468
315
  mergeDefaultFields(filter) {
469
316
  if (filter) {
470
317
  filter.fields = this.filterService.get(this.config.id) ? this.filterService.get(this.config.id).fields : filter.fields;
@@ -476,22 +323,10 @@ export class GenericFilterComponent {
476
323
  };
477
324
  }
478
325
  }
479
- /**
480
- * @private
481
- * @return {?}
482
- */
483
326
  getSettings() {
484
327
  this._settings = this.filterService.get(this.config.id);
485
328
  }
486
- /**
487
- * @private
488
- * @param {?} config
489
- * @param {?} settings
490
- * @param {?=} reset
491
- * @return {?}
492
- */
493
329
  buildForm(config, settings, reset) {
494
- /** @type {?} */
495
330
  const findPersonControl = this.form ? this.form.get('findPersonControl') : null;
496
331
  this.form = this.fb.group({});
497
332
  if (findPersonControl) {
@@ -500,17 +335,15 @@ export class GenericFilterComponent {
500
335
  }
501
336
  for (const field of config.fields) {
502
337
  if (field.type === 'checkbox' || field.type === 'checkbox-large' || field.type === 'nested-checkbox') {
503
- /** @type {?} */
504
338
  const formArray = this.buildCheckBoxFormArray(field, settings);
505
339
  this.form.addControl(field.name, formArray);
506
340
  }
507
341
  else if (field.type === 'find-location' || field.type === 'find-service') {
508
- /** @type {?} */
509
342
  const formArray = this.buildFormArray(field, settings);
510
343
  this.form.addControl(field.name, formArray);
344
+ this.addAllOption(field);
511
345
  }
512
346
  else {
513
- /** @type {?} */
514
347
  const validators = [];
515
348
  if (field.minSelected && field.minSelected > 0) {
516
349
  validators.push(Validators.required);
@@ -521,29 +354,17 @@ export class GenericFilterComponent {
521
354
  validators.push(Validators.email);
522
355
  }
523
356
  }
524
- /** @type {?} */
525
357
  let defaultValue = null;
526
358
  if (reset && config.cancelSetting) {
527
- /** @type {?} */
528
- const cancelField = config.cancelSetting.fields.find((/**
529
- * @param {?} f
530
- * @return {?}
531
- */
532
- (f) => f.name === field.name));
359
+ const cancelField = config.cancelSetting.fields.find((f) => f.name === field.name);
533
360
  defaultValue = cancelField && cancelField.value ? cancelField.value[0] : '';
534
361
  }
535
362
  else if (settings && settings.fields) {
536
- /** @type {?} */
537
- const lastSavedValue = settings.fields.find((/**
538
- * @param {?} f
539
- * @return {?}
540
- */
541
- (f) => f.name === field.name));
363
+ const lastSavedValue = settings.fields.find((f) => f.name === field.name);
542
364
  defaultValue = lastSavedValue && lastSavedValue ? lastSavedValue.value[0] : '';
543
365
  }
544
366
  // if field is find-person build a form group;
545
367
  if (field.type === 'find-person') {
546
- /** @type {?} */
547
368
  const formGroup = new FormGroup({
548
369
  domain: new FormControl(defaultValue && defaultValue.hasOwnProperty('domain') ? defaultValue.domain : ''),
549
370
  email: new FormControl(defaultValue && defaultValue.hasOwnProperty('email') ? defaultValue.email : '', validators),
@@ -554,7 +375,6 @@ export class GenericFilterComponent {
554
375
  this.form.addControl(field.name, formGroup);
555
376
  }
556
377
  else if (field.type !== 'group-title') {
557
- /** @type {?} */
558
378
  const control = new FormControl(defaultValue, validators);
559
379
  this.form.addControl(field.name, control);
560
380
  }
@@ -565,59 +385,28 @@ export class GenericFilterComponent {
565
385
  }
566
386
  }
567
387
  }
568
- /**
569
- * @private
570
- * @param {?} field
571
- * @param {?} settings
572
- * @return {?}
573
- */
574
388
  buildCheckBoxFormArray(field, settings) {
575
- /** @type {?} */
576
389
  const validators = GenericFilterComponent.addFormValidators(field);
577
- /** @type {?} */
578
390
  const formArray = this.fb.array([], validators);
579
- /** @type {?} */
580
391
  let defaultValues;
581
392
  if (settings && settings.fields) {
582
- defaultValues = settings.fields.find((/**
583
- * @param {?} f
584
- * @return {?}
585
- */
586
- (f) => f.name === field.name));
393
+ defaultValues = settings.fields.find((f) => f.name === field.name);
587
394
  }
588
395
  for (const option of field.options) {
589
- /** @type {?} */
590
396
  let checked = false;
591
397
  if (defaultValues && Array.isArray(defaultValues.value)) {
592
- checked = !!defaultValues.value.find((/**
593
- * @param {?} value
594
- * @return {?}
595
- */
596
- (value) => value === option.key));
398
+ checked = !!defaultValues.value.find((value) => value === option.key);
597
399
  }
598
400
  formArray.push(new FormControl(checked));
599
401
  }
600
402
  return formArray;
601
403
  }
602
- /**
603
- * @private
604
- * @param {?} field
605
- * @param {?} settings
606
- * @return {?}
607
- */
608
404
  buildFormArray(field, settings) {
609
- /** @type {?} */
610
405
  const validators = GenericFilterComponent.addFormValidators(field);
611
- /** @type {?} */
612
406
  const formArray = this.fb.array([], validators);
613
- /** @type {?} */
614
407
  let defaultValues;
615
408
  if (settings && settings.fields) {
616
- defaultValues = settings.fields.find((/**
617
- * @param {?} f
618
- * @return {?}
619
- */
620
- (f) => f.name === field.name));
409
+ defaultValues = settings.fields.find((f) => f.name === field.name);
621
410
  if (defaultValues && defaultValues.value && defaultValues.value.length > 0) {
622
411
  for (const defaultValue of defaultValues.value) {
623
412
  formArray.push(new FormControl(defaultValue));
@@ -626,27 +415,11 @@ export class GenericFilterComponent {
626
415
  }
627
416
  return formArray;
628
417
  }
629
- /**
630
- * @private
631
- * @param {?} formValues
632
- * @param {?} config
633
- * @return {?}
634
- */
635
418
  getSelectedValues(formValues, config) {
636
- return Object.keys(formValues).map((/**
637
- * @param {?} name
638
- * @return {?}
639
- */
640
- (name) => {
641
- /** @type {?} */
419
+ return Object.keys(formValues).map((name) => {
642
420
  const values = formValues[name];
643
421
  if (Array.isArray(values)) {
644
- /** @type {?} */
645
- const field = config.fields.find((/**
646
- * @param {?} f
647
- * @return {?}
648
- */
649
- f => f.name === name));
422
+ const field = config.fields.find(f => f.name === name);
650
423
  if (field.type === 'find-location' || field.type === 'find-service') {
651
424
  return { value: values, name };
652
425
  }
@@ -657,18 +430,11 @@ export class GenericFilterComponent {
657
430
  else {
658
431
  return { value: [values], name };
659
432
  }
660
- }));
433
+ });
661
434
  }
662
- /**
663
- * @private
664
- * @param {?} form
665
- * @return {?}
666
- */
667
435
  emitFormErrors(form) {
668
- /** @type {?} */
669
436
  let errors = [];
670
437
  for (const field of this.config.fields) {
671
- /** @type {?} */
672
438
  const formGroup = form.get(field.name);
673
439
  if (formGroup && formGroup.errors && (formGroup.errors.minlength || formGroup.errors.required)) {
674
440
  errors.push({ name: field.name, error: field.minSelectedError });
@@ -678,174 +444,84 @@ export class GenericFilterComponent {
678
444
  }
679
445
  }
680
446
  // remove duplicates
681
- errors = errors.filter((/**
682
- * @param {?} filterError
683
- * @param {?} i
684
- * @param {?} arr
685
- * @return {?}
686
- */
687
- (filterError, i, arr) => {
688
- return errors.indexOf(arr.find((/**
689
- * @param {?} item
690
- * @return {?}
691
- */
692
- item => item.name === filterError.name))) === i;
693
- }));
447
+ errors = errors.filter((filterError, i, arr) => {
448
+ return errors.indexOf(arr.find(item => item.name === filterError.name)) === i;
449
+ });
694
450
  if (errors.length) {
695
451
  this.filterService.givenErrors.next(errors);
696
452
  }
697
453
  }
698
- /**
699
- * @return {?}
700
- */
701
454
  initValuesFromCacheForSkillsByServices() {
702
- /** @type {?} */
703
- const cachedValues = this.filteredSkillsByServicesCheckbox.map((/**
704
- * @param {?} skill
705
- * @return {?}
706
- */
707
- skill => {
708
- /** @type {?} */
709
- let selected = false;
710
- if (this.settings && this.settings.fields) {
711
- /** @type {?} */
455
+ if (this.settings && this.settings.fields) {
456
+ const cachedValues = this.filteredSkillsByServicesCheckbox.map(skill => {
457
+ let selected = false;
712
458
  let isSelectedUserSkill;
713
- /** @type {?} */
714
- const selectedUserSkills = this.settings.fields.find((/**
715
- * @param {?} setting
716
- * @return {?}
717
- */
718
- setting => setting.name === 'user-skills'));
459
+ const selectedUserSkills = this.settings.fields.find(setting => setting.name === 'user-skills');
719
460
  if (selectedUserSkills && selectedUserSkills.value && selectedUserSkills.value.length > 0) {
720
- isSelectedUserSkill = selectedUserSkills.value.findIndex((/**
721
- * @param {?} val
722
- * @return {?}
723
- */
724
- val => {
461
+ isSelectedUserSkill = selectedUserSkills.value.findIndex(val => {
725
462
  return String(val) === String(skill.key);
726
- }));
463
+ });
727
464
  selected = isSelectedUserSkill !== -1;
728
465
  }
466
+ return selected;
467
+ });
468
+ if (cachedValues.length > 0) {
469
+ this.form.get('user-skills').setValue(cachedValues);
729
470
  }
730
- return selected;
731
- }));
732
- this.form.get('user-skills').setValue(cachedValues);
733
- }
734
- /**
735
- * @param {?} services
736
- * @param {?} config
737
- * @return {?}
738
- */
471
+ }
472
+ }
739
473
  filterSkillsByServices(services, config) {
740
474
  this.filteredSkillsByServices = [];
741
475
  this.filteredSkillsByServicesCheckbox = [];
742
- /** @type {?} */
743
- const userSkillsSelectField = config.fields.find((/**
744
- * @param {?} f
745
- * @return {?}
746
- */
747
- f => f.name === 'user-skills' && f.type === 'group-select'));
748
- /** @type {?} */
749
- const userSkillsCheckboxField = config.fields.find((/**
750
- * @param {?} f
751
- * @return {?}
752
- */
753
- f => f.name === 'user-skills' && f.type === 'nested-checkbox'));
476
+ const userSkillsSelectField = config.fields.find(f => f.name === 'user-skills' && f.type === 'group-select');
477
+ const userSkillsCheckboxField = config.fields.find(f => f.name === 'user-skills' && f.type === 'nested-checkbox');
754
478
  if (userSkillsSelectField) {
755
- /** @type {?} */
756
479
  const userSkills = userSkillsSelectField.groupOptions;
757
480
  if (!services || services.length === 0) {
758
481
  this.filteredSkillsByServices = userSkills;
759
482
  }
760
483
  else {
761
- services.forEach((/**
762
- * @param {?} s
763
- * @return {?}
764
- */
765
- s => {
766
- /** @type {?} */
767
- const groupOption = userSkills.find((/**
768
- * @param {?} u
769
- * @return {?}
770
- */
771
- u => u.group.toLowerCase() === s.toLowerCase()));
484
+ services.forEach(s => {
485
+ const groupOption = userSkills.find(u => u.group.toLowerCase() === s.toLowerCase());
772
486
  if (groupOption) {
773
487
  this.filteredSkillsByServices.push(groupOption);
774
488
  }
775
- }));
489
+ });
776
490
  }
777
491
  }
778
492
  else if (userSkillsCheckboxField) {
779
- /** @type {?} */
780
493
  const userSkills = userSkillsCheckboxField.groupOptions;
781
494
  if (!services || services.length === 0) {
782
495
  this.filteredSkillsByServices = userSkills;
783
496
  }
784
497
  else {
785
- services.forEach((/**
786
- * @param {?} s
787
- * @return {?}
788
- */
789
- s => {
790
- /** @type {?} */
791
- const groupOption = userSkills.find((/**
792
- * @param {?} u
793
- * @return {?}
794
- */
795
- u => u.group.toLowerCase() === s.toLowerCase()));
498
+ services.forEach(s => {
499
+ const groupOption = userSkills.find(u => u.group.toLowerCase() === s.toLowerCase());
796
500
  if (groupOption) {
797
501
  this.filteredSkillsByServices.push(groupOption);
798
502
  }
799
- }));
800
- this.filteredSkillsByServicesCheckbox = this.filteredSkillsByServices.map((/**
801
- * @param {?} skill
802
- * @return {?}
803
- */
804
- skill => {
503
+ });
504
+ this.filteredSkillsByServicesCheckbox = this.filteredSkillsByServices.map(skill => {
805
505
  return skill.options;
806
- })).reduce((/**
807
- * @param {?} a
808
- * @param {?} b
809
- * @return {?}
810
- */
811
- (a, b) => {
506
+ }).reduce((a, b) => {
812
507
  return a.concat(b);
813
- }), []);
508
+ }, []);
814
509
  userSkillsCheckboxField.options = [];
815
510
  userSkillsCheckboxField.options = this.filteredSkillsByServicesCheckbox;
816
511
  this.form.setControl('user-skills', new FormArray([]));
817
- this.filteredSkillsByServicesCheckbox.forEach((/**
818
- * @return {?}
819
- */
820
- () => {
821
- ((/** @type {?} */ (this.form.get('user-skills')))).push(new FormControl(false));
822
- }));
823
- /** @type {?} */
824
- const prevValues = this.filteredSkillsByServicesCheckbox.map((/**
825
- * @param {?} skill
826
- * @return {?}
827
- */
828
- skill => {
829
- /** @type {?} */
512
+ this.filteredSkillsByServicesCheckbox.forEach(() => {
513
+ this.form.get('user-skills').push(new FormControl(false));
514
+ });
515
+ const prevValues = this.filteredSkillsByServicesCheckbox.map(skill => {
830
516
  let selected = false;
831
517
  if (this.settings && this.settings.fields) {
832
518
  if (this.previousSelectedNestedCheckbox.length > 0) {
833
519
  selected = this.previousSelectedNestedCheckbox.includes(skill.key);
834
520
  }
835
- /** @type {?} */
836
521
  let isSelectedUserSkill;
837
- /** @type {?} */
838
- const selectedUserSkills = this.settings.fields.find((/**
839
- * @param {?} setting
840
- * @return {?}
841
- */
842
- setting => setting.name === 'user-skills'));
522
+ const selectedUserSkills = this.settings.fields.find(setting => setting.name === 'user-skills');
843
523
  if (selectedUserSkills && selectedUserSkills.value && selectedUserSkills.value.length > 0) {
844
- isSelectedUserSkill = selectedUserSkills.value.findIndex((/**
845
- * @param {?} val
846
- * @return {?}
847
- */
848
- val => Number(val) === Number(skill.key)));
524
+ isSelectedUserSkill = selectedUserSkills.value.findIndex(val => Number(val) === Number(skill.key));
849
525
  selected = isSelectedUserSkill !== -1;
850
526
  }
851
527
  if (this.previousSelectedNestedCheckbox.length > 0) {
@@ -854,7 +530,7 @@ export class GenericFilterComponent {
854
530
  }
855
531
  }
856
532
  return selected;
857
- }));
533
+ });
858
534
  this.form.get('user-skills').setValue(prevValues);
859
535
  return this.filteredSkillsByServicesCheckbox;
860
536
  }
@@ -862,88 +538,44 @@ export class GenericFilterComponent {
862
538
  this.filteredSkillsByServices = this.sortGroupOptions(this.filteredSkillsByServices);
863
539
  return this.filteredSkillsByServices;
864
540
  }
865
- /**
866
- * @private
867
- * @param {?} formValues
868
- * @param {?} field
869
- * @return {?}
870
- */
871
541
  getSelectedValuesForFields(formValues, field) {
872
- /** @type {?} */
873
542
  const selectedValues = [];
874
- Object.keys(formValues).map((/**
875
- * @param {?} name
876
- * @return {?}
877
- */
878
- (name) => {
879
- /** @type {?} */
543
+ Object.keys(formValues).map((name) => {
880
544
  const values = formValues[name].value;
881
545
  if (name === field.name) {
882
- values.forEach((/**
883
- * @param {?} v
884
- * @return {?}
885
- */
886
- (v) => {
546
+ values.forEach((v) => {
887
547
  selectedValues.push(v.key);
888
- }));
548
+ });
889
549
  }
890
- }));
550
+ });
891
551
  return selectedValues;
892
552
  }
893
- /**
894
- * @private
895
- * @param {?} groupOptions
896
- * @return {?}
897
- */
898
553
  sortGroupOptions(groupOptions) {
899
- /** @type {?} */
900
554
  const sortedResults = [];
901
- /** @type {?} */
902
- const groups = groupOptions.map((/**
903
- * @param {?} go
904
- * @return {?}
905
- */
906
- go => go.group));
907
- groups.sort().forEach((/**
908
- * @param {?} g
909
- * @return {?}
910
- */
911
- g => {
912
- /** @type {?} */
913
- const options = groupOptions.find((/**
914
- * @param {?} go
915
- * @return {?}
916
- */
917
- (go) => go.group === g)).options;
918
- /** @type {?} */
919
- const sortedOptions = options.sort((/**
920
- * @param {?} a
921
- * @param {?} b
922
- * @return {?}
923
- */
924
- (a, b) => {
555
+ const groups = groupOptions.map(go => go.group);
556
+ groups.sort().forEach(g => {
557
+ const options = groupOptions.find((go) => go.group === g).options;
558
+ const sortedOptions = options.sort((a, b) => {
925
559
  return a.label.toLowerCase() > b.label.toLowerCase() ? 1 : (b.label.toLowerCase() > a.label.toLowerCase() ? -1 : 0);
926
- }));
927
- /** @type {?} */
560
+ });
928
561
  const result = {
929
562
  group: g,
930
563
  options: sortedOptions
931
564
  };
932
565
  sortedResults.push(result);
933
- }));
566
+ });
934
567
  return sortedResults;
935
568
  }
936
569
  }
937
570
  GenericFilterComponent.decorators = [
938
571
  { type: Component, args: [{
939
572
  selector: 'xuilib-generic-filter',
940
- 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",
573
+ 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_' + field.name + item.key\"\n [name]=\"'checkbox_' + field.name + item.key\"\n />\n <label\n [for]=\"'checkbox_' + field.name + 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_' + field.name + item.key\"\n [name]=\"'checkbox_' + field.name + item.key\"\n />\n <label\n [for]=\"'checkbox_' + field.name + 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_' + field.name + item.key\"\n [name]=\"'checkbox_' + field.name + item.key\"\n />\n <label\n [for]=\"'checkbox_' + field.name + 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 [services]=\"form.get(field.servicesField)?.value\"\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 [field]=\"field\"\n [services]=\"form.get(field.findLocationField)?.value\"\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)=\"inputServiceChanged($event, field)\"\n [form]=\"form\"\n [fields]=\"config.fields\"\n [title]=\"field.title\"\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 [readonly]=\"field.readonly\"\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 [readonly]=\"field.readonly\"\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",
941
574
  changeDetection: ChangeDetectionStrategy.OnPush,
942
575
  encapsulation: ViewEncapsulation.None,
943
576
  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%}"]
944
- }] }
577
+ },] }
945
578
  ];
946
- /** @nocollapse */
947
579
  GenericFilterComponent.ctorParameters = () => [
948
580
  { type: FilterService },
949
581
  { type: FormBuilder }
@@ -952,38 +584,4 @@ GenericFilterComponent.propDecorators = {
952
584
  config: [{ type: Input }],
953
585
  settings: [{ type: Input }]
954
586
  };
955
- if (false) {
956
- /** @type {?} */
957
- GenericFilterComponent.prototype.form;
958
- /** @type {?} */
959
- GenericFilterComponent.prototype.submitted;
960
- /** @type {?} */
961
- GenericFilterComponent.prototype.formSub;
962
- /** @type {?} */
963
- GenericFilterComponent.prototype.filteredSkillsByServices;
964
- /** @type {?} */
965
- GenericFilterComponent.prototype.filteredSkillsByServicesCheckbox;
966
- /** @type {?} */
967
- GenericFilterComponent.prototype.previousSelectedNestedCheckbox;
968
- /**
969
- * @type {?}
970
- * @private
971
- */
972
- GenericFilterComponent.prototype._config;
973
- /**
974
- * @type {?}
975
- * @private
976
- */
977
- GenericFilterComponent.prototype._settings;
978
- /**
979
- * @type {?}
980
- * @private
981
- */
982
- GenericFilterComponent.prototype.filterService;
983
- /**
984
- * @type {?}
985
- * @private
986
- */
987
- GenericFilterComponent.prototype.fb;
988
- }
989
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQW1CLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcxSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUy9GLE1BQU0sT0FBTyxzQkFBc0I7Ozs7O0lBUWpDLFlBQTZCLGFBQTRCLEVBQW1CLEVBQWU7UUFBOUQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBbUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQU5wRixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBSWxCLG1DQUE4QixHQUFhLEVBQUUsQ0FBQztJQUdyRCxDQUFDOzs7O0lBS0QsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRUQsSUFDVyxNQUFNLENBQUMsS0FBbUI7UUFDbkMsSUFBSSxDQUFDLE9BQU8scUJBQ1AsS0FBSyxJQUNSLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUc7Ozs7WUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLG1CQUM3QixLQUFLLElBQ1IsdUJBQXVCLEVBQUUsS0FBSyxFQUM5Qix1QkFBdUIsRUFBRSxLQUFLLElBQzlCLEVBQUMsR0FD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RDs7Ozs7SUFNckQseUNBQThCOzs7OztJQW9COUIsMkNBQWtDOzs7OztJQXhCdEIsK0NBQTZDOzs7OztJQUFFLG9DQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRmlsdGVyQ29uZmlnT3B0aW9uLCBGaWx0ZXJFcnJvciwgRmlsdGVyRmllbGRDb25maWcsIEZpbHRlclNldHRpbmcsIEdyb3VwT3B0aW9ucyB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9maWx0ZXIvZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VmFsdWVzLCBtYXhTZWxlY3RlZFZhbGlkYXRvciwgbWluU2VsZWN0ZWRWYWxpZGF0b3IgfSBmcm9tICcuL2dlbmVyaWMtZmlsdGVyLXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneHVpbGliLWdlbmVyaWMtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICdnZW5lcmljLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydnZW5lcmljLWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgc3VibWl0dGVkID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JtU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBmaWx0ZXJlZFNraWxsc0J5U2VydmljZXM6IEdyb3VwT3B0aW9uc1tdO1xuICBwdWJsaWMgZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3g6IEZpbHRlckNvbmZpZ09wdGlvbltdO1xuICBwdWJsaWMgcHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94OiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2NvbmZpZzogRmlsdGVyQ29uZmlnO1xuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IEZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBGaWx0ZXJDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGZpZWxkczogdmFsdWUuZmllbGRzLm1hcChmaWVsZCA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgZGlzcGxheU1pblNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TWF4U2VsZWN0ZWRFcnJvcjogZmFsc2UsXG4gICAgICB9KSlcbiAgICB9O1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfc2V0dGluZ3M/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
587
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh1aS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9nZW5lcmljLWZpbHRlci9nZW5lcmljLWZpbHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFTL0YsTUFBTSxPQUFPLHNCQUFzQjtJQVFqQyxZQUE2QixhQUE0QixFQUFtQixFQUFlO1FBQTlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQW1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFOcEYsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUlsQixtQ0FBOEIsR0FBYSxFQUFFLENBQUM7UUFrbEJwQyxtQkFBYyxHQUFHLENBQUMsU0FBb0IsRUFBRSxFQUFFO1lBQ3pELFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRTtvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvRDtZQUNILENBQUMsQ0FBQyxDQUFDO1FB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QUNILE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7OztZQTdsQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLHk5WUFBNEM7Z0JBRTVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDdEM7OztZQVRRLGFBQWE7WUFIZSxXQUFXOzs7cUJBK0I3QyxLQUFLO3VCQW9CTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGaWx0ZXJDb25maWdPcHRpb24sIEZpbHRlckVycm9yLCBGaWx0ZXJGaWVsZENvbmZpZywgRmlsdGVyU2V0dGluZywgR3JvdXBPcHRpb25zIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2ZpbHRlci9maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRWYWx1ZXMsIG1heFNlbGVjdGVkVmFsaWRhdG9yLCBtaW5TZWxlY3RlZFZhbGlkYXRvciB9IGZyb20gJy4vZ2VuZXJpYy1maWx0ZXItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWlsaWItZ2VuZXJpYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1TdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlczogR3JvdXBPcHRpb25zW107XG4gIHB1YmxpYyBmaWx0ZXJlZFNraWxsc0J5U2VydmljZXNDaGVja2JveDogRmlsdGVyQ29uZmlnT3B0aW9uW107XG4gIHB1YmxpYyBwcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3g6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcikge1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfY29uZmlnOiBGaWx0ZXJDb25maWc7XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogRmlsdGVyQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjb25maWcodmFsdWU6IEZpbHRlckNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZmllbGRzOiB2YWx1ZS5maWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICAgIC4uLmZpZWxkLFxuICAgICAgICBkaXNwbGF5TWluU2VsZWN0ZWRFcnJvcjogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlNYXhTZWxlY3RlZEVycm9yOiBmYWxzZSxcbiAgICAgIH0pKVxuICAgIH07XG4gICAgdGhpcy5fY29uZmlnID0gdmFsdWU7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9zZXR0aW5ncz86IEZpbHRlclNldHRpbmc7XG5cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBGaWx0ZXJTZXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNldHRpbmdzKHZhbHVlOiBGaWx0ZXJTZXR0aW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuZmllbGRzKSB7XG4gICAgICB0aGlzLm1lcmdlRGVmYXVsdEZpZWxkcyh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX3NldHRpbmdzID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhZGRGb3JtVmFsaWRhdG9ycyhmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiBWYWxpZGF0b3JzIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLm1pblNlbGVjdGVkID4gMCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1pblNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1pblNlbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLm1heFNlbGVjdGVkID4gMCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1heFNlbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHRoaXMuc2V0dGluZ3MpO1xuICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMuY29uZmlnLCB0aGlzLnNldHRpbmdzKTtcblxuICAgIGlmICh0aGlzLl9jb25maWcuY29weUZpZWxkcykge1xuICAgICAgdGhpcy5mb3JtID0gdGhpcy5fY29uZmlnLmNvcHlGaWVsZHModGhpcy5mb3JtKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1TdWIgPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlKTtcbiAgICB0aGlzLmZpbHRlclNraWxsc0J5U2VydmljZXMobnVsbCwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gdGhpcy5jb25maWcuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3VzZXItc2VydmljZXMnKTtcbiAgICBpZiAoc2VydmljZXMpIHtcbiAgICAgIHRoaXMuc3RhcnRGaWx0ZXJTa2lsbHNCeVNlcnZpY2VzKHRoaXMuZm9ybSwgc2VydmljZXMpO1xuICAgICAgdGhpcy5pbml0VmFsdWVzRnJvbUNhY2hlRm9yU2tpbGxzQnlTZXJ2aWNlcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtU3ViKSB7XG4gICAgICB0aGlzLmZvcm1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGlkZGVuKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5zaG93Q29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmllbGQuc2hvd0NvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5zaG93Q29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5lbmFibGVDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLmVuYWJsZUNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5lbmFibGVDb25kaXRpb24uc3BsaXQoJz0nKTtcbiAgICAgIGlmIChmb3JtLnZhbHVlICYmIGZvcm0udmFsdWVbbmFtZV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBmaW5kLWxvY2F0aW9uIGlzIHNwZWNpYWwgY2FzZSB3aGVyZSBuZWVkIHRvIHJlc2V0IHRleHRib3ggKGJ5IGV4aXN0aW5nIGRpc2FibGluZyBmdW5jdGlvbmFsaXR5KVxuICAgIC8vIGZpZWxkLmRpc2FibGUgcmVmZXJyZWQgdG8gY29tcG9uZW50IGl0c2VsZlxuICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1sb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBOb3RlOiBmaWVsZC5kaXNhYmxlIGRlY2lkZXMgd2hldGhlciB0byBhY3R1YWxseSBkaXNhYmxlIG9yIG5vdFxuICAgIHJldHVybiBmaWVsZC5kaXNhYmxlID8gZmllbGQuZGlzYWJsZSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXIoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGZvcm0ubWFya0FzVG91Y2hlZCgpO1xuICAgIGlmIChmb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICBpZGFtSWQ6IHRoaXMuZmlsdGVyU2VydmljZS5nZXRVc2VySWQoKSxcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldFNlbGVjdGVkVmFsdWVzKGZvcm0udmFsdWUsIHRoaXMuY29uZmlnKVxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7Li4udGhpcy5zZXR0aW5ncywgcmVzZXQ6IGZhbHNlfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5wZXJzaXN0KHNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdEZvcm1FcnJvcnMoZm9ybSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hcHBseUJ1dHRvbkNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9jb25maWcuYXBwbHlCdXR0b25DYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHdoZW4gZG9tYWluIGNoYW5nZXMgZW5zdXJlIHRoYXQgcGVyc29uIGZpZWxkIGlzIHJlc2V0XG4gIHB1YmxpYyBmaWVsZENoYW5nZWQoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAvLyBUT0RPIC0gRG8gc2ltaWxhciB3aXRoIGp1cmlzZGljdGlvbi9zZXJ2aWNlIGZvciBjYXNld29ya2VycyBieSBzZXJ2aWNlc1xuICAgIGlmIChmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcyAmJiBmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzZXRGaWVsZCBvZiBmaWVsZC5jaGFuZ2VSZXNldEZpZWxkcykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQocmVzZXRGaWVsZCwgZm9ybSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gd2hlbiB1c2VyIGVudGVycyBpbnB1dCBjaGFuZ2UgcmFkaW8gYnV0dG9uXG4gIHB1YmxpYyBpbnB1dENoYW5nZWQoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKGZpZWxkLnJhZGlvU2VsZWN0aW9uQ2hhbmdlICYmIHR5cGVvZiBmaWVsZC5yYWRpb1NlbGVjdGlvbkNoYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5lbmFibGVDb25kaXRpb24uc3BsaXQoJz0nKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQobmFtZSkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlucHV0U2VydmljZUNoYW5nZWQoZTogRmlsdGVyQ29uZmlnT3B0aW9uLCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgIHRoaXMuYWRkQWxsT3B0aW9uKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckZvcm1BcnJheSh0aGlzLmZvcm0uZ2V0KCd1c2VyLXNlcnZpY2VzJykgYXMgRm9ybUFycmF5KTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLm5hbWUgPT09ICd1c2VyLXNlcnZpY2VzJykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRTZXJ2aWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRWYWx1ZXNGb3JGaWVsZHModGhpcy5mb3JtLmNvbnRyb2xzLCBmaWVsZCk7XG4gICAgICB0aGlzLmZpbHRlclNraWxsc0J5U2VydmljZXMoc2VsZWN0ZWRTZXJ2aWNlcywgdGhpcy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEZvcm0odGhpcy5jb25maWcsIHRoaXMuc2V0dGluZ3MsIHRydWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncy5maWVsZHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzKSk7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gey4uLnRoaXMuc2V0dGluZ3MsIHJlc2V0OiB0cnVlfTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdChzZXR0aW5ncywgdGhpcy5jb25maWcucGVyc2lzdGVuY2UpO1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2FuY2VsQnV0dG9uQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY29uZmlnLmNhbmNlbEJ1dHRvbkNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVBlcnNvbkNvbnRyb2xzKHZhbHVlczogYW55LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBsZXQga2V5cztcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModmFsdWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkgJiYgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlcyAmJiB2YWx1ZXNba2V5XSA/IHZhbHVlc1trZXldIDogbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hlY2tCb3hDaGVja2VkKGZpZWxkOiBhbnksIGk6IG51bWJlcikge1xuICAgIHJldHVybiAodGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQXJyYXkpWydjb250cm9scyddW2ldWyd2YWx1ZSddO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVRhc2tOYW1lQ29udHJvbHModmFsdWVzOiBzdHJpbmcsIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkucGF0Y2hWYWx1ZSh2YWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbChldmVudDogYW55LCBmb3JtOiBGb3JtR3JvdXAsIGl0ZW06IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHNlbGVjdEFsbD86IHRydWUgfSwgZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgaWYgKCFpdGVtLnNlbGVjdEFsbCkge1xuICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IGZvcm1BcnJheS5jb250cm9scy5ldmVyeSgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTtcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAgIGNvbnN0IGhhc1NlbGVjdEFsbE9wdGlvbiA9IGZpZWxkLm9wdGlvbnMuZmluZCgob3B0aW9uLCBpKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uaGFzT3duUHJvcGVydHkoJ3NlbGVjdEFsbCcpKSB7XG4gICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICAgIGNvbnN0IGlzQWxsQ2hlY2tlZEV4Y2x1ZGluZ1RoZVNlbGVjdEFsbE9wdGlvbiA9IGZvcm1BcnJheS5jb250cm9scy5maWx0ZXIoKF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGk6IG51bWJlcikgPT4gaSAhPT0gaW5kZXgpXG4gICAgICAgIC5ldmVyeSgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTtcblxuICAgICAgaWYgKCFhbGxDaGVja2VkICYmIGhhc1NlbGVjdEFsbE9wdGlvbiAmJiAhaXNDaGVja2VkKSB7XG4gICAgICAgIGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNTZWxlY3RBbGxPcHRpb24gJiYgIWFsbENoZWNrZWQgJiYgaXNDaGVja2VkICYmIGlzQWxsQ2hlY2tlZEV4Y2x1ZGluZ1RoZVNlbGVjdEFsbE9wdGlvbikge1xuICAgICAgICBmb3JtQXJyYXkuY29udHJvbHNbaW5kZXhdLnBhdGNoVmFsdWUodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzICYmIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzLmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCByZXNldEZpZWxkIG9mIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWVsZChyZXNldEZpZWxkLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpZWxkLm5hbWUgPT09ICd1c2VyLXNlcnZpY2VzJykge1xuICAgICAgdGhpcy5zdGFydEZpbHRlclNraWxsc0J5U2VydmljZXMoZm9ybSwgZmllbGQpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQubmFtZSA9PT0gJ3VzZXItc2tpbGxzJykge1xuICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZmllbGQub3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IE51bWJlcihvcHRpb24ua2V5KSA9PT0gTnVtYmVyKGV2ZW50LnRhcmdldC52YWx1ZSkpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZENoZWNrYm94ID0gdGhpcy5mb3JtLmdldCgndXNlci1za2lsbHMnKS52YWx1ZTtcbiAgICAgICAgc2VsZWN0ZWRDaGVja2JveFtzZWxlY3RlZEluZGV4XSA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXItc2tpbGxzJykuc2V0VmFsdWUoc2VsZWN0ZWRDaGVja2JveCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94LnB1c2goZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3guaW5kZXhPZihldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5wcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3guc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRGaWx0ZXJTa2lsbHNCeVNlcnZpY2VzKGZvcm06IEZvcm1Hcm91cCwgZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3Qgc2VydmljZXNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3JtLnZhbHVlW2ZpZWxkLm5hbWVdLm1hcCgoc2VydmljZTogYm9vbGVhbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHNlcnZpY2UpIHtcbiAgICAgICAgc2VydmljZXNBcnJheS5wdXNoKGZpZWxkLm9wdGlvbnNbaW5kZXhdLmtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5maWx0ZXJTa2lsbHNCeVNlcnZpY2VzKHNlcnZpY2VzQXJyYXksIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWVsZChyZXNldEZpZWxkOiBzdHJpbmcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChyZXNldEZpZWxkKTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWU6IHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55W10gfSA9IHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gcmVzZXRGaWVsZCk7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250cm9sLnJlbW92ZUF0KGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2wudmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQoa2V5LCBjb250cm9sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLnZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZS5sZW5ndGggPyBkZWZhdWx0VmFsdWUudmFsdWVbMF0gOiBudWxsO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRGaWVsZHMoZmlsdGVyOiBGaWx0ZXJTZXR0aW5nKTogdm9pZCB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpID8gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCkuZmllbGRzIDogZmlsdGVyLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0ge1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIGZpZWxkczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKGNvbmZpZzogRmlsdGVyQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZywgcmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFBlcnNvbkNvbnRyb2wgPSB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0KCdmaW5kUGVyc29uQ29udHJvbCcpIDogbnVsbDtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBpZiAoZmluZFBlcnNvbkNvbnRyb2wpIHtcbiAgICAgIC8vIGluIG9yZGVyIHRvIG1haW50YWluIGZpbmQgcGVyc29uIGNvbXBvbmVudCwgY29udHJvbCBuZWVkcyB0byBiZSBrZXB0XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCgnZmluZFBlcnNvbkNvbnRyb2wnLCBmaW5kUGVyc29uQ29udHJvbCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgY29uZmlnLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94LWxhcmdlJyB8fCBmaWVsZC50eXBlID09PSAnbmVzdGVkLWNoZWNrYm94Jykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nIHx8IGZpZWxkLnR5cGUgPT09ICdmaW5kLXNlcnZpY2UnKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYnVpbGRGb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgICAgdGhpcy5hZGRBbGxPcHRpb24oZmllbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgICAgICBpZiAoZmllbGQubWluU2VsZWN0ZWQgJiYgZmllbGQubWluU2VsZWN0ZWQgPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICd0ZXh0LWlucHV0Jykge1xuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGZpZWxkLm1pblNlbGVjdGVkKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdlbWFpbC1pbnB1dCcpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgICAgICBjb25zdCBjYW5jZWxGaWVsZCA9IGNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNhbmNlbEZpZWxkICYmIGNhbmNlbEZpZWxkLnZhbHVlID8gY2FuY2VsRmllbGQudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBsYXN0U2F2ZWRWYWx1ZSA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGxhc3RTYXZlZFZhbHVlICYmIGxhc3RTYXZlZFZhbHVlID8gbGFzdFNhdmVkVmFsdWUudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZCBpcyBmaW5kLXBlcnNvbiBidWlsZCBhIGZvcm0gZ3JvdXA7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBkb21haW46IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLmhhc093blByb3BlcnR5KCdkb21haW4nKSA/IGRlZmF1bHRWYWx1ZS5kb21haW4gOiAnJyksXG4gICAgICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2VtYWlsJykgPyBkZWZhdWx0VmFsdWUuZW1haWwgOiAnJywgdmFsaWRhdG9ycyksXG4gICAgICAgICAgICBpZDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2lkJykgPyBkZWZhdWx0VmFsdWUuaWQgOiAnJyksXG4gICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpID8gZGVmYXVsdFZhbHVlLm5hbWUgOiAnJyksXG4gICAgICAgICAgICBrbm93bkFzOiBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgna25vd25BcycpID8gZGVmYXVsdFZhbHVlLmtub3duQXMgOiAnJyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUdyb3VwKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlICE9PSAnZ3JvdXAtdGl0bGUnKSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZmllbGQgdXBkYXRlcyBmaW5kIHBlcnNvbiBjb21wb25lbnQgc2V0IHRoZSBpbml0aWFsIGRvbWFpblxuICAgICAgICBpZiAoZmllbGQuZmluZFBlcnNvbkZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5maWVsZENoYW5nZWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgZmllbGQub3B0aW9ucykge1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlcy52YWx1ZSkpIHtcbiAgICAgICAgY2hlY2tlZCA9ICEhZGVmYXVsdFZhbHVlcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG9wdGlvbi5rZXkpO1xuICAgICAgfVxuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGNoZWNrZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1BcnJheShmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIHNldHRpbmdzOiBGaWx0ZXJTZXR0aW5nKTogRm9ybUFycmF5IHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gR2VuZXJpY0ZpbHRlckNvbXBvbmVudC5hZGRGb3JtVmFsaWRhdG9ycyhmaWVsZCk7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShbXSwgdmFsaWRhdG9ycyk7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55W10gfTtcbiAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gc2V0dGluZ3MuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzLnZhbHVlICYmIGRlZmF1bHRWYWx1ZXMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlZmF1bHRWYWx1ZSBvZiBkZWZhdWx0VmFsdWVzLnZhbHVlKSB7XG4gICAgICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkVmFsdWVzKGZvcm1WYWx1ZXM6IGFueSwgY29uZmlnOiBGaWx0ZXJDb25maWcpOiBhbnkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhmb3JtVmFsdWVzKS5tYXAoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gZm9ybVZhbHVlc1tuYW1lXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nIHx8IGZpZWxkLnR5cGUgPT09ICdmaW5kLXNlcnZpY2UnKSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdmFsdWVzLCBuYW1lfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBnZXRWYWx1ZXMoZmllbGQub3B0aW9ucywgdmFsdWVzKSwgbmFtZX07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IFt2YWx1ZXNdLCBuYW1lfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEZvcm1FcnJvcnMoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgbGV0IGVycm9yczogRmlsdGVyRXJyb3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5jb25maWcuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiAoZm9ybUdyb3VwLmVycm9ycy5taW5sZW5ndGggfHwgZm9ybUdyb3VwLmVycm9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5tYXhsZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5tYXhTZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICBlcnJvcnMgPSBlcnJvcnMuZmlsdGVyKCAoZmlsdGVyRXJyb3IsIGksIGFycikgPT4ge1xuICAgICAgcmV0dXJuIGVycm9ycy5pbmRleE9mKGFyci5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJFcnJvci5uYW1lKSkgPT09IGk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQoZXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdFZhbHVlc0Zyb21DYWNoZUZvclNraWxsc0J5U2VydmljZXMoKSB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MgJiYgdGhpcy5zZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3gubWFwKHNraWxsID0+IHtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBpc1NlbGVjdGVkVXNlclNraWxsOiBudW1iZXI7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVXNlclNraWxscyA9IHRoaXMuc2V0dGluZ3MuZmllbGRzLmZpbmQoc2V0dGluZyA9PiBzZXR0aW5nLm5hbWUgPT09ICd1c2VyLXNraWxscycpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyU2tpbGxzICYmIHNlbGVjdGVkVXNlclNraWxscy52YWx1ZSAmJiBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlzU2VsZWN0ZWRVc2VyU2tpbGwgPSBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUuZmluZEluZGV4KHZhbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbCkgPT09IFN0cmluZyhza2lsbC5rZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGVjdGVkID0gaXNTZWxlY3RlZFVzZXJTa2lsbCAhPT0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNhY2hlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXItc2tpbGxzJykuc2V0VmFsdWUoY2FjaGVkVmFsdWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyU2tpbGxzQnlTZXJ2aWNlcyhzZXJ2aWNlczogc3RyaW5nW10sIGNvbmZpZzogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMgPSBbXTtcbiAgICB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlc0NoZWNrYm94ID0gW107XG4gICAgY29uc3QgdXNlclNraWxsc1NlbGVjdEZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSAndXNlci1za2lsbHMnICYmIGYudHlwZSA9PT0gJ2dyb3VwLXNlbGVjdCcpO1xuICAgIGNvbnN0IHVzZXJTa2lsbHNDaGVja2JveEZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSAndXNlci1za2lsbHMnICYmIGYudHlwZSA9PT0gJ25lc3RlZC1jaGVja2JveCcpO1xuXG4gICAgaWYgKHVzZXJTa2lsbHNTZWxlY3RGaWVsZCkge1xuICAgICAgY29uc3QgdXNlclNraWxscyA9IHVzZXJTa2lsbHNTZWxlY3RGaWVsZC5ncm91cE9wdGlvbnM7XG4gICAgICBpZiAoIXNlcnZpY2VzIHx8IHNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlcyA9IHVzZXJTa2lsbHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2aWNlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyb3VwT3B0aW9uID0gdXNlclNraWxscy5maW5kKHUgPT4gdS5ncm91cC50b0xvd2VyQ2FzZSgpID09PSBzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIGlmIChncm91cE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMucHVzaChncm91cE9wdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHVzZXJTa2lsbHNDaGVja2JveEZpZWxkKSB7XG4gICAgICBjb25zdCB1c2VyU2tpbGxzID0gdXNlclNraWxsc0NoZWNrYm94RmllbGQuZ3JvdXBPcHRpb25zO1xuICAgICAgaWYgKCFzZXJ2aWNlcyB8fCBzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMgPSB1c2VyU2tpbGxzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmljZXMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cE9wdGlvbiA9IHVzZXJTa2lsbHMuZmluZCh1ID0+IHUuZ3JvdXAudG9Mb3dlckNhc2UoKSA9PT0gcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICBpZiAoZ3JvdXBPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzLnB1c2goZ3JvdXBPcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3ggPSB0aGlzLmZpbHRlcmVkU2tpbGxzQnlTZXJ2aWNlcy5tYXAoc2tpbGwgPT4ge1xuICAgICAgICAgIHJldHVybiBza2lsbC5vcHRpb25zO1xuICAgICAgICB9KS5yZWR1Y2UoKGEsIGIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgICAgIH0sIFtdKTtcbiAgICAgICAgdXNlclNraWxsc0NoZWNrYm94RmllbGQub3B0aW9ucyA9IFtdO1xuICAgICAgICB1c2VyU2tpbGxzQ2hlY2tib3hGaWVsZC5vcHRpb25zID0gdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXNDaGVja2JveDtcblxuICAgICAgICB0aGlzLmZvcm0uc2V0Q29udHJvbCgndXNlci1za2lsbHMnLCBuZXcgRm9ybUFycmF5KFtdKSk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3guZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3VzZXItc2tpbGxzJykgYXMgRm9ybUFycmF5KS5wdXNoKG5ldyBGb3JtQ29udHJvbChmYWxzZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcmV2VmFsdWVzID0gdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXNDaGVja2JveC5tYXAoc2tpbGwgPT4ge1xuICAgICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzICYmIHRoaXMuc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1NlbGVjdGVkTmVzdGVkQ2hlY2tib3gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRoaXMucHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94LmluY2x1ZGVzKHNraWxsLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXNTZWxlY3RlZFVzZXJTa2lsbDogbnVtYmVyO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRVc2VyU2tpbGxzID0gdGhpcy5zZXR0aW5ncy5maWVsZHMuZmluZChzZXR0aW5nID0+IHNldHRpbmcubmFtZSA9PT0gJ3VzZXItc2tpbGxzJyk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyU2tpbGxzICYmIHNlbGVjdGVkVXNlclNraWxscy52YWx1ZSAmJiBzZWxlY3RlZFVzZXJTa2lsbHMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpc1NlbGVjdGVkVXNlclNraWxsID0gc2VsZWN0ZWRVc2VyU2tpbGxzLnZhbHVlLmZpbmRJbmRleCh2YWwgPT4gTnVtYmVyKHZhbCkgPT09IE51bWJlcihza2lsbC5rZXkpKTtcbiAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpc1NlbGVjdGVkVXNlclNraWxsICE9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzU2VsZWN0ZWROZXN0ZWRDaGVja2JveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIC8vIFBpY2sgdXAgZnJvbSBwcmV2aW91cyBzZWxlY3RlZFxuICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRoaXMucHJldmlvdXNTZWxlY3RlZE5lc3RlZENoZWNrYm94LmluY2x1ZGVzKFN0cmluZyhza2lsbC5rZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXItc2tpbGxzJykuc2V0VmFsdWUocHJldlZhbHVlcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzQ2hlY2tib3g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMgPSB0aGlzLnNvcnRHcm91cE9wdGlvbnModGhpcy5maWx0ZXJlZFNraWxsc0J5U2VydmljZXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTa2lsbHNCeVNlcnZpY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFZhbHVlc0ZvckZpZWxkcyhmb3JtVmFsdWVzOiBhbnksIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgICBPYmplY3Qua2V5cyhmb3JtVmFsdWVzKS5tYXAoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gZm9ybVZhbHVlc1tuYW1lXS52YWx1ZTtcbiAgICAgIGlmIChuYW1lID09PSBmaWVsZC5uYW1lKSB7XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2OiBhbnkpID0+IHtcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5wdXNoKHYua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkVmFsdWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0R3JvdXBPcHRpb25zKGdyb3VwT3B0aW9uczogR3JvdXBPcHRpb25zW10pOiBHcm91cE9wdGlvbnNbXSB7XG4gICAgY29uc3Qgc29ydGVkUmVzdWx0czogR3JvdXBPcHRpb25zW10gPSBbXTtcbiAgICBjb25zdCBncm91cHMgPSBncm91cE9wdGlvbnMubWFwKGdvID0+IGdvLmdyb3VwKTtcbiAgICBncm91cHMuc29ydCgpLmZvckVhY2goZyA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZ3JvdXBPcHRpb25zLmZpbmQoKGdvOiBhbnkpID0+IGdvLmdyb3VwID09PSBnKS5vcHRpb25zO1xuICAgICAgY29uc3Qgc29ydGVkT3B0aW9ucyA9IG9wdGlvbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gYS5sYWJlbC50b0xvd2VyQ2FzZSgpID4gYi5sYWJlbC50b0xvd2VyQ2FzZSgpID8gMSA6IChiLmxhYmVsLnRvTG93ZXJDYXNlKCkgPiBhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAtMSA6IDApO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGdyb3VwIDogZyxcbiAgICAgICAgb3B0aW9uczogc29ydGVkT3B0aW9uc1xuICAgICAgfTtcbiAgICAgIHNvcnRlZFJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIHJldHVybiBzb3J0ZWRSZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbGVhckZvcm1BcnJheSA9IChmb3JtQXJyYXk6IEZvcm1BcnJheSkgPT4ge1xuICAgIGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChlbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChlbC52YWx1ZS5rZXkgPT09ICdBbGwnKSB7XG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCd1c2VyLXNlcnZpY2VzJykgYXMgRm9ybUFycmF5KS5yZW1vdmVBdChpbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFkZEFsbE9wdGlvbiA9IChmaWVsZDogRmlsdGVyRmllbGRDb25maWcpID0+IHtcbiAgICBpZiAodGhpcy5mb3JtLmdldCgndXNlci1zZXJ2aWNlcycpICYmIHRoaXMuZm9ybS5nZXQoJ3VzZXItc2VydmljZXMnKS52YWx1ZS5sZW5ndGggPT09IDAgJiYgZmllbGQubWluU2VsZWN0ZWQgPj0gMCkge1xuICAgICAgKHRoaXMuZm9ybS5nZXQoJ3VzZXItc2VydmljZXMnKSBhcyBGb3JtQXJyYXkpLnB1c2gobmV3IEZvcm1Db250cm9sKHtrZXk6ICdBbGwnLCBsYWJlbDogJ0FsbCd9KSk7XG4gICB9XG4gIH1cblxufVxuIl19