@hmcts/rpx-xui-common-lib 2.1.1-angular-upgrade-11 → 2.1.4-angular-upgrade-11

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 (287) hide show
  1. package/bundles/hmcts-rpx-xui-common-lib.umd.js +3443 -8190
  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 -15
  4. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/hmcts-rpx-xui-common-lib.js +4 -71
  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 +15 -120
  13. package/esm2015/lib/components/find-person/find-person.component.js +9 -150
  14. package/esm2015/lib/components/generic-filter/generic-filter-utils.js +11 -55
  15. package/esm2015/lib/components/generic-filter/generic-filter.component.js +40 -283
  16. package/esm2015/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +3 -18
  17. package/esm2015/lib/components/invite-user-form/invite-user-form.component.js +2 -22
  18. package/esm2015/lib/components/invite-user-permissions/invite-user-permission.component.js +2 -21
  19. package/esm2015/lib/components/loading-spinner/loading-spinner.component.js +3 -12
  20. package/esm2015/lib/components/pagination/pagination.component.js +2 -24
  21. package/esm2015/lib/components/search-judicials/search-judicials.component.js +10 -133
  22. package/esm2015/lib/components/search-location/search-location.component.js +28 -160
  23. package/esm2015/lib/components/search-venue/search-venue.component.js +12 -135
  24. package/esm2015/lib/components/selected-case/selected-case.component.js +20 -176
  25. package/esm2015/lib/components/selected-case-confirm/selected-case-confirm.component.js +3 -41
  26. package/esm2015/lib/components/selected-case-list/selected-case-list.component.js +3 -52
  27. package/esm2015/lib/components/service-message/service-message.component.js +2 -20
  28. package/esm2015/lib/components/service-messages/service-messages.component.js +7 -65
  29. package/esm2015/lib/components/share-case/share-case.component.js +6 -87
  30. package/esm2015/lib/components/share-case-confirm/share-case-confirm.component.js +4 -37
  31. package/esm2015/lib/components/tab/tab.component.js +2 -26
  32. package/esm2015/lib/components/tc-confirm/tc-confirm.component.js +2 -17
  33. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +2 -8
  34. package/esm2015/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +2 -8
  35. package/esm2015/lib/components/terms-and-conditions/terms-and-conditions.component.js +2 -12
  36. package/esm2015/lib/components/user-details/user-details.component.js +2 -39
  37. package/esm2015/lib/components/user-list/user-list.component.js +2 -32
  38. package/esm2015/lib/components/user-select/user-select.component.js +5 -52
  39. package/esm2015/lib/directives/feature-toggle/feature-toggle.directive.js +3 -56
  40. package/esm2015/lib/directives/let/let.directive.js +1 -39
  41. package/esm2015/lib/exui-common-lib.module.js +23 -15
  42. package/esm2015/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +2 -22
  43. package/esm2015/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +2 -13
  44. package/esm2015/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +4 -54
  45. package/esm2015/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +2 -14
  46. package/esm2015/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +2 -17
  47. package/esm2015/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +2 -24
  48. package/esm2015/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +2 -16
  49. package/esm2015/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +2 -22
  50. package/esm2015/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +2 -12
  51. package/esm2015/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +6 -24
  52. package/esm2015/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +2 -13
  53. package/esm2015/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +2 -21
  54. package/esm2015/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +2 -32
  55. package/esm2015/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +2 -18
  56. package/esm2015/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +2 -14
  57. package/esm2015/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +2 -44
  58. package/esm2015/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +2 -16
  59. package/esm2015/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +2 -36
  60. package/esm2015/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +2 -23
  61. package/esm2015/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +2 -22
  62. package/esm2015/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +3 -30
  63. package/esm2015/lib/gov-ui/directives/remove-host.directive.js +1 -22
  64. package/esm2015/lib/gov-ui/models/banner-data-model.js +2 -16
  65. package/esm2015/lib/gov-ui/models/checkboxes-model.js +2 -22
  66. package/esm2015/lib/gov-ui/models/error-messages-model.js +2 -16
  67. package/esm2015/lib/gov-ui/models/gov-ui-config-model.js +2 -36
  68. package/esm2015/lib/gov-ui/models/index.js +2 -7
  69. package/esm2015/lib/gov-ui/models/isession-storage.interface.js +2 -24
  70. package/esm2015/lib/gov-ui/models/public_api.js +5 -10
  71. package/esm2015/lib/gov-ui/util/helpers/html-templates.helper.js +4 -14
  72. package/esm2015/lib/gov-ui/util/session-storage/session-storage-utils.js +12 -48
  73. package/esm2015/lib/models/case-share.model.js +2 -26
  74. package/esm2015/lib/models/contact-details.model.js +7 -31
  75. package/esm2015/lib/models/due-date.model.js +7 -14
  76. package/esm2015/lib/models/feature-user.js +1 -16
  77. package/esm2015/lib/models/filter.model.js +1 -116
  78. package/esm2015/lib/models/idle-config.model.js +2 -20
  79. package/esm2015/lib/models/index.js +15 -19
  80. package/esm2015/lib/models/location.model.js +7 -108
  81. package/esm2015/lib/models/pagination.model.js +2 -18
  82. package/esm2015/lib/models/person.model.js +17 -92
  83. package/esm2015/lib/models/public_api.js +6 -11
  84. package/esm2015/lib/models/search-options.model.js +2 -22
  85. package/esm2015/lib/models/tcDocument.model.js +2 -18
  86. package/esm2015/lib/models/timeout-notification.model.js +2 -18
  87. package/esm2015/lib/models/user-details.model.js +2 -22
  88. package/esm2015/lib/models/user.model.js +2 -25
  89. package/esm2015/lib/services/case-sharing-state/case-sharing-state.service.js +9 -84
  90. package/esm2015/lib/services/cookie/cookie.service.js +8 -71
  91. package/esm2015/lib/services/feature-toggle/feature-toggle.guard.js +4 -43
  92. package/esm2015/lib/services/feature-toggle/feature-toggle.service.js +2 -28
  93. package/esm2015/lib/services/feature-toggle/launch-darkly.service.js +12 -94
  94. package/esm2015/lib/services/filter/filter.service.js +2 -56
  95. package/esm2015/lib/services/find-person/find-person.service.js +16 -124
  96. package/esm2015/lib/services/google-analytics/google-analytics.service.js +8 -63
  97. package/esm2015/lib/services/google-tag-manager/google-tag-manager.service.js +10 -64
  98. package/esm2015/lib/services/loading/loading.service.js +2 -41
  99. package/esm2015/lib/services/locations/location.service.js +14 -30
  100. package/esm2015/lib/services/manage-session/manage-session.services.js +10 -63
  101. package/esm2015/lib/services/role-guard/role.guard.js +12 -53
  102. package/esm2015/lib/services/role-guard/role.service.js +2 -21
  103. package/esm2015/lib/services/session-storage/session-storage.service.js +3 -17
  104. package/esm2015/lib/services/timeout-notifications/timeout-notifications.service.js +9 -75
  105. package/esm2015/lib/window.js +1 -10
  106. package/esm2015/public-api.js +76 -13
  107. package/fesm2015/hmcts-rpx-xui-common-lib.js +2217 -6108
  108. package/fesm2015/hmcts-rpx-xui-common-lib.js.map +1 -1
  109. package/hmcts-rpx-xui-common-lib.d.ts +2 -64
  110. package/hmcts-rpx-xui-common-lib.metadata.json +1 -1
  111. package/lib/components/checkbox-list/checkbox-list.component.d.ts +6 -5
  112. package/lib/components/due-date/due-date.component.d.ts +4 -4
  113. package/lib/components/find-location/find-location.component.d.ts +7 -4
  114. package/lib/components/generic-filter/generic-filter.component.d.ts +4 -2
  115. package/lib/components/invite-user-form/invite-user-form.component.d.ts +1 -1
  116. package/lib/components/search-judicials/search-judicials.component.d.ts +1 -1
  117. package/lib/components/search-location/search-location.component.d.ts +9 -4
  118. package/lib/components/search-venue/search-venue.component.d.ts +1 -1
  119. package/lib/directives/feature-toggle/feature-toggle.directive.d.ts +1 -1
  120. package/lib/directives/let/let.directive.d.ts +1 -1
  121. package/lib/exui-common-lib.module.d.ts +0 -33
  122. package/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.d.ts +1 -1
  123. package/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.d.ts +1 -1
  124. package/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.d.ts +1 -1
  125. package/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.d.ts +1 -1
  126. package/lib/models/filter.model.d.ts +2 -0
  127. package/lib/models/index.d.ts +1 -0
  128. package/lib/models/location.model.d.ts +11 -0
  129. package/lib/services/case-sharing-state/case-sharing-state.service.d.ts +1 -1
  130. package/lib/services/loading/loading.service.d.ts +2 -2
  131. package/lib/services/locations/location.service.d.ts +2 -2
  132. package/lib/services/role-guard/role.service.d.ts +2 -1
  133. package/lib/window.d.ts +1 -1
  134. package/package.json +6 -19
  135. package/public-api.d.ts +78 -7
  136. package/esm2015/lib/components/index.js +0 -7
  137. package/esm2015/lib/components/public_api.js +0 -33
  138. package/esm2015/lib/directives/index.js +0 -7
  139. package/esm2015/lib/directives/public-api.js +0 -8
  140. package/esm2015/lib/gov-ui/components/index.js +0 -7
  141. package/esm2015/lib/gov-ui/components/public_api.js +0 -7
  142. package/esm2015/lib/gov-ui/gov-ui.service.js +0 -19
  143. package/esm2015/lib/gov-ui/index.js +0 -7
  144. package/esm2015/lib/gov-ui/public_api.js +0 -12
  145. package/esm2015/lib/gov-ui/validators/checkboxes-be-checked.validator.js +0 -37
  146. package/esm2015/lib/gov-ui/validators/date.validator.js +0 -32
  147. package/esm2015/lib/gov-ui/validators/index.js +0 -7
  148. package/esm2015/lib/gov-ui/validators/public_api.js +0 -12
  149. package/esm2015/lib/gov-ui/validators/radio-group.validator.js +0 -27
  150. package/esm2015/lib/services/index.js +0 -7
  151. package/esm2015/lib/services/public-api.js +0 -25
  152. package/esm5/hmcts-rpx-xui-common-lib.js +0 -74
  153. package/esm5/lib/components/accessibility/accessibility.component.js +0 -22
  154. package/esm5/lib/components/checkbox-list/checkbox-list.component.js +0 -391
  155. package/esm5/lib/components/contact-details/contact-details.component.js +0 -29
  156. package/esm5/lib/components/cookie-banner/cookie-banner.component.js +0 -154
  157. package/esm5/lib/components/due-date/due-date.component.js +0 -254
  158. package/esm5/lib/components/exui-main-wrapper/exui-page-wrapper.component.js +0 -45
  159. package/esm5/lib/components/find-location/find-location.component.js +0 -279
  160. package/esm5/lib/components/find-person/find-person.component.js +0 -286
  161. package/esm5/lib/components/generic-filter/generic-filter-utils.js +0 -66
  162. package/esm5/lib/components/generic-filter/generic-filter.component.js +0 -822
  163. package/esm5/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.js +0 -47
  164. package/esm5/lib/components/index.js +0 -7
  165. package/esm5/lib/components/invite-user-form/invite-user-form.component.js +0 -54
  166. package/esm5/lib/components/invite-user-permissions/invite-user-permission.component.js +0 -46
  167. package/esm5/lib/components/loading-spinner/loading-spinner.component.js +0 -29
  168. package/esm5/lib/components/pagination/pagination.component.js +0 -58
  169. package/esm5/lib/components/public_api.js +0 -33
  170. package/esm5/lib/components/search-judicials/search-judicials.component.js +0 -291
  171. package/esm5/lib/components/search-location/search-location.component.js +0 -302
  172. package/esm5/lib/components/search-venue/search-venue.component.js +0 -290
  173. package/esm5/lib/components/selected-case/selected-case.component.js +0 -430
  174. package/esm5/lib/components/selected-case-confirm/selected-case-confirm.component.js +0 -84
  175. package/esm5/lib/components/selected-case-list/selected-case-list.component.js +0 -109
  176. package/esm5/lib/components/service-message/service-message.component.js +0 -46
  177. package/esm5/lib/components/service-messages/service-messages.component.js +0 -122
  178. package/esm5/lib/components/share-case/share-case.component.js +0 -223
  179. package/esm5/lib/components/share-case-confirm/share-case-confirm.component.js +0 -70
  180. package/esm5/lib/components/tab/tab.component.js +0 -51
  181. package/esm5/lib/components/tc-confirm/tc-confirm.component.js +0 -42
  182. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-html/tc-display-html.component.js +0 -22
  183. package/esm5/lib/components/terms-and-conditions/tc-display/tc-display-plain/tc-display-plain.component.js +0 -22
  184. package/esm5/lib/components/terms-and-conditions/terms-and-conditions.component.js +0 -29
  185. package/esm5/lib/components/user-details/user-details.component.js +0 -92
  186. package/esm5/lib/components/user-list/user-list.component.js +0 -76
  187. package/esm5/lib/components/user-select/user-select.component.js +0 -131
  188. package/esm5/lib/directives/feature-toggle/feature-toggle.directive.js +0 -104
  189. package/esm5/lib/directives/index.js +0 -7
  190. package/esm5/lib/directives/let/let.directive.js +0 -78
  191. package/esm5/lib/directives/public-api.js +0 -8
  192. package/esm5/lib/exui-common-lib.module.js +0 -178
  193. package/esm5/lib/gov-ui/components/gov-uk-checkbox/gov-uk-checkbox.component.js +0 -56
  194. package/esm5/lib/gov-ui/components/gov-uk-checkboxes/gov-uk-checkboxes.component.js +0 -36
  195. package/esm5/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +0 -135
  196. package/esm5/lib/gov-ui/components/gov-uk-error-message/gov-uk-error-message.component.js +0 -37
  197. package/esm5/lib/gov-ui/components/gov-uk-fieldset/gov-uk-fieldset.component.js +0 -49
  198. package/esm5/lib/gov-ui/components/gov-uk-file-upload/gov-uk-file-upload.component.js +0 -65
  199. package/esm5/lib/gov-ui/components/gov-uk-form-group-wrapper/gov-uk-form-group-wrapper.component.js +0 -40
  200. package/esm5/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +0 -66
  201. package/esm5/lib/gov-ui/components/gov-uk-label/gov-uk-label.component.js +0 -34
  202. package/esm5/lib/gov-ui/components/gov-uk-radio/gov-uk-radio.component.js +0 -67
  203. package/esm5/lib/gov-ui/components/gov-uk-radios/gov-uk-radios.component.js +0 -36
  204. package/esm5/lib/gov-ui/components/gov-uk-select/gov-uk-select.component.js +0 -52
  205. package/esm5/lib/gov-ui/components/gov-uk-table/gov-uk-table.component.js +0 -77
  206. package/esm5/lib/gov-ui/components/gov-uk-textarea/gov-uk-textarea.component.js +0 -50
  207. package/esm5/lib/gov-ui/components/hmcts-banner/hmcts-banner.component.js +0 -38
  208. package/esm5/lib/gov-ui/components/hmcts-error-summary/hmcts-error-summary.component.js +0 -108
  209. package/esm5/lib/gov-ui/components/hmcts-identity-bar/hmcts-identity-bar.component.js +0 -40
  210. package/esm5/lib/gov-ui/components/hmcts-main-wrapper/hmcts-main-wrapper.component.js +0 -87
  211. package/esm5/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +0 -51
  212. package/esm5/lib/gov-ui/components/hmcts-primary-navigation/hmcts-primary-navigation.component.js +0 -49
  213. package/esm5/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +0 -46
  214. package/esm5/lib/gov-ui/components/index.js +0 -7
  215. package/esm5/lib/gov-ui/components/public_api.js +0 -7
  216. package/esm5/lib/gov-ui/directives/remove-host.directive.js +0 -52
  217. package/esm5/lib/gov-ui/gov-ui.service.js +0 -22
  218. package/esm5/lib/gov-ui/index.js +0 -7
  219. package/esm5/lib/gov-ui/models/banner-data-model.js +0 -16
  220. package/esm5/lib/gov-ui/models/checkboxes-model.js +0 -22
  221. package/esm5/lib/gov-ui/models/error-messages-model.js +0 -16
  222. package/esm5/lib/gov-ui/models/gov-ui-config-model.js +0 -36
  223. package/esm5/lib/gov-ui/models/index.js +0 -7
  224. package/esm5/lib/gov-ui/models/isession-storage.interface.js +0 -24
  225. package/esm5/lib/gov-ui/models/public_api.js +0 -13
  226. package/esm5/lib/gov-ui/public_api.js +0 -12
  227. package/esm5/lib/gov-ui/util/helpers/html-templates.helper.js +0 -57
  228. package/esm5/lib/gov-ui/util/session-storage/session-storage-utils.js +0 -58
  229. package/esm5/lib/gov-ui/validators/checkboxes-be-checked.validator.js +0 -38
  230. package/esm5/lib/gov-ui/validators/date.validator.js +0 -32
  231. package/esm5/lib/gov-ui/validators/index.js +0 -7
  232. package/esm5/lib/gov-ui/validators/public_api.js +0 -12
  233. package/esm5/lib/gov-ui/validators/radio-group.validator.js +0 -27
  234. package/esm5/lib/models/case-share.model.js +0 -26
  235. package/esm5/lib/models/contact-details.model.js +0 -31
  236. package/esm5/lib/models/due-date.model.js +0 -15
  237. package/esm5/lib/models/feature-user.js +0 -28
  238. package/esm5/lib/models/filter.model.js +0 -122
  239. package/esm5/lib/models/idle-config.model.js +0 -20
  240. package/esm5/lib/models/index.js +0 -19
  241. package/esm5/lib/models/location.model.js +0 -108
  242. package/esm5/lib/models/pagination.model.js +0 -18
  243. package/esm5/lib/models/person.model.js +0 -92
  244. package/esm5/lib/models/public_api.js +0 -11
  245. package/esm5/lib/models/search-options.model.js +0 -22
  246. package/esm5/lib/models/tcDocument.model.js +0 -18
  247. package/esm5/lib/models/timeout-notification.model.js +0 -18
  248. package/esm5/lib/models/user-details.model.js +0 -22
  249. package/esm5/lib/models/user.model.js +0 -25
  250. package/esm5/lib/services/case-sharing-state/case-sharing-state.service.js +0 -289
  251. package/esm5/lib/services/cookie/cookie.service.js +0 -136
  252. package/esm5/lib/services/feature-toggle/feature-toggle.guard.js +0 -89
  253. package/esm5/lib/services/feature-toggle/feature-toggle.service.js +0 -90
  254. package/esm5/lib/services/feature-toggle/launch-darkly.service.js +0 -187
  255. package/esm5/lib/services/filter/filter.service.js +0 -153
  256. package/esm5/lib/services/find-person/find-person.service.js +0 -238
  257. package/esm5/lib/services/google-analytics/google-analytics.service.js +0 -128
  258. package/esm5/lib/services/google-tag-manager/google-tag-manager.service.js +0 -135
  259. package/esm5/lib/services/index.js +0 -7
  260. package/esm5/lib/services/loading/loading.service.js +0 -109
  261. package/esm5/lib/services/locations/location.service.js +0 -82
  262. package/esm5/lib/services/manage-session/manage-session.services.js +0 -111
  263. package/esm5/lib/services/public-api.js +0 -25
  264. package/esm5/lib/services/role-guard/role.guard.js +0 -81
  265. package/esm5/lib/services/role-guard/role.service.js +0 -45
  266. package/esm5/lib/services/session-storage/session-storage.service.js +0 -96
  267. package/esm5/lib/services/timeout-notifications/timeout-notifications.service.js +0 -190
  268. package/esm5/lib/window.js +0 -13
  269. package/esm5/public-api.js +0 -16
  270. package/fesm5/hmcts-rpx-xui-common-lib.js +0 -9247
  271. package/fesm5/hmcts-rpx-xui-common-lib.js.map +0 -1
  272. package/lib/components/index.d.ts +0 -1
  273. package/lib/components/public_api.d.ts +0 -27
  274. package/lib/directives/index.d.ts +0 -1
  275. package/lib/directives/public-api.d.ts +0 -2
  276. package/lib/gov-ui/components/index.d.ts +0 -1
  277. package/lib/gov-ui/components/public_api.d.ts +0 -1
  278. package/lib/gov-ui/gov-ui.service.d.ts +0 -3
  279. package/lib/gov-ui/index.d.ts +0 -1
  280. package/lib/gov-ui/public_api.d.ts +0 -3
  281. package/lib/gov-ui/validators/checkboxes-be-checked.validator.d.ts +0 -2
  282. package/lib/gov-ui/validators/date.validator.d.ts +0 -2
  283. package/lib/gov-ui/validators/index.d.ts +0 -1
  284. package/lib/gov-ui/validators/public_api.d.ts +0 -3
  285. package/lib/gov-ui/validators/radio-group.validator.d.ts +0 -2
  286. package/lib/services/index.d.ts +0 -1
  287. package/lib/services/public-api.d.ts +0 -16
@@ -1,50 +1,23 @@
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
  }
20
- /**
21
- * @return {?}
22
- */
23
11
  get config() {
24
12
  return this._config;
25
13
  }
26
- /**
27
- * @param {?} value
28
- * @return {?}
29
- */
30
14
  set config(value) {
31
- this._config = Object.assign({}, value, { fields: value.fields.map((/**
32
- * @param {?} field
33
- * @return {?}
34
- */
35
- field => (Object.assign({}, field, { displayMinSelectedError: false, displayMaxSelectedError: false })))) });
15
+ this._config = Object.assign(Object.assign({}, value), { fields: value.fields.map(field => (Object.assign(Object.assign({}, field), { displayMinSelectedError: false, displayMaxSelectedError: false }))) });
36
16
  this._config = value;
37
17
  }
38
- /**
39
- * @return {?}
40
- */
41
18
  get settings() {
42
19
  return this._settings;
43
20
  }
44
- /**
45
- * @param {?} value
46
- * @return {?}
47
- */
48
21
  set settings(value) {
49
22
  if (!value) {
50
23
  this.getSettings();
@@ -54,13 +27,7 @@ export class GenericFilterComponent {
54
27
  }
55
28
  this._settings = value;
56
29
  }
57
- /**
58
- * @private
59
- * @param {?} field
60
- * @return {?}
61
- */
62
30
  static addFormValidators(field) {
63
- /** @type {?} */
64
31
  const validators = [];
65
32
  if (field && field.minSelected) {
66
33
  validators.push(minSelectedValidator(field.minSelected));
@@ -70,40 +37,25 @@ export class GenericFilterComponent {
70
37
  }
71
38
  return validators;
72
39
  }
73
- /**
74
- * @return {?}
75
- */
76
40
  ngOnInit() {
77
41
  if (!this.settings) {
78
42
  this.getSettings();
79
43
  }
80
44
  this.mergeDefaultFields(this.settings);
81
45
  this.buildForm(this.config, this.settings);
82
- this.formSub = this.form.valueChanges.subscribe((/**
83
- * @return {?}
84
- */
85
- () => this.submitted = false));
46
+ this.formSub = this.form.valueChanges.subscribe(() => this.submitted = false);
86
47
  }
87
- /**
88
- * @return {?}
89
- */
90
48
  ngOnDestroy() {
91
49
  if (this.formSub) {
92
50
  this.formSub.unsubscribe();
93
51
  }
94
52
  }
95
- /**
96
- * @param {?} field
97
- * @param {?} form
98
- * @return {?}
99
- */
100
53
  hidden(field, form) {
101
54
  if (!field.showCondition) {
102
55
  return false;
103
56
  }
104
57
  if (typeof field.showCondition === 'string') {
105
- /** @type {?} */
106
- const control = (/** @type {?} */ (form.get(field.name)));
58
+ const control = form.get(field.name);
107
59
  const [name, value] = field.showCondition.split('=');
108
60
  if (form.value && form.value[name] === value) {
109
61
  if (field.type === 'find-person') {
@@ -129,18 +81,12 @@ export class GenericFilterComponent {
129
81
  }
130
82
  return true;
131
83
  }
132
- /**
133
- * @param {?} field
134
- * @param {?} form
135
- * @return {?}
136
- */
137
84
  disabled(field, form) {
138
85
  if (!field.enableCondition) {
139
86
  return null;
140
87
  }
141
88
  if (typeof field.enableCondition === 'string') {
142
- /** @type {?} */
143
- const control = (/** @type {?} */ (form.get(field.name)));
89
+ const control = form.get(field.name);
144
90
  const [name, value] = field.enableCondition.split('=');
145
91
  if (form.value && form.value[name] === value) {
146
92
  if (field.type === 'find-person') {
@@ -172,10 +118,6 @@ export class GenericFilterComponent {
172
118
  // Note: field.disable decides whether to actually disable or not
173
119
  return field.disable ? field.disable : null;
174
120
  }
175
- /**
176
- * @param {?} form
177
- * @return {?}
178
- */
179
121
  applyFilter(form) {
180
122
  this.submitted = true;
181
123
  form.markAsTouched();
@@ -185,8 +127,7 @@ export class GenericFilterComponent {
185
127
  fields: this.getSelectedValues(form.value, this.config)
186
128
  };
187
129
  this.filterService.givenErrors.next(null);
188
- /** @type {?} */
189
- const settings = Object.assign({}, this.settings, { reset: false });
130
+ const settings = Object.assign(Object.assign({}, this.settings), { reset: false });
190
131
  this.filterService.persist(settings, this.config.persistence);
191
132
  }
192
133
  else {
@@ -194,11 +135,6 @@ export class GenericFilterComponent {
194
135
  }
195
136
  }
196
137
  // when domain changes ensure that person field is reset
197
- /**
198
- * @param {?} field
199
- * @param {?} form
200
- * @return {?}
201
- */
202
138
  fieldChanged(field, form) {
203
139
  // TODO - Do similar with jurisdiction/service for caseworkers by services
204
140
  if (field.changeResetFields && field.changeResetFields.length) {
@@ -208,37 +144,23 @@ export class GenericFilterComponent {
208
144
  }
209
145
  }
210
146
  // when user enters input change radio button
211
- /**
212
- * @param {?} field
213
- * @return {?}
214
- */
215
147
  inputChanged(field) {
216
148
  if (field.radioSelectionChange && typeof field.radioSelectionChange === 'string') {
217
149
  const [name, value] = field.enableCondition.split('=');
218
150
  this.form.get(name).patchValue(value);
219
151
  }
220
152
  }
221
- /**
222
- * @return {?}
223
- */
224
153
  cancelFilter() {
225
154
  this.buildForm(this.config, this.settings, true);
226
155
  if (this.config && this.config.cancelSetting) {
227
156
  this._settings.fields = JSON.parse(JSON.stringify(this.config.cancelSetting.fields));
228
157
  }
229
- /** @type {?} */
230
- const settings = Object.assign({}, this.settings, { reset: true });
158
+ const settings = Object.assign(Object.assign({}, this.settings), { reset: true });
231
159
  this.filterService.persist(settings, this.config.persistence);
232
160
  this.filterService.givenErrors.next(null);
233
161
  this.submitted = false;
234
162
  }
235
- /**
236
- * @param {?} values
237
- * @param {?} field
238
- * @return {?}
239
- */
240
163
  updatePersonControls(values, field) {
241
- /** @type {?} */
242
164
  let keys;
243
165
  if (!values) {
244
166
  keys = Object.keys(this.form.get(field.name).value);
@@ -248,128 +170,74 @@ export class GenericFilterComponent {
248
170
  }
249
171
  for (const key of keys) {
250
172
  if (this.form.get(field.name) && this.form.get(field.name).get(key)) {
251
- /** @type {?} */
252
173
  const value = values && values[key] ? values[key] : null;
253
174
  this.form.get(field.name).get(key).patchValue(value);
254
175
  }
255
176
  }
256
177
  }
257
- /**
258
- * @param {?} event
259
- * @param {?} form
260
- * @param {?} item
261
- * @param {?} field
262
- * @return {?}
263
- */
264
178
  toggleSelectAll(event, form, item, field) {
265
- /** @type {?} */
266
179
  const isChecked = event.target.checked;
267
- /** @type {?} */
268
- const formArray = (/** @type {?} */ (form.get(field.name)));
180
+ const formArray = form.get(field.name);
269
181
  if (!item.selectAll) {
270
- /** @type {?} */
271
- const allChecked = formArray.controls.every((/**
272
- * @param {?} control
273
- * @return {?}
274
- */
275
- (control) => control.value));
276
- /** @type {?} */
182
+ const allChecked = formArray.controls.every((control) => control.value);
277
183
  let index = null;
278
- /** @type {?} */
279
- const hasSelectAllOption = field.options.find((/**
280
- * @param {?} option
281
- * @param {?} i
282
- * @return {?}
283
- */
284
- (option, i) => {
184
+ const hasSelectAllOption = field.options.find((option, i) => {
285
185
  if (option.hasOwnProperty('selectAll')) {
286
186
  index = i;
287
187
  return true;
288
188
  }
289
189
  return false;
290
- }));
190
+ });
291
191
  // tslint:disable-next-line:variable-name
292
- /** @type {?} */
293
- const isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((/**
294
- * @param {?} _control
295
- * @param {?} i
296
- * @return {?}
297
- */
298
- (_control, i) => i !== index))
299
- .every((/**
300
- * @param {?} control
301
- * @return {?}
302
- */
303
- (control) => control.value));
192
+ const isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((_control, i) => i !== index)
193
+ .every((control) => control.value);
304
194
  if (!allChecked && hasSelectAllOption && !isChecked) {
305
- formArray.controls.forEach((/**
306
- * @param {?} control
307
- * @param {?} i
308
- * @return {?}
309
- */
310
- (control, i) => {
195
+ formArray.controls.forEach((control, i) => {
311
196
  if (index === i) {
312
197
  control.patchValue(false);
313
198
  return;
314
199
  }
315
- }));
200
+ });
316
201
  }
317
202
  else if (hasSelectAllOption && !allChecked && isChecked && isAllCheckedExcludingTheSelectAllOption) {
318
203
  formArray.controls[index].patchValue(true);
319
204
  }
320
- return;
321
- }
322
- formArray.controls.forEach((/**
323
- * @param {?} control
324
- * @return {?}
325
- */
326
- (control) => {
327
- if (isChecked) {
328
- control.patchValue(true);
329
- }
330
- else {
331
- control.patchValue(false);
205
+ }
206
+ else {
207
+ formArray.controls.forEach((control) => {
208
+ if (isChecked) {
209
+ control.patchValue(true);
210
+ }
211
+ else {
212
+ control.patchValue(false);
213
+ }
214
+ });
215
+ }
216
+ if (field.changeResetFields && field.changeResetFields.length) {
217
+ for (const resetField of field.changeResetFields) {
218
+ this.resetField(resetField, form);
332
219
  }
333
- }));
220
+ }
334
221
  }
335
- /**
336
- * @private
337
- * @param {?} resetField
338
- * @param {?} form
339
- * @return {?}
340
- */
341
222
  resetField(resetField, form) {
342
- /** @type {?} */
343
223
  const control = form.get(resetField);
344
- /** @type {?} */
345
- const defaultValue = this.config.cancelSetting.fields.find((/**
346
- * @param {?} f
347
- * @return {?}
348
- */
349
- (f) => f.name === resetField));
224
+ const defaultValue = this.config.cancelSetting.fields.find((f) => f.name === resetField);
350
225
  if (control instanceof FormArray) {
351
226
  for (let i = 0; i < control.length; i++) {
352
227
  control.removeAt(i);
353
228
  }
354
229
  }
355
230
  else if (control instanceof FormGroup) {
356
- /** @type {?} */
357
231
  const keys = Object.keys(control.value);
358
232
  for (const key of keys) {
359
233
  this.resetField(key, control);
360
234
  }
361
235
  }
362
236
  else if (control instanceof FormControl) {
363
- /** @type {?} */
364
237
  const value = defaultValue && defaultValue.value && defaultValue.value.length ? defaultValue.value[0] : null;
365
238
  control.setValue(value);
366
239
  }
367
240
  }
368
- /**
369
- * @private
370
- * @param {?} filter
371
- * @return {?}
372
- */
373
241
  mergeDefaultFields(filter) {
374
242
  if (filter) {
375
243
  filter.fields = this.filterService.get(this.config.id) ? this.filterService.get(this.config.id).fields : filter.fields;
@@ -381,22 +249,10 @@ export class GenericFilterComponent {
381
249
  };
382
250
  }
383
251
  }
384
- /**
385
- * @private
386
- * @return {?}
387
- */
388
252
  getSettings() {
389
253
  this._settings = this.filterService.get(this.config.id);
390
254
  }
391
- /**
392
- * @private
393
- * @param {?} config
394
- * @param {?} settings
395
- * @param {?=} reset
396
- * @return {?}
397
- */
398
255
  buildForm(config, settings, reset) {
399
- /** @type {?} */
400
256
  const findPersonControl = this.form ? this.form.get('findPersonControl') : null;
401
257
  this.form = this.fb.group({});
402
258
  if (findPersonControl) {
@@ -405,44 +261,29 @@ export class GenericFilterComponent {
405
261
  }
406
262
  for (const field of config.fields) {
407
263
  if (field.type === 'checkbox' || field.type === 'checkbox-large') {
408
- /** @type {?} */
409
264
  const formArray = this.buildCheckBoxFormArray(field, settings);
410
265
  this.form.addControl(field.name, formArray);
411
266
  }
412
267
  else if (field.type === 'find-location') {
413
- /** @type {?} */
414
268
  const formArray = this.buildFindLocationFormArray(field, settings);
415
269
  this.form.addControl(field.name, formArray);
416
270
  }
417
271
  else {
418
- /** @type {?} */
419
272
  const validators = [];
420
273
  if (field.minSelected && field.minSelected > 0) {
421
274
  validators.push(Validators.required);
422
275
  }
423
- /** @type {?} */
424
276
  let defaultValue = null;
425
277
  if (reset && config.cancelSetting) {
426
- /** @type {?} */
427
- const cancelField = config.cancelSetting.fields.find((/**
428
- * @param {?} f
429
- * @return {?}
430
- */
431
- (f) => f.name === field.name));
278
+ const cancelField = config.cancelSetting.fields.find((f) => f.name === field.name);
432
279
  defaultValue = cancelField && cancelField.value ? cancelField.value[0] : '';
433
280
  }
434
281
  else if (settings && settings.fields) {
435
- /** @type {?} */
436
- const lastSavedValue = settings.fields.find((/**
437
- * @param {?} f
438
- * @return {?}
439
- */
440
- (f) => f.name === field.name));
282
+ const lastSavedValue = settings.fields.find((f) => f.name === field.name);
441
283
  defaultValue = lastSavedValue && lastSavedValue ? lastSavedValue.value[0] : '';
442
284
  }
443
285
  // if field is find-person build a form group;
444
286
  if (field.type === 'find-person') {
445
- /** @type {?} */
446
287
  const formGroup = new FormGroup({
447
288
  domain: new FormControl(''),
448
289
  email: new FormControl(defaultValue && defaultValue.hasOwnProperty('email') ? defaultValue.email : '', validators),
@@ -453,7 +294,6 @@ export class GenericFilterComponent {
453
294
  this.form.addControl(field.name, formGroup);
454
295
  }
455
296
  else {
456
- /** @type {?} */
457
297
  const control = new FormControl(defaultValue, validators);
458
298
  this.form.addControl(field.name, control);
459
299
  }
@@ -464,59 +304,28 @@ export class GenericFilterComponent {
464
304
  }
465
305
  }
466
306
  }
467
- /**
468
- * @private
469
- * @param {?} field
470
- * @param {?} settings
471
- * @return {?}
472
- */
473
307
  buildCheckBoxFormArray(field, settings) {
474
- /** @type {?} */
475
308
  const validators = GenericFilterComponent.addFormValidators(field);
476
- /** @type {?} */
477
309
  const formArray = this.fb.array([], validators);
478
- /** @type {?} */
479
310
  let defaultValues;
480
311
  if (settings && settings.fields) {
481
- defaultValues = settings.fields.find((/**
482
- * @param {?} f
483
- * @return {?}
484
- */
485
- (f) => f.name === field.name));
312
+ defaultValues = settings.fields.find((f) => f.name === field.name);
486
313
  }
487
314
  for (const option of field.options) {
488
- /** @type {?} */
489
315
  let checked = false;
490
316
  if (defaultValues && Array.isArray(defaultValues.value)) {
491
- checked = !!defaultValues.value.find((/**
492
- * @param {?} value
493
- * @return {?}
494
- */
495
- (value) => value === option.key));
317
+ checked = !!defaultValues.value.find((value) => value === option.key);
496
318
  }
497
319
  formArray.push(new FormControl(checked));
498
320
  }
499
321
  return formArray;
500
322
  }
501
- /**
502
- * @private
503
- * @param {?} field
504
- * @param {?} settings
505
- * @return {?}
506
- */
507
323
  buildFindLocationFormArray(field, settings) {
508
- /** @type {?} */
509
324
  const validators = GenericFilterComponent.addFormValidators(field);
510
- /** @type {?} */
511
325
  const formArray = this.fb.array([], validators);
512
- /** @type {?} */
513
326
  let defaultValues;
514
327
  if (settings && settings.fields) {
515
- defaultValues = settings.fields.find((/**
516
- * @param {?} f
517
- * @return {?}
518
- */
519
- (f) => f.name === field.name));
328
+ defaultValues = settings.fields.find((f) => f.name === field.name);
520
329
  if (defaultValues && defaultValues.value && defaultValues.value.length > 0) {
521
330
  for (const defaultValue of defaultValues.value) {
522
331
  formArray.push(new FormControl(defaultValue));
@@ -525,27 +334,11 @@ export class GenericFilterComponent {
525
334
  }
526
335
  return formArray;
527
336
  }
528
- /**
529
- * @private
530
- * @param {?} formValues
531
- * @param {?} config
532
- * @return {?}
533
- */
534
337
  getSelectedValues(formValues, config) {
535
- return Object.keys(formValues).map((/**
536
- * @param {?} name
537
- * @return {?}
538
- */
539
- (name) => {
540
- /** @type {?} */
338
+ return Object.keys(formValues).map((name) => {
541
339
  const values = formValues[name];
542
340
  if (Array.isArray(values)) {
543
- /** @type {?} */
544
- const field = config.fields.find((/**
545
- * @param {?} f
546
- * @return {?}
547
- */
548
- f => f.name === name));
341
+ const field = config.fields.find(f => f.name === name);
549
342
  if (field.type === 'find-location') {
550
343
  return { value: values, name };
551
344
  }
@@ -556,18 +349,11 @@ export class GenericFilterComponent {
556
349
  else {
557
350
  return { value: [values], name };
558
351
  }
559
- }));
352
+ });
560
353
  }
561
- /**
562
- * @private
563
- * @param {?} form
564
- * @return {?}
565
- */
566
354
  emitFormErrors(form) {
567
- /** @type {?} */
568
355
  const errors = [];
569
356
  for (const field of this.config.fields) {
570
- /** @type {?} */
571
357
  const formGroup = form.get(field.name);
572
358
  if (formGroup && formGroup.errors && formGroup.errors.minLength) {
573
359
  errors.push({ name: field.name, error: field.minSelectedError });
@@ -588,9 +374,8 @@ GenericFilterComponent.decorators = [
588
374
  changeDetection: ChangeDetectionStrategy.OnPush,
589
375
  encapsulation: ViewEncapsulation.None,
590
376
  styles: [".contain-classes .elevated-break{position:relative;top:-10px}.contain-classes .xui-generic-filter .select-all{margin-bottom:10px}.contain-classes .xui-generic-filter .govuk-checkboxes{display:flex;flex-wrap:wrap}.contain-classes .xui-generic-filter .govuk-checkboxes>div{flex-grow:1;flex-shrink:0}"]
591
- }] }
377
+ },] }
592
378
  ];
593
- /** @nocollapse */
594
379
  GenericFilterComponent.ctorParameters = () => [
595
380
  { type: FilterService },
596
381
  { type: FormBuilder }
@@ -599,32 +384,4 @@ GenericFilterComponent.propDecorators = {
599
384
  config: [{ type: Input }],
600
385
  settings: [{ type: Input }]
601
386
  };
602
- if (false) {
603
- /** @type {?} */
604
- GenericFilterComponent.prototype.form;
605
- /** @type {?} */
606
- GenericFilterComponent.prototype.submitted;
607
- /** @type {?} */
608
- GenericFilterComponent.prototype.formSub;
609
- /**
610
- * @type {?}
611
- * @private
612
- */
613
- GenericFilterComponent.prototype._config;
614
- /**
615
- * @type {?}
616
- * @private
617
- */
618
- GenericFilterComponent.prototype._settings;
619
- /**
620
- * @type {?}
621
- * @private
622
- */
623
- GenericFilterComponent.prototype.filterService;
624
- /**
625
- * @type {?}
626
- * @private
627
- */
628
- GenericFilterComponent.prototype.fb;
629
- }
630
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQWtCLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4SCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBUzdGLE1BQU0sT0FBTyxzQkFBc0I7Ozs7O0lBS2pDLFlBQTZCLGFBQTRCLEVBQW1CLEVBQWU7UUFBOUQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBbUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUhwRixjQUFTLEdBQUcsS0FBSyxDQUFDO0lBSXpCLENBQUM7Ozs7SUFLRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQzs7Ozs7SUFFRCxJQUNXLE1BQU0sQ0FBQyxLQUFtQjtRQUNuQyxJQUFJLENBQUMsT0FBTyxxQkFDUCxLQUFLLElBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRzs7OztZQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsbUJBQzdCLEtBQUssSUFDUix1QkFBdUIsRUFBRSxLQUFLLEVBQzlCLHVCQUF1QixFQUFFLEtBQUssSUFDOUIsRUFBQyxHQUNKLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxH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QUFDLENBQUM7YUFDaEU7WUFDRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7YUFDaEU7U0FDRjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDOzs7WUFuWUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLHk3TkFBNEM7Z0JBRTVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDdEM7Ozs7WUFUTyxhQUFhO1lBSGUsV0FBVzs7O3FCQTRCNUMsS0FBSzt1QkFvQkwsS0FBSzs7OztJQWxDTixzQ0FBdUI7O0lBQ3ZCLDJDQUF5Qjs7SUFDekIseUNBQTZCOzs7OztJQU03Qix5Q0FBOEI7Ozs7O0lBb0I5QiwyQ0FBa0M7Ozs7O0lBeEJ0QiwrQ0FBNkM7Ozs7O0lBQUUsb0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGaWx0ZXJDb25maWcsIEZpbHRlckVycm9yLCBGaWx0ZXJGaWVsZENvbmZpZywgRmlsdGVyU2V0dGluZ30gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7RmlsdGVyU2VydmljZX0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9maWx0ZXIvZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtnZXRWYWx1ZXMsIG1heFNlbGVjdGVkVmFsaWRhdG9yLCBtaW5TZWxlY3RlZFZhbGlkYXRvcn0gZnJvbSAnLi9nZW5lcmljLWZpbHRlci11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aWxpYi1nZW5lcmljLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcbiAgcHVibGljIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICBwdWJsaWMgZm9ybVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2NvbmZpZzogRmlsdGVyQ29uZmlnO1xuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IEZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBGaWx0ZXJDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGZpZWxkczogdmFsdWUuZmllbGRzLm1hcChmaWVsZCA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgZGlzcGxheU1pblNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TWF4U2VsZWN0ZWRFcnJvcjogZmFsc2UsXG4gICAgICB9KSlcbiAgICB9O1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfc2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5nO1xuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogRmlsdGVyU2V0dGluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZXR0aW5ncyh2YWx1ZTogRmlsdGVyU2V0dGluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmZpZWxkcykge1xuICAgICAgdGhpcy5tZXJnZURlZmF1bHRGaWVsZHModmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXR0aW5ncyA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnKTogVmFsaWRhdG9ycyB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5taW5TZWxlY3RlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1pblNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1pblNlbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLm1heFNlbGVjdGVkKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2gobWF4U2VsZWN0ZWRWYWxpZGF0b3IoZmllbGQubWF4U2VsZWN0ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHRoaXMuc2V0dGluZ3MpO1xuICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMuY29uZmlnLCB0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmZvcm1TdWIgPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtU3ViKSB7XG4gICAgICB0aGlzLmZvcm1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGlkZGVuKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5zaG93Q29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmllbGQuc2hvd0NvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5zaG93Q29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZC5lbmFibGVDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLmVuYWJsZUNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChmaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBmaWVsZC5lbmFibGVDb25kaXRpb24uc3BsaXQoJz0nKTtcbiAgICAgIGlmIChmb3JtLnZhbHVlICYmIGZvcm0udmFsdWVbbmFtZV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBmaW5kLWxvY2F0aW9uIGlzIHNwZWNpYWwgY2FzZSB3aGVyZSBuZWVkIHRvIHJlc2V0IHRleHRib3ggKGJ5IGV4aXN0aW5nIGRpc2FibGluZyBmdW5jdGlvbmFsaXR5KVxuICAgIC8vIGZpZWxkLmRpc2FibGUgcmVmZXJyZWQgdG8gY29tcG9uZW50IGl0c2VsZlxuICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1sb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBOb3RlOiBmaWVsZC5kaXNhYmxlIGRlY2lkZXMgd2hldGhlciB0byBhY3R1YWxseSBkaXNhYmxlIG9yIG5vdFxuICAgIHJldHVybiBmaWVsZC5kaXNhYmxlID8gZmllbGQuZGlzYWJsZSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXIoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGZvcm0ubWFya0FzVG91Y2hlZCgpO1xuICAgIGlmIChmb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0U2VsZWN0ZWRWYWx1ZXMoZm9ybS52YWx1ZSwgdGhpcy5jb25maWcpXG4gICAgICB9O1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmdpdmVuRXJyb3JzLm5leHQobnVsbCk7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHsuLi50aGlzLnNldHRpbmdzLCByZXNldDogZmFsc2V9O1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBlcnNpc3Qoc2V0dGluZ3MsIHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Rm9ybUVycm9ycyhmb3JtKTtcbiAgICB9XG4gIH1cblxuICAvLyB3aGVuIGRvbWFpbiBjaGFuZ2VzIGVuc3VyZSB0aGF0IHBlcnNvbiBmaWVsZCBpcyByZXNldFxuICBwdWJsaWMgZmllbGRDaGFuZ2VkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgLy8gVE9ETyAtIERvIHNpbWlsYXIgd2l0aCBqdXJpc2RpY3Rpb24vc2VydmljZSBmb3IgY2FzZXdvcmtlcnMgYnkgc2VydmljZXNcbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHdoZW4gdXNlciBlbnRlcnMgaW5wdXQgY2hhbmdlIHJhZGlvIGJ1dHRvblxuICBwdWJsaWMgaW5wdXRDaGFuZ2VkKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmIChmaWVsZC5yYWRpb1NlbGVjdGlvbkNoYW5nZSAmJiB0eXBlb2YgZmllbGQucmFkaW9TZWxlY3Rpb25DaGFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuZW5hYmxlQ29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KG5hbWUpLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEZvcm0odGhpcy5jb25maWcsIHRoaXMuc2V0dGluZ3MsIHRydWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncy5maWVsZHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzKSk7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gey4uLnRoaXMuc2V0dGluZ3MsIHJlc2V0OiB0cnVlfTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdChzZXR0aW5ncywgdGhpcy5jb25maWcucGVyc2lzdGVuY2UpO1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUGVyc29uQ29udHJvbHModmFsdWVzOiBhbnksIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGxldCBrZXlzO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAodGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKSAmJiB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzICYmIHZhbHVlc1trZXldID8gdmFsdWVzW2tleV0gOiBudWxsO1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KGZpZWxkLm5hbWUpLmdldChrZXkpLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IGFueSwgZm9ybTogRm9ybUdyb3VwLCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBzZWxlY3RBbGw/OiB0cnVlIH0sIGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIGNvbnN0IGZvcm1BcnJheTogRm9ybUFycmF5ID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUFycmF5O1xuICAgIGlmICghaXRlbS5zZWxlY3RBbGwpIHtcbiAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSBmb3JtQXJyYXkuY29udHJvbHMuZXZlcnkoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gY29udHJvbC52YWx1ZSk7XG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgICBjb25zdCBoYXNTZWxlY3RBbGxPcHRpb24gPSBmaWVsZC5vcHRpb25zLmZpbmQoKG9wdGlvbiwgaSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmhhc093blByb3BlcnR5KCdzZWxlY3RBbGwnKSkge1xuICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgICBjb25zdCBpc0FsbENoZWNrZWRFeGNsdWRpbmdUaGVTZWxlY3RBbGxPcHRpb24gPSBmb3JtQXJyYXkuY29udHJvbHMuZmlsdGVyKChfY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpOiBudW1iZXIpID0+IGkgIT09IGluZGV4KVxuICAgICAgICAuZXZlcnkoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gY29udHJvbC52YWx1ZSk7XG5cbiAgICAgIGlmICghYWxsQ2hlY2tlZCAmJiBoYXNTZWxlY3RBbGxPcHRpb24gJiYgIWlzQ2hlY2tlZCkge1xuICAgICAgICBmb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzU2VsZWN0QWxsT3B0aW9uICYmICFhbGxDaGVja2VkICYmIGlzQ2hlY2tlZCAmJiBpc0FsbENoZWNrZWRFeGNsdWRpbmdUaGVTZWxlY3RBbGxPcHRpb24pIHtcbiAgICAgICAgZm9ybUFycmF5LmNvbnRyb2xzW2luZGV4XS5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmllbGQocmVzZXRGaWVsZDogc3RyaW5nLCBmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQocmVzZXRGaWVsZCk7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlOiB7IG5hbWU6IHN0cmluZywgdmFsdWU6IGFueVtdIH0gPSB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IHJlc2V0RmllbGQpO1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29udHJvbC5yZW1vdmVBdChpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9sLnZhbHVlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKGtleSwgY29udHJvbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZSAmJiBkZWZhdWx0VmFsdWUudmFsdWUubGVuZ3RoID8gZGVmYXVsdFZhbHVlLnZhbHVlWzBdIDogbnVsbDtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VEZWZhdWx0RmllbGRzKGZpbHRlcjogRmlsdGVyU2V0dGluZyk6IHZvaWQge1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGZpbHRlci5maWVsZHMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKSA/IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpLmZpZWxkcyA6IGZpbHRlci5maWVsZHM7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgICBmaWVsZHM6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmdzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybShjb25maWc6IEZpbHRlckNvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcsIHJlc2V0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGZpbmRQZXJzb25Db250cm9sID0gdGhpcy5mb3JtID8gdGhpcy5mb3JtLmdldCgnZmluZFBlcnNvbkNvbnRyb2wnKSA6IG51bGw7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgaWYgKGZpbmRQZXJzb25Db250cm9sKSB7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiBmaW5kIHBlcnNvbiBjb21wb25lbnQsIGNvbnRyb2wgbmVlZHMgdG8gYmUga2VwdFxuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2ZpbmRQZXJzb25Db250cm9sJywgZmluZFBlcnNvbkNvbnRyb2wpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGNvbmZpZy5maWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnY2hlY2tib3gnIHx8IGZpZWxkLnR5cGUgPT09ICdjaGVja2JveC1sYXJnZScpIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5idWlsZENoZWNrQm94Rm9ybUFycmF5KGZpZWxkLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1BcnJheSk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLWxvY2F0aW9uJykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkRmluZExvY2F0aW9uRm9ybUFycmF5KGZpZWxkLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1BcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XG4gICAgICAgIGlmIChmaWVsZC5taW5TZWxlY3RlZCAmJiBmaWVsZC5taW5TZWxlY3RlZCA+IDApIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbDtcbiAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy5jYW5jZWxTZXR0aW5nKSB7XG4gICAgICAgICAgY29uc3QgY2FuY2VsRmllbGQgPSBjb25maWcuY2FuY2VsU2V0dGluZy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjYW5jZWxGaWVsZCAmJiBjYW5jZWxGaWVsZC52YWx1ZSA/IGNhbmNlbEZpZWxkLnZhbHVlWzBdIDogJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFNhdmVkVmFsdWUgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBsYXN0U2F2ZWRWYWx1ZSAmJiBsYXN0U2F2ZWRWYWx1ZSA/IGxhc3RTYXZlZFZhbHVlLnZhbHVlWzBdIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZmllbGQgaXMgZmluZC1wZXJzb24gYnVpbGQgYSBmb3JtIGdyb3VwO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICAgICAgZG9tYWluOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgICAgZW1haWw6IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLmhhc093blByb3BlcnR5KCdlbWFpbCcpID8gZGVmYXVsdFZhbHVlLmVtYWlsIDogJycsIHZhbGlkYXRvcnMpLFxuICAgICAgICAgICAgaWQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgICAga25vd25BczogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBmb3JtR3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZC5uYW1lLCBjb250cm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGZpZWxkIHVwZGF0ZXMgZmluZCBwZXJzb24gY29tcG9uZW50IHNldCB0aGUgaW5pdGlhbCBkb21haW5cbiAgICAgICAgaWYgKGZpZWxkLmZpbmRQZXJzb25GaWVsZCkge1xuICAgICAgICAgIHRoaXMuZmllbGRDaGFuZ2VkKGZpZWxkLCB0aGlzLmZvcm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENoZWNrQm94Rm9ybUFycmF5KGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcpOiBGb3JtQXJyYXkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBHZW5lcmljRmlsdGVyQ29tcG9uZW50LmFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkKTtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdLCB2YWxpZGF0b3JzKTtcbiAgICBsZXQgZGVmYXVsdFZhbHVlcztcbiAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuZmllbGRzKSB7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gc2V0dGluZ3MuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnMpIHtcbiAgICAgIGxldCBjaGVja2VkID0gZmFsc2U7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlcyAmJiBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMudmFsdWUpKSB7XG4gICAgICAgIGNoZWNrZWQgPSAhIWRlZmF1bHRWYWx1ZXMudmFsdWUuZmluZCgodmFsdWUpID0+IHZhbHVlID09PSBvcHRpb24ua2V5KTtcbiAgICAgIH1cbiAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbChjaGVja2VkKSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmluZExvY2F0aW9uRm9ybUFycmF5KGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZywgc2V0dGluZ3M6IEZpbHRlclNldHRpbmcpOiBGb3JtQXJyYXkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBHZW5lcmljRmlsdGVyQ29tcG9uZW50LmFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkKTtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdLCB2YWxpZGF0b3JzKTtcbiAgICBsZXQgZGVmYXVsdFZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnlbXSB9O1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIGRlZmF1bHRWYWx1ZXMudmFsdWUgJiYgZGVmYXVsdFZhbHVlcy52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVmYXVsdFZhbHVlIG9mIGRlZmF1bHRWYWx1ZXMudmFsdWUpIHtcbiAgICAgICAgICBmb3JtQXJyYXkucHVzaChuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRWYWx1ZXMoZm9ybVZhbHVlczogYW55LCBjb25maWc6IEZpbHRlckNvbmZpZyk6IGFueSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZvcm1WYWx1ZXMpLm1hcCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtVmFsdWVzW25hbWVdO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1sb2NhdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiB2YWx1ZXMsIG5hbWV9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGdldFZhbHVlcyhmaWVsZC5vcHRpb25zLCB2YWx1ZXMpLCBuYW1lfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogW3ZhbHVlc10sIG5hbWV9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Rm9ybUVycm9ycyhmb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvcnM6IEZpbHRlckVycm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuY29uZmlnLmZpZWxkcykge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybS5nZXQoZmllbGQubmFtZSk7XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5taW5MZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5lcnJvcnMgJiYgZm9ybUdyb3VwLmVycm9ycy5tYXhMZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe25hbWU6IGZpZWxkLm5hbWUsIGVycm9yOiBmaWVsZC5taW5TZWxlY3RlZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChlcnJvcnMpO1xuICAgIH1cbiAgfVxufVxuIl19
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh1aS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9nZW5lcmljLWZpbHRlci9nZW5lcmljLWZpbHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBa0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUMsU0FBUyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFTN0YsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQyxZQUE2QixhQUE0QixFQUFtQixFQUFlO1FBQTlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQW1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFIcEYsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUl6QixDQUFDO0lBS0QsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUNXLE1BQU0sQ0FBQyxLQUFtQjtRQUNuQyxJQUFJLENBQUMsT0FBTyxtQ0FDUCxLQUFLLEtBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUNBQzdCLEtBQUssS0FDUix1QkFBdUIsRUFBRSxLQUFLLEVBQzlCLHVCQUF1QixFQUFFLEtBQUssSUFDOUIsQ0FBQyxHQUNKLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFH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ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmlsdGVyQ29uZmlnLCBGaWx0ZXJFcnJvciwgRmlsdGVyRmllbGRDb25maWcsIEZpbHRlclNldHRpbmd9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0ZpbHRlclNlcnZpY2V9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvZmlsdGVyL2ZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7Z2V0VmFsdWVzLCBtYXhTZWxlY3RlZFZhbGlkYXRvciwgbWluU2VsZWN0ZWRWYWxpZGF0b3J9IGZyb20gJy4vZ2VuZXJpYy1maWx0ZXItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWlsaWItZ2VuZXJpYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1TdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyKSB7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jb25maWc6IEZpbHRlckNvbmZpZztcblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBmaWVsZHM6IHZhbHVlLmZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgICAgLi4uZmllbGQsXG4gICAgICAgIGRpc3BsYXlNaW5TZWxlY3RlZEVycm9yOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU1heFNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgfSkpXG4gICAgfTtcbiAgICB0aGlzLl9jb25maWcgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3NldHRpbmdzPzogRmlsdGVyU2V0dGluZztcblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IEZpbHRlclNldHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2V0dGluZ3ModmFsdWU6IEZpbHRlclNldHRpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5maWVsZHMpIHtcbiAgICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IFZhbGlkYXRvcnMge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAoZmllbGQgJiYgZmllbGQubWluU2VsZWN0ZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChtaW5TZWxlY3RlZFZhbGlkYXRvcihmaWVsZC5taW5TZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5tYXhTZWxlY3RlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1heFNlbGVjdGVkKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICB0aGlzLm1lcmdlRGVmYXVsdEZpZWxkcyh0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5mb3JtU3ViID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybVN1Yikge1xuICAgICAgdGhpcy5mb3JtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGRlbihmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuc2hvd0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLnNob3dDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuc2hvd0NvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgaWYgKGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZVtuYW1lXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuZW5hYmxlQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWVsZC5lbmFibGVDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuZW5hYmxlQ29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmluZC1sb2NhdGlvbiBpcyBzcGVjaWFsIGNhc2Ugd2hlcmUgbmVlZCB0byByZXNldCB0ZXh0Ym94IChieSBleGlzdGluZyBkaXNhYmxpbmcgZnVuY3Rpb25hbGl0eSlcbiAgICAvLyBmaWVsZC5kaXNhYmxlIHJlZmVycmVkIHRvIGNvbXBvbmVudCBpdHNlbGZcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gTm90ZTogZmllbGQuZGlzYWJsZSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0dWFsbHkgZGlzYWJsZSBvciBub3RcbiAgICByZXR1cm4gZmllbGQuZGlzYWJsZSA/IGZpZWxkLmRpc2FibGUgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICBmb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICBpZiAoZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5fc2V0dGluZ3MgPSB7XG4gICAgICAgIGlkOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldFNlbGVjdGVkVmFsdWVzKGZvcm0udmFsdWUsIHRoaXMuY29uZmlnKVxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7Li4udGhpcy5zZXR0aW5ncywgcmVzZXQ6IGZhbHNlfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5wZXJzaXN0KHNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdEZvcm1FcnJvcnMoZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgLy8gd2hlbiBkb21haW4gY2hhbmdlcyBlbnN1cmUgdGhhdCBwZXJzb24gZmllbGQgaXMgcmVzZXRcbiAgcHVibGljIGZpZWxkQ2hhbmdlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIC8vIFRPRE8gLSBEbyBzaW1pbGFyIHdpdGgganVyaXNkaWN0aW9uL3NlcnZpY2UgZm9yIGNhc2V3b3JrZXJzIGJ5IHNlcnZpY2VzXG4gICAgaWYgKGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzICYmIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzLmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCByZXNldEZpZWxkIG9mIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWVsZChyZXNldEZpZWxkLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB3aGVuIHVzZXIgZW50ZXJzIGlucHV0IGNoYW5nZSByYWRpbyBidXR0b25cbiAgcHVibGljIGlucHV0Q2hhbmdlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoZmllbGQucmFkaW9TZWxlY3Rpb25DaGFuZ2UgJiYgdHlwZW9mIGZpZWxkLnJhZGlvU2VsZWN0aW9uQ2hhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGZpZWxkLmVuYWJsZUNvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgdGhpcy5mb3JtLmdldChuYW1lKS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMuY29uZmlnLCB0aGlzLnNldHRpbmdzLCB0cnVlKTtcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuY2FuY2VsU2V0dGluZykge1xuICAgICAgdGhpcy5fc2V0dGluZ3MuZmllbGRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHsuLi50aGlzLnNldHRpbmdzLCByZXNldDogdHJ1ZX07XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBlcnNpc3Qoc2V0dGluZ3MsIHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlKTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChudWxsKTtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVBlcnNvbkNvbnRyb2xzKHZhbHVlczogYW55LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBsZXQga2V5cztcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModmFsdWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkgJiYgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlcyAmJiB2YWx1ZXNba2V5XSA/IHZhbHVlc1trZXldIDogbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBhbnksIGZvcm06IEZvcm1Hcm91cCwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgc2VsZWN0QWxsPzogdHJ1ZSB9LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcbiAgICBjb25zdCBmb3JtQXJyYXk6IEZvcm1BcnJheSA9IGZvcm0uZ2V0KGZpZWxkLm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAoIWl0ZW0uc2VsZWN0QWxsKSB7XG4gICAgICBjb25zdCBhbGxDaGVja2VkID0gZm9ybUFycmF5LmNvbnRyb2xzLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgICAgY29uc3QgaGFzU2VsZWN0QWxsT3B0aW9uID0gZmllbGQub3B0aW9ucy5maW5kKChvcHRpb24sIGkpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0QWxsJykpIHtcbiAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgICAgY29uc3QgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbHRlcigoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICBpZiAoIWFsbENoZWNrZWQgJiYgaGFzU2VsZWN0QWxsT3B0aW9uICYmICFpc0NoZWNrZWQpIHtcbiAgICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc1NlbGVjdEFsbE9wdGlvbiAmJiAhYWxsQ2hlY2tlZCAmJiBpc0NoZWNrZWQgJiYgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICAgIGZvcm1BcnJheS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWVsZChyZXNldEZpZWxkOiBzdHJpbmcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChyZXNldEZpZWxkKTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWU6IHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55W10gfSA9IHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gcmVzZXRGaWVsZCk7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250cm9sLnJlbW92ZUF0KGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2wudmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQoa2V5LCBjb250cm9sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLnZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZS5sZW5ndGggPyBkZWZhdWx0VmFsdWUudmFsdWVbMF0gOiBudWxsO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRGaWVsZHMoZmlsdGVyOiBGaWx0ZXJTZXR0aW5nKTogdm9pZCB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpID8gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCkuZmllbGRzIDogZmlsdGVyLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0ge1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIGZpZWxkczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKGNvbmZpZzogRmlsdGVyQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZywgcmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFBlcnNvbkNvbnRyb2wgPSB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0KCdmaW5kUGVyc29uQ29udHJvbCcpIDogbnVsbDtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBpZiAoZmluZFBlcnNvbkNvbnRyb2wpIHtcbiAgICAgIC8vIGluIG9yZGVyIHRvIG1haW50YWluIGZpbmQgcGVyc29uIGNvbXBvbmVudCwgY29udHJvbCBuZWVkcyB0byBiZSBrZXB0XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCgnZmluZFBlcnNvbkNvbnRyb2wnLCBmaW5kUGVyc29uQ29udHJvbCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgY29uZmlnLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94LWxhcmdlJykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkLm1pblNlbGVjdGVkICYmIGZpZWxkLm1pblNlbGVjdGVkID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgICAgICBjb25zdCBjYW5jZWxGaWVsZCA9IGNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNhbmNlbEZpZWxkICYmIGNhbmNlbEZpZWxkLnZhbHVlID8gY2FuY2VsRmllbGQudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBsYXN0U2F2ZWRWYWx1ZSA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGxhc3RTYXZlZFZhbHVlICYmIGxhc3RTYXZlZFZhbHVlID8gbGFzdFNhdmVkVmFsdWUudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZCBpcyBmaW5kLXBlcnNvbiBidWlsZCBhIGZvcm0gZ3JvdXA7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBkb21haW46IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2VtYWlsJykgPyBkZWZhdWx0VmFsdWUuZW1haWwgOiAnJywgdmFsaWRhdG9ycyksXG4gICAgICAgICAgICBpZDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBrbm93bkFzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1Hcm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZmllbGQgdXBkYXRlcyBmaW5kIHBlcnNvbiBjb21wb25lbnQgc2V0IHRoZSBpbml0aWFsIGRvbWFpblxuICAgICAgICBpZiAoZmllbGQuZmluZFBlcnNvbkZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5maWVsZENoYW5nZWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgZmllbGQub3B0aW9ucykge1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlcy52YWx1ZSkpIHtcbiAgICAgICAgY2hlY2tlZCA9ICEhZGVmYXVsdFZhbHVlcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG9wdGlvbi5rZXkpO1xuICAgICAgfVxuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGNoZWNrZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueVtdIH07XG4gICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzLmZpZWxkcykge1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlcy52YWx1ZSAmJiBkZWZhdWx0VmFsdWVzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWZhdWx0VmFsdWUgb2YgZGVmYXVsdFZhbHVlcy52YWx1ZSkge1xuICAgICAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFZhbHVlcyhmb3JtVmFsdWVzOiBhbnksIGNvbmZpZzogRmlsdGVyQ29uZmlnKTogYW55IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybVZhbHVlcykubWFwKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1WYWx1ZXNbbmFtZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLWxvY2F0aW9uJykge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHZhbHVlcywgbmFtZX07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogZ2V0VmFsdWVzKGZpZWxkLm9wdGlvbnMsIHZhbHVlcyksIG5hbWV9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3ZhbHVlOiBbdmFsdWVzXSwgbmFtZX07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRGb3JtRXJyb3JzKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yczogRmlsdGVyRXJyb3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5jb25maWcuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1pbkxlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1heExlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KGVycm9ycyk7XG4gICAgfVxuICB9XG59XG4iXX0=