@impartner/design-components 3.0.2 → 4.0.1

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 (442) hide show
  1. package/README.md +9 -8
  2. package/fesm2022/impartner-design-components.mjs +1668 -972
  3. package/fesm2022/impartner-design-components.mjs.map +1 -1
  4. package/index.d.ts +3634 -3
  5. package/package.json +9 -12
  6. package/constants/fontawesome-icons.d.ts +0 -6
  7. package/constants/index.d.ts +0 -1
  8. package/esm2022/constants/fontawesome-icons.mjs +0 -3012
  9. package/esm2022/constants/index.mjs +0 -2
  10. package/esm2022/impartner-design-components.mjs +0 -5
  11. package/esm2022/lib/alert/alert.component.mjs +0 -106
  12. package/esm2022/lib/alert/alert.module.mjs +0 -19
  13. package/esm2022/lib/alert/index.mjs +0 -4
  14. package/esm2022/lib/alert/theme/alert-theme.mjs +0 -2
  15. package/esm2022/lib/alert/theme/index.mjs +0 -2
  16. package/esm2022/lib/avatar/avatar.component.mjs +0 -48
  17. package/esm2022/lib/avatar/avatar.module.mjs +0 -19
  18. package/esm2022/lib/avatar/index.mjs +0 -3
  19. package/esm2022/lib/avatar-group/avatar-group.component.mjs +0 -16
  20. package/esm2022/lib/avatar-group/avatar-group.module.mjs +0 -19
  21. package/esm2022/lib/avatar-group/index.mjs +0 -3
  22. package/esm2022/lib/backdrop/backdrop.component.mjs +0 -52
  23. package/esm2022/lib/backdrop/backdrop.module.mjs +0 -19
  24. package/esm2022/lib/backdrop/index.mjs +0 -3
  25. package/esm2022/lib/badge/badge.component.mjs +0 -121
  26. package/esm2022/lib/badge/badge.module.mjs +0 -20
  27. package/esm2022/lib/badge/index.mjs +0 -4
  28. package/esm2022/lib/badge/types/badge-icon.mjs +0 -2
  29. package/esm2022/lib/badge/types/badge-size.mjs +0 -7
  30. package/esm2022/lib/badge/types/index.mjs +0 -2
  31. package/esm2022/lib/branding/branded.directive.mjs +0 -19
  32. package/esm2022/lib/branding/branding.module.mjs +0 -19
  33. package/esm2022/lib/branding/index.mjs +0 -3
  34. package/esm2022/lib/breadcrumb/breadcrumb-item.component.mjs +0 -25
  35. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -37
  36. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -19
  37. package/esm2022/lib/breadcrumb/index.mjs +0 -4
  38. package/esm2022/lib/button/button.component.mjs +0 -116
  39. package/esm2022/lib/button/button.module.mjs +0 -21
  40. package/esm2022/lib/button/index.mjs +0 -4
  41. package/esm2022/lib/button/themes/button-theme.mjs +0 -2
  42. package/esm2022/lib/button/themes/index.mjs +0 -2
  43. package/esm2022/lib/button-group/button-group.component.mjs +0 -52
  44. package/esm2022/lib/button-group/button-group.module.mjs +0 -20
  45. package/esm2022/lib/button-group/index.mjs +0 -3
  46. package/esm2022/lib/card-heading/card-heading.component.mjs +0 -30
  47. package/esm2022/lib/card-heading/card-heading.module.mjs +0 -19
  48. package/esm2022/lib/card-heading/index.mjs +0 -3
  49. package/esm2022/lib/data-card/data-card.component.mjs +0 -123
  50. package/esm2022/lib/data-card/data-card.module.mjs +0 -21
  51. package/esm2022/lib/data-card/index.mjs +0 -3
  52. package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +0 -105
  53. package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +0 -2
  54. package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +0 -33
  55. package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +0 -2
  56. package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +0 -369
  57. package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +0 -2
  58. package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +0 -367
  59. package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +0 -2
  60. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +0 -68
  61. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +0 -2
  62. package/esm2022/lib/datetime-picker/components/index.mjs +0 -6
  63. package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +0 -12
  64. package/esm2022/lib/datetime-picker/constants/index.mjs +0 -2
  65. package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +0 -22
  66. package/esm2022/lib/datetime-picker/index.mjs +0 -4
  67. package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +0 -40
  68. package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +0 -2
  69. package/esm2022/lib/datetime-picker/services/index.mjs +0 -2
  70. package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +0 -2
  71. package/esm2022/lib/datetime-picker/types/index.mjs +0 -2
  72. package/esm2022/lib/design-components.module.mjs +0 -132
  73. package/esm2022/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +0 -22
  74. package/esm2022/lib/dropdown/components/index.mjs +0 -2
  75. package/esm2022/lib/dropdown/dropdown.component.mjs +0 -143
  76. package/esm2022/lib/dropdown/dropdown.module.mjs +0 -21
  77. package/esm2022/lib/dropdown/index.mjs +0 -5
  78. package/esm2022/lib/dropdown/types/dropdown-position.mjs +0 -2
  79. package/esm2022/lib/dropdown/types/index.mjs +0 -2
  80. package/esm2022/lib/file-upload/directives/file-drop.directive.mjs +0 -50
  81. package/esm2022/lib/file-upload/directives/index.mjs +0 -2
  82. package/esm2022/lib/file-upload/file-upload.component.mjs +0 -335
  83. package/esm2022/lib/file-upload/file-upload.module.mjs +0 -38
  84. package/esm2022/lib/file-upload/index.mjs +0 -5
  85. package/esm2022/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +0 -23
  86. package/esm2022/lib/file-upload/pipes/index.mjs +0 -2
  87. package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +0 -15
  88. package/esm2022/lib/form-field/component/directives/error.directive.mjs +0 -27
  89. package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +0 -93
  90. package/esm2022/lib/form-field/component/directives/hint.directive.mjs +0 -25
  91. package/esm2022/lib/form-field/component/directives/index.mjs +0 -25
  92. package/esm2022/lib/form-field/component/directives/label.directive.mjs +0 -15
  93. package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +0 -25
  94. package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +0 -25
  95. package/esm2022/lib/form-field/component/form-field.component.mjs +0 -131
  96. package/esm2022/lib/form-field/component/form-field.module.mjs +0 -24
  97. package/esm2022/lib/form-field/component/index.mjs +0 -4
  98. package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +0 -345
  99. package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +0 -16
  100. package/esm2022/lib/form-field/controls/checkbox/index.mjs +0 -3
  101. package/esm2022/lib/form-field/controls/index.mjs +0 -6
  102. package/esm2022/lib/form-field/controls/input/index.mjs +0 -2
  103. package/esm2022/lib/form-field/controls/input/input.directive.mjs +0 -234
  104. package/esm2022/lib/form-field/controls/radio/index.mjs +0 -6
  105. package/esm2022/lib/form-field/controls/radio/injection-tokens.mjs +0 -4
  106. package/esm2022/lib/form-field/controls/radio/interfaces/index.mjs +0 -4
  107. package/esm2022/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +0 -2
  108. package/esm2022/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +0 -11
  109. package/esm2022/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +0 -2
  110. package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +0 -262
  111. package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +0 -290
  112. package/esm2022/lib/form-field/controls/radio/radio.module.mjs +0 -17
  113. package/esm2022/lib/form-field/controls/select/index.mjs +0 -9
  114. package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +0 -2
  115. package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +0 -2
  116. package/esm2022/lib/form-field/controls/select/option/index.mjs +0 -2
  117. package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +0 -44
  118. package/esm2022/lib/form-field/controls/select/option-display/index.mjs +0 -2
  119. package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +0 -162
  120. package/esm2022/lib/form-field/controls/select/option-group/index.mjs +0 -2
  121. package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +0 -35
  122. package/esm2022/lib/form-field/controls/select/option-parent.mjs +0 -4
  123. package/esm2022/lib/form-field/controls/select/select-model.mjs +0 -150
  124. package/esm2022/lib/form-field/controls/select/select.component.mjs +0 -725
  125. package/esm2022/lib/form-field/controls/select/select.module.mjs +0 -37
  126. package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +0 -2
  127. package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +0 -91
  128. package/esm2022/lib/form-field/controls/shared/index.mjs +0 -2
  129. package/esm2022/lib/form-field/controls/shared/toggle/components/index.mjs +0 -2
  130. package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +0 -17
  131. package/esm2022/lib/form-field/controls/shared/toggle/index.mjs +0 -4
  132. package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +0 -112
  133. package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +0 -18
  134. package/esm2022/lib/form-field/controls/tag-select/index.mjs +0 -2
  135. package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +0 -146
  136. package/esm2022/lib/form-field/form-field-errors.mjs +0 -5
  137. package/esm2022/lib/form-field/impdc-forms.mjs +0 -7
  138. package/esm2022/lib/form-field/impdc-forms.module.mjs +0 -53
  139. package/esm2022/lib/form-field/index.mjs +0 -2
  140. package/esm2022/lib/form-field/services/error-state-matcher.service.mjs +0 -28
  141. package/esm2022/lib/form-field/services/index.mjs +0 -3
  142. package/esm2022/lib/form-field/services/unique-selection-dispatcher.service.mjs +0 -48
  143. package/esm2022/lib/form-field/shared/constructors.type.mjs +0 -2
  144. package/esm2022/lib/form-field/shared/disabled.mixin.mjs +0 -15
  145. package/esm2022/lib/form-field/shared/error-state.mixin.mjs +0 -24
  146. package/esm2022/lib/form-field/shared/form-field-control.mjs +0 -10
  147. package/esm2022/lib/form-field/shared/index.mjs +0 -5
  148. package/esm2022/lib/form-field/shared/tab-index.mixin.mjs +0 -19
  149. package/esm2022/lib/icon/icon.component.mjs +0 -83
  150. package/esm2022/lib/icon/icon.module.mjs +0 -19
  151. package/esm2022/lib/icon/index.mjs +0 -3
  152. package/esm2022/lib/index.mjs +0 -29
  153. package/esm2022/lib/modal/index.mjs +0 -4
  154. package/esm2022/lib/modal/modal.component.mjs +0 -266
  155. package/esm2022/lib/modal/modal.module.mjs +0 -37
  156. package/esm2022/lib/modal/types/index.mjs +0 -3
  157. package/esm2022/lib/modal/types/modal-component-sizes.mjs +0 -9
  158. package/esm2022/lib/modal/types/modal-theme.mjs +0 -12
  159. package/esm2022/lib/pagination/index.mjs +0 -3
  160. package/esm2022/lib/pagination/pagination.component.mjs +0 -176
  161. package/esm2022/lib/pagination/pagination.module.mjs +0 -41
  162. package/esm2022/lib/progress-bar/index.mjs +0 -3
  163. package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -51
  164. package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -18
  165. package/esm2022/lib/scrollable/index.mjs +0 -3
  166. package/esm2022/lib/scrollable/scrollable.component.mjs +0 -187
  167. package/esm2022/lib/scrollable/scrollable.module.mjs +0 -22
  168. package/esm2022/lib/select-icon/index.mjs +0 -3
  169. package/esm2022/lib/select-icon/select-icon.component.mjs +0 -308
  170. package/esm2022/lib/select-icon/select-icon.module.mjs +0 -39
  171. package/esm2022/lib/size-detection/directive/element-size.interface.mjs +0 -2
  172. package/esm2022/lib/size-detection/directive/index.mjs +0 -3
  173. package/esm2022/lib/size-detection/directive/size-detector.directive.mjs +0 -43
  174. package/esm2022/lib/size-detection/index.mjs +0 -3
  175. package/esm2022/lib/size-detection/size-detection.module.mjs +0 -18
  176. package/esm2022/lib/spinner/index.mjs +0 -3
  177. package/esm2022/lib/spinner/spinner.component.mjs +0 -24
  178. package/esm2022/lib/spinner/spinner.module.mjs +0 -18
  179. package/esm2022/lib/table/components/bulk-actions/bulk-actions.component.mjs +0 -16
  180. package/esm2022/lib/table/components/column-heading/column-heading.component.mjs +0 -38
  181. package/esm2022/lib/table/components/index.mjs +0 -4
  182. package/esm2022/lib/table/components/row-actions/row-actions.component.mjs +0 -61
  183. package/esm2022/lib/table/constants/index.mjs +0 -3
  184. package/esm2022/lib/table/constants/public-table.constants.mjs +0 -2
  185. package/esm2022/lib/table/constants/table.constants.mjs +0 -23
  186. package/esm2022/lib/table/containers/index.mjs +0 -2
  187. package/esm2022/lib/table/containers/table.component.mjs +0 -474
  188. package/esm2022/lib/table/directives/collapse-monitor.directive.mjs +0 -42
  189. package/esm2022/lib/table/directives/index.mjs +0 -4
  190. package/esm2022/lib/table/directives/table-inject-component.directive.mjs +0 -46
  191. package/esm2022/lib/table/directives/table.directive.mjs +0 -55
  192. package/esm2022/lib/table/enumerations/index.mjs +0 -2
  193. package/esm2022/lib/table/enumerations/table-column-type.mjs +0 -21
  194. package/esm2022/lib/table/helpers/index.mjs +0 -2
  195. package/esm2022/lib/table/helpers/table-theme.helper.mjs +0 -31
  196. package/esm2022/lib/table/index.mjs +0 -8
  197. package/esm2022/lib/table/interfaces/cell-renderer.interface.mjs +0 -2
  198. package/esm2022/lib/table/interfaces/collapsible-row-content-context.interface.mjs +0 -2
  199. package/esm2022/lib/table/interfaces/custom-cell-renderer-components.type.mjs +0 -2
  200. package/esm2022/lib/table/interfaces/index.mjs +0 -13
  201. package/esm2022/lib/table/interfaces/sort-by-payload.interface.mjs +0 -2
  202. package/esm2022/lib/table/interfaces/table-cell-option.interface.mjs +0 -2
  203. package/esm2022/lib/table/interfaces/table-column-defs.type.mjs +0 -2
  204. package/esm2022/lib/table/interfaces/table-event-payload.interface.mjs +0 -2
  205. package/esm2022/lib/table/interfaces/table-row-action-payload.interface.mjs +0 -2
  206. package/esm2022/lib/table/interfaces/table-row-action.interface.mjs +0 -2
  207. package/esm2022/lib/table/interfaces/table-row-collapse-change.interface.mjs +0 -2
  208. package/esm2022/lib/table/interfaces/table-row-item.interface.mjs +0 -2
  209. package/esm2022/lib/table/table.module.mjs +0 -101
  210. package/esm2022/lib/tag/index.mjs +0 -2
  211. package/esm2022/lib/tag/tag.component.mjs +0 -104
  212. package/esm2022/lib/text-highlight/index.mjs +0 -3
  213. package/esm2022/lib/text-highlight/text-highlight.component.mjs +0 -101
  214. package/esm2022/lib/text-highlight/text-highlight.module.mjs +0 -17
  215. package/esm2022/public-api.mjs +0 -9
  216. package/esm2022/services/index.mjs +0 -2
  217. package/esm2022/services/interaction.service.mjs +0 -88
  218. package/esm2022/types/component-size.mjs +0 -12
  219. package/esm2022/types/component-theme.mjs +0 -22
  220. package/esm2022/types/index.mjs +0 -3
  221. package/esm2022/utilities/boolean-props.mjs +0 -7
  222. package/esm2022/utilities/dc.mjs +0 -9
  223. package/esm2022/utilities/index.mjs +0 -6
  224. package/esm2022/utilities/lc.mjs +0 -9
  225. package/esm2022/utilities/number-props.mjs +0 -18
  226. package/esm2022/utilities/sanitize.mjs +0 -7
  227. package/lib/alert/alert.component.d.ts +0 -50
  228. package/lib/alert/alert.module.d.ts +0 -9
  229. package/lib/alert/index.d.ts +0 -3
  230. package/lib/alert/theme/alert-theme.d.ts +0 -1
  231. package/lib/alert/theme/index.d.ts +0 -1
  232. package/lib/avatar/avatar.component.d.ts +0 -28
  233. package/lib/avatar/avatar.module.d.ts +0 -9
  234. package/lib/avatar/index.d.ts +0 -2
  235. package/lib/avatar-group/avatar-group.component.d.ts +0 -10
  236. package/lib/avatar-group/avatar-group.module.d.ts +0 -9
  237. package/lib/avatar-group/index.d.ts +0 -2
  238. package/lib/backdrop/backdrop.component.d.ts +0 -24
  239. package/lib/backdrop/backdrop.module.d.ts +0 -9
  240. package/lib/backdrop/index.d.ts +0 -2
  241. package/lib/badge/badge.component.d.ts +0 -63
  242. package/lib/badge/badge.module.d.ts +0 -10
  243. package/lib/badge/index.d.ts +0 -3
  244. package/lib/badge/types/badge-icon.d.ts +0 -1
  245. package/lib/badge/types/badge-size.d.ts +0 -6
  246. package/lib/badge/types/index.d.ts +0 -2
  247. package/lib/branding/branded.directive.d.ts +0 -6
  248. package/lib/branding/branding.module.d.ts +0 -9
  249. package/lib/branding/index.d.ts +0 -2
  250. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -7
  251. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -21
  252. package/lib/breadcrumb/breadcrumb.module.d.ts +0 -9
  253. package/lib/breadcrumb/index.d.ts +0 -3
  254. package/lib/button/button.component.d.ts +0 -47
  255. package/lib/button/button.module.d.ts +0 -11
  256. package/lib/button/index.d.ts +0 -3
  257. package/lib/button/themes/button-theme.d.ts +0 -1
  258. package/lib/button/themes/index.d.ts +0 -1
  259. package/lib/button-group/button-group.component.d.ts +0 -22
  260. package/lib/button-group/button-group.module.d.ts +0 -10
  261. package/lib/button-group/index.d.ts +0 -2
  262. package/lib/card-heading/card-heading.component.d.ts +0 -18
  263. package/lib/card-heading/card-heading.module.d.ts +0 -9
  264. package/lib/card-heading/index.d.ts +0 -2
  265. package/lib/data-card/data-card.component.d.ts +0 -68
  266. package/lib/data-card/data-card.module.d.ts +0 -11
  267. package/lib/data-card/index.d.ts +0 -2
  268. package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +0 -31
  269. package/lib/datetime-picker/components/datepicker-nav/index.d.ts +0 -1
  270. package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +0 -15
  271. package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +0 -1
  272. package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +0 -155
  273. package/lib/datetime-picker/components/datetime-picker/index.d.ts +0 -1
  274. package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +0 -160
  275. package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +0 -1
  276. package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +0 -24
  277. package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +0 -1
  278. package/lib/datetime-picker/components/index.d.ts +0 -5
  279. package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +0 -4
  280. package/lib/datetime-picker/constants/index.d.ts +0 -1
  281. package/lib/datetime-picker/datetime-picker.module.d.ts +0 -8
  282. package/lib/datetime-picker/index.d.ts +0 -4
  283. package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +0 -20
  284. package/lib/datetime-picker/services/datetime-formatter/index.d.ts +0 -1
  285. package/lib/datetime-picker/services/index.d.ts +0 -1
  286. package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +0 -5
  287. package/lib/datetime-picker/types/index.d.ts +0 -1
  288. package/lib/design-components.module.d.ts +0 -24
  289. package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +0 -11
  290. package/lib/dropdown/components/index.d.ts +0 -1
  291. package/lib/dropdown/dropdown.component.d.ts +0 -67
  292. package/lib/dropdown/dropdown.module.d.ts +0 -11
  293. package/lib/dropdown/index.d.ts +0 -4
  294. package/lib/dropdown/types/dropdown-position.d.ts +0 -1
  295. package/lib/dropdown/types/index.d.ts +0 -1
  296. package/lib/file-upload/directives/file-drop.directive.d.ts +0 -11
  297. package/lib/file-upload/directives/index.d.ts +0 -1
  298. package/lib/file-upload/file-upload.component.d.ts +0 -105
  299. package/lib/file-upload/file-upload.module.d.ts +0 -14
  300. package/lib/file-upload/index.d.ts +0 -4
  301. package/lib/file-upload/pipes/human-readable-byte-size.pipe.d.ts +0 -7
  302. package/lib/file-upload/pipes/index.d.ts +0 -1
  303. package/lib/form-field/component/directives/corner-hint.directive.d.ts +0 -5
  304. package/lib/form-field/component/directives/error.directive.d.ts +0 -8
  305. package/lib/form-field/component/directives/form-root.directive.d.ts +0 -26
  306. package/lib/form-field/component/directives/hint.directive.d.ts +0 -6
  307. package/lib/form-field/component/directives/index.d.ts +0 -15
  308. package/lib/form-field/component/directives/label.directive.d.ts +0 -5
  309. package/lib/form-field/component/directives/prefix.directive.d.ts +0 -9
  310. package/lib/form-field/component/directives/suffix.directive.d.ts +0 -9
  311. package/lib/form-field/component/form-field.component.d.ts +0 -37
  312. package/lib/form-field/component/form-field.module.d.ts +0 -14
  313. package/lib/form-field/component/index.d.ts +0 -3
  314. package/lib/form-field/controls/checkbox/checkbox.component.d.ts +0 -137
  315. package/lib/form-field/controls/checkbox/checkbox.module.d.ts +0 -7
  316. package/lib/form-field/controls/checkbox/index.d.ts +0 -2
  317. package/lib/form-field/controls/index.d.ts +0 -5
  318. package/lib/form-field/controls/input/index.d.ts +0 -1
  319. package/lib/form-field/controls/input/input.directive.d.ts +0 -84
  320. package/lib/form-field/controls/radio/index.d.ts +0 -5
  321. package/lib/form-field/controls/radio/injection-tokens.d.ts +0 -4
  322. package/lib/form-field/controls/radio/interfaces/index.d.ts +0 -3
  323. package/lib/form-field/controls/radio/interfaces/radio-button.interface.d.ts +0 -6
  324. package/lib/form-field/controls/radio/interfaces/radio-change-event.interface.d.ts +0 -12
  325. package/lib/form-field/controls/radio/interfaces/radio-group.interface.d.ts +0 -13
  326. package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +0 -98
  327. package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +0 -104
  328. package/lib/form-field/controls/radio/radio.module.d.ts +0 -8
  329. package/lib/form-field/controls/select/index.d.ts +0 -9
  330. package/lib/form-field/controls/select/interfaces/index.d.ts +0 -1
  331. package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +0 -6
  332. package/lib/form-field/controls/select/option/index.d.ts +0 -1
  333. package/lib/form-field/controls/select/option/select-option.component.d.ts +0 -21
  334. package/lib/form-field/controls/select/option-display/index.d.ts +0 -1
  335. package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +0 -64
  336. package/lib/form-field/controls/select/option-group/index.d.ts +0 -1
  337. package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +0 -11
  338. package/lib/form-field/controls/select/option-parent.d.ts +0 -16
  339. package/lib/form-field/controls/select/select-model.d.ts +0 -36
  340. package/lib/form-field/controls/select/select.component.d.ts +0 -232
  341. package/lib/form-field/controls/select/select.module.d.ts +0 -10
  342. package/lib/form-field/controls/select/value-tags-display/index.d.ts +0 -1
  343. package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +0 -46
  344. package/lib/form-field/controls/shared/index.d.ts +0 -1
  345. package/lib/form-field/controls/shared/toggle/components/index.d.ts +0 -1
  346. package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +0 -6
  347. package/lib/form-field/controls/shared/toggle/index.d.ts +0 -3
  348. package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +0 -29
  349. package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +0 -9
  350. package/lib/form-field/controls/tag-select/index.d.ts +0 -1
  351. package/lib/form-field/controls/tag-select/tag-select.component.d.ts +0 -43
  352. package/lib/form-field/form-field-errors.d.ts +0 -2
  353. package/lib/form-field/impdc-forms.d.ts +0 -6
  354. package/lib/form-field/impdc-forms.module.d.ts +0 -13
  355. package/lib/form-field/index.d.ts +0 -1
  356. package/lib/form-field/services/error-state-matcher.service.d.ts +0 -12
  357. package/lib/form-field/services/index.d.ts +0 -2
  358. package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +0 -29
  359. package/lib/form-field/shared/constructors.type.d.ts +0 -7
  360. package/lib/form-field/shared/disabled.mixin.d.ts +0 -10
  361. package/lib/form-field/shared/error-state.mixin.d.ts +0 -31
  362. package/lib/form-field/shared/form-field-control.d.ts +0 -24
  363. package/lib/form-field/shared/index.d.ts +0 -5
  364. package/lib/form-field/shared/tab-index.mixin.d.ts +0 -13
  365. package/lib/icon/icon.component.d.ts +0 -36
  366. package/lib/icon/icon.module.d.ts +0 -9
  367. package/lib/icon/index.d.ts +0 -2
  368. package/lib/index.d.ts +0 -28
  369. package/lib/modal/index.d.ts +0 -3
  370. package/lib/modal/modal.component.d.ts +0 -116
  371. package/lib/modal/modal.module.d.ts +0 -13
  372. package/lib/modal/types/index.d.ts +0 -2
  373. package/lib/modal/types/modal-component-sizes.d.ts +0 -3
  374. package/lib/modal/types/modal-theme.d.ts +0 -7
  375. package/lib/pagination/index.d.ts +0 -2
  376. package/lib/pagination/pagination.component.d.ts +0 -58
  377. package/lib/pagination/pagination.module.d.ts +0 -14
  378. package/lib/progress-bar/index.d.ts +0 -2
  379. package/lib/progress-bar/progress-bar.component.d.ts +0 -31
  380. package/lib/progress-bar/progress-bar.module.d.ts +0 -8
  381. package/lib/scrollable/index.d.ts +0 -2
  382. package/lib/scrollable/scrollable.component.d.ts +0 -41
  383. package/lib/scrollable/scrollable.module.d.ts +0 -12
  384. package/lib/select-icon/index.d.ts +0 -2
  385. package/lib/select-icon/select-icon.component.d.ts +0 -123
  386. package/lib/select-icon/select-icon.module.d.ts +0 -12
  387. package/lib/size-detection/directive/element-size.interface.d.ts +0 -4
  388. package/lib/size-detection/directive/index.d.ts +0 -2
  389. package/lib/size-detection/directive/size-detector.directive.d.ts +0 -14
  390. package/lib/size-detection/index.d.ts +0 -3
  391. package/lib/size-detection/size-detection.module.d.ts +0 -8
  392. package/lib/spinner/index.d.ts +0 -2
  393. package/lib/spinner/spinner.component.d.ts +0 -13
  394. package/lib/spinner/spinner.module.d.ts +0 -8
  395. package/lib/table/components/bulk-actions/bulk-actions.component.d.ts +0 -10
  396. package/lib/table/components/column-heading/column-heading.component.d.ts +0 -14
  397. package/lib/table/components/index.d.ts +0 -3
  398. package/lib/table/components/row-actions/row-actions.component.d.ts +0 -21
  399. package/lib/table/constants/index.d.ts +0 -2
  400. package/lib/table/constants/public-table.constants.d.ts +0 -1
  401. package/lib/table/constants/table.constants.d.ts +0 -9
  402. package/lib/table/containers/index.d.ts +0 -1
  403. package/lib/table/containers/table.component.d.ts +0 -178
  404. package/lib/table/directives/collapse-monitor.directive.d.ts +0 -12
  405. package/lib/table/directives/index.d.ts +0 -3
  406. package/lib/table/directives/table-inject-component.directive.d.ts +0 -16
  407. package/lib/table/directives/table.directive.d.ts +0 -23
  408. package/lib/table/enumerations/index.d.ts +0 -1
  409. package/lib/table/enumerations/table-column-type.d.ts +0 -19
  410. package/lib/table/helpers/index.d.ts +0 -1
  411. package/lib/table/helpers/table-theme.helper.d.ts +0 -7
  412. package/lib/table/index.d.ts +0 -7
  413. package/lib/table/interfaces/cell-renderer.interface.d.ts +0 -13
  414. package/lib/table/interfaces/collapsible-row-content-context.interface.d.ts +0 -39
  415. package/lib/table/interfaces/custom-cell-renderer-components.type.d.ts +0 -3
  416. package/lib/table/interfaces/index.d.ts +0 -12
  417. package/lib/table/interfaces/sort-by-payload.interface.d.ts +0 -11
  418. package/lib/table/interfaces/table-cell-option.interface.d.ts +0 -4
  419. package/lib/table/interfaces/table-column-defs.type.d.ts +0 -53
  420. package/lib/table/interfaces/table-event-payload.interface.d.ts +0 -13
  421. package/lib/table/interfaces/table-row-action-payload.interface.d.ts +0 -13
  422. package/lib/table/interfaces/table-row-action.interface.d.ts +0 -17
  423. package/lib/table/interfaces/table-row-collapse-change.interface.d.ts +0 -11
  424. package/lib/table/interfaces/table-row-item.interface.d.ts +0 -8
  425. package/lib/table/table.module.d.ts +0 -24
  426. package/lib/tag/index.d.ts +0 -1
  427. package/lib/tag/tag.component.d.ts +0 -54
  428. package/lib/text-highlight/index.d.ts +0 -2
  429. package/lib/text-highlight/text-highlight.component.d.ts +0 -37
  430. package/lib/text-highlight/text-highlight.module.d.ts +0 -8
  431. package/public-api.d.ts +0 -4
  432. package/services/index.d.ts +0 -1
  433. package/services/interaction.service.d.ts +0 -28
  434. package/types/component-size.d.ts +0 -12
  435. package/types/component-theme.d.ts +0 -12
  436. package/types/index.d.ts +0 -2
  437. package/utilities/boolean-props.d.ts +0 -8
  438. package/utilities/dc.d.ts +0 -6
  439. package/utilities/index.d.ts +0 -5
  440. package/utilities/lc.d.ts +0 -6
  441. package/utilities/number-props.d.ts +0 -15
  442. package/utilities/sanitize.d.ts +0 -1
@@ -1,725 +0,0 @@
1
- /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
- import { AsyncPipe, CommonModule } from '@angular/common';
3
- import { Attribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, Directive, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, ViewChildren, booleanAttribute, inject, numberAttribute } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';
6
- import { NgbDropdown, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
7
- import { nanoid } from 'nanoid';
8
- import { BehaviorSubject, combineLatest, debounceTime, defer, distinctUntilChanged, map, merge, startWith, Subject, switchMap, take, takeUntil, tap } from 'rxjs';
9
- import { ComponentTheme } from '../../../../types';
10
- import { lc } from '../../../../utilities';
11
- import { BadgeModule } from '../../../badge';
12
- import { IconModule } from '../../../icon';
13
- import { ErrorStateMatcher } from '../../services';
14
- import { IMPDC_FORM_ROOT, FormFieldModule } from '../../component';
15
- import { ImpdcFormFieldControl, mixinDisabled, mixinErrorState, mixinTabIndex } from '../../shared';
16
- import { InputDirective } from '../input';
17
- import { IMPDC_SELECT_OPTION_PARENT_COMPONENT, IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT } from './option-parent';
18
- import { SelectOptionDisplayComponent } from './option-display';
19
- import { SelectModel } from './select-model';
20
- import { SelectOptionComponent } from './option';
21
- import { SelectValueTagsDisplayComponent } from './value-tags-display';
22
- import * as i0 from "@angular/core";
23
- import * as i1 from "@angular/common";
24
- import * as i2 from "@angular/forms";
25
- import * as i3 from "@ng-bootstrap/ng-bootstrap";
26
- import * as i4 from "../../../icon/icon.component";
27
- import * as i5 from "../../component/form-field.component";
28
- import * as i6 from "../../component/directives/prefix.directive";
29
- import * as i7 from "../../component/directives/suffix.directive";
30
- export const ON_OPEN_AUTO_SCROLL_TIMEOUT_MS = 50;
31
- export class SelectChangeEvent {
32
- constructor(
33
- /** The specific SelectComponent that changed. */
34
- source,
35
- /** The selected value(s) */
36
- value) {
37
- this.source = source;
38
- this.value = value;
39
- }
40
- }
41
- /**
42
- * Returns an exception to be thrown when attempting to assign a non-array value to a select
43
- * in `multiple` mode. Note that `undefined` and `null` are still valid values to allow for
44
- * resetting the value.
45
- * @ignore
46
- */
47
- export function getImpdcSelectNonArrayValueError() {
48
- return Error('Value must be an array in multiple-selection mode.');
49
- }
50
- /**
51
- * Returns an exception to be thrown when assigning a non-function value to the comparator
52
- * used to determine if a value corresponds to an option. Note that whether the function
53
- * actually takes two values and returns a boolean is not checked.
54
- */
55
- export function getImpdcSelectNonFunctionValueError() {
56
- return Error('`compareWith` must be a function.');
57
- }
58
- /**
59
- * Returns an exception to be thrown when attempting to change a select's `multiple` option
60
- * after initialization.
61
- * @ignore
62
- */
63
- export function getImpdcSelectDynamicMultipleError() {
64
- return Error('Cannot change `multiple` mode of select after initialization.');
65
- }
66
- const DEFAULT_ACTIVE_INDEX = -1;
67
- const __SelectComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
68
- constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
69
- this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
70
- this._formRoot = _formRoot;
71
- this._parentForm = _parentForm;
72
- this._parentFormGroup = _parentFormGroup;
73
- this.ngControl = ngControl;
74
- this.stateChanges = new Subject();
75
- }
76
- })));
77
- export class _SelectComponentBase extends __SelectComponentBase {
78
- /**
79
- * Set whether or not an input field will appear for searching and
80
- * filtering visible options.
81
- *
82
- * - `'none'`: No search control will be displayed, and all select options are provided via projected `<impdc-select-option>` elements.
83
- * - `'static'`: A search control will be displayed, select options are provided via projected `<impdc-select-option>` elements, and
84
- * filtering is performed against the `[label]` attribute value.
85
- * @default 'none'
86
- */
87
- get search() {
88
- return this._searchSubject.value;
89
- }
90
- set search(value) {
91
- this._searchSubject.next(value);
92
- }
93
- /**
94
- * The placeholder text that will be displayed when no selection has been made.
95
- *
96
- * @default \- Select -
97
- */
98
- get placeholder() {
99
- return this._placeholder;
100
- }
101
- set placeholder(value) {
102
- this._placeholder = value;
103
- this.stateChanges.next();
104
- }
105
- /**
106
- * Used to set requiredness of control in a template-based manner;
107
- * not necessary when using the Angular reactive forms API and `required` validator.
108
- */
109
- get required() {
110
- return (this._required ??
111
- this.ngControl?.control?.hasValidator(Validators.required) ??
112
- false);
113
- }
114
- set required(value) {
115
- this._required = value;
116
- this.stateChanges.next();
117
- }
118
- /**
119
- * Whether the control is a single-select or multiple-select. Cannot be changed after component initialization.
120
- */
121
- get multiple() {
122
- return this._multiple;
123
- }
124
- /**
125
- * Function used to compare option values with selected values. The first arg is a
126
- * `value` from an option, and the second arg is a `value` from the selection or another option.
127
- *
128
- * @returns Boolean indicating if the values are equivalent.
129
- */
130
- get compareWith() {
131
- return this._compareWith;
132
- }
133
- set compareWith(fn) {
134
- if (typeof fn !== 'function') {
135
- throw getImpdcSelectNonFunctionValueError();
136
- }
137
- this._compareWith = fn;
138
- if (this.selectionModel) {
139
- // Changing the comparator function means the visual selection may have changed.
140
- this._initializeSelection();
141
- }
142
- }
143
- constructor(uid, tabIndex) {
144
- super(inject(ErrorStateMatcher), inject(IMPDC_FORM_ROOT, { optional: true }), inject(NgForm, { optional: true }), inject(FormGroupDirective, { optional: true }), inject(NgControl, { optional: true, self: true }));
145
- this._ngDestroy = new Subject();
146
- this._searchSubject = new BehaviorSubject('none');
147
- this._compareWith = (o1, o2) => o1 === o2;
148
- this._cvaOnChange = () => { };
149
- this._cvaOnTouched = () => { };
150
- this.changeDetector = inject(ChangeDetectorRef);
151
- this.ngZone = inject(NgZone);
152
- this.searchControl = new FormControl(null);
153
- this.BadgeTheme = ComponentTheme;
154
- this.filteredOptions$ = this._searchSubject.pipe(switchMap(searchMode => {
155
- switch (searchMode) {
156
- case 'none':
157
- return this.staticOptions.changes.pipe(startWith(this.staticOptions.toArray()), map(options => options.map(opt => ({
158
- groupLabel: opt.groupLabel,
159
- get label() {
160
- return opt.label;
161
- },
162
- value: opt.value,
163
- get disabled() {
164
- return opt.disabled;
165
- },
166
- selected: this.selectionModel.isSelected(opt)
167
- }))));
168
- case 'static':
169
- return combineLatest([
170
- this.staticOptions.changes.pipe(startWith(this.staticOptions.toArray())),
171
- this.searchTextChanges.pipe(startWith(''))
172
- ]).pipe(tap(([, searchText]) => {
173
- this.activeIndex = !!searchText ? 0 : DEFAULT_ACTIVE_INDEX;
174
- }), map(([options, searchText]) => {
175
- const renderedOptions = options.map(opt => ({
176
- groupLabel: opt.groupLabel,
177
- get label() {
178
- return opt.label;
179
- },
180
- value: opt.value,
181
- get disabled() {
182
- return opt.disabled;
183
- },
184
- selected: this.selectionModel.isSelected(opt)
185
- }));
186
- return !!searchText
187
- ? renderedOptions.filter(opt => lc(opt.label).indexOf(lc(searchText)) !== -1)
188
- : renderedOptions;
189
- }));
190
- }
191
- }), map(options => Object.entries(options.reduce((result, opt) => {
192
- const resolvedGroupLabel = opt.groupLabel?.trim() || '';
193
- let showGroupLabel = false;
194
- if (!(resolvedGroupLabel in result)) {
195
- result[resolvedGroupLabel] = [];
196
- showGroupLabel = true;
197
- }
198
- result[resolvedGroupLabel].push({
199
- ...opt,
200
- showGroupLabel
201
- });
202
- return result;
203
- }, {})).flatMap(([, groupOptions]) => groupOptions)));
204
- this.activeIndex = DEFAULT_ACTIVE_INDEX;
205
- /** @ignore */
206
- this.optionSelectionChanges = defer(() => {
207
- const options = this.options;
208
- if (options) {
209
- return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));
210
- }
211
- return this.ngZone.onStable.pipe(take(1), switchMap(() => this.optionSelectionChanges));
212
- });
213
- this._placeholder = '- Select -';
214
- this._multiple = false;
215
- /**
216
- * Document element that the select dropdown will be attached to in the DOM - either the
217
- * document's `<body>` tag, or as a child of the component tag.
218
- *
219
- * The default value (`'body'`) is generally the correct choice, and should only be
220
- * overridden when absolutely certain that the result behavior is what's desired.
221
- */
222
- this.dropdownContainer = 'body';
223
- /** Events fire when selection has been changed by the user. */
224
- this.selectionChange = new EventEmitter();
225
- /**
226
- * Events fire when raw value of select changes. Mainly exists to handle
227
- * two-way binding of `value` input property.
228
- * @ignore
229
- */
230
- this.valueChange = new EventEmitter();
231
- /**
232
- * Events fire when the text value of the option search input control has changed.
233
- */
234
- this.searchTextChanges = this.searchControl.valueChanges.pipe(takeUntilDestroyed(), startWith(''), debounceTime(200), distinctUntilChanged());
235
- this._focused = false;
236
- this.uid = uid;
237
- if (this.ngControl) {
238
- this.ngControl.valueAccessor = this;
239
- }
240
- // idempotent assignment - respects arbitrary ID set via attr if present, otherwise falls back to auto UUID;
241
- // also triggers stateChanges pulse for parent form-field component
242
- this.id = this.id;
243
- this.tabIndex = parseInt(tabIndex ?? '') || 0;
244
- }
245
- get dropdownOpen() {
246
- return this.ngbDropdown?.isOpen() ?? false;
247
- }
248
- get empty() {
249
- return !this.selectionModel || this.selectionModel.isEmpty();
250
- }
251
- get selected() {
252
- return this._multiple
253
- ? this.selectionModel?.selected || []
254
- : this.selectionModel?.selected[0];
255
- }
256
- /** @ignore */
257
- focus(options) {
258
- this.toggleButtonRef?.nativeElement.focus(options);
259
- }
260
- handleOpenChange(isOpen) {
261
- if (isOpen) {
262
- this.onFocus();
263
- if (this.search !== 'none' && !!this.searchInputRef) {
264
- setTimeout(() => {
265
- this.searchInputRef?.nativeElement.focus();
266
- }, ON_OPEN_AUTO_SCROLL_TIMEOUT_MS);
267
- }
268
- if (!this._multiple && !!this.value) {
269
- this._scrollToSelectedOption();
270
- }
271
- }
272
- else {
273
- this.onBlur();
274
- }
275
- this.activeIndex = DEFAULT_ACTIVE_INDEX;
276
- this.searchControl.reset();
277
- this.stateChanges.next();
278
- }
279
- /* Angular lifecycle hooks */
280
- /** @ignore */
281
- ngOnInit() {
282
- this.selectionModel = new SelectModel(this._multiple, undefined, undefined, (a, b) => {
283
- return this.compareWith(a.value, b.value);
284
- });
285
- this.stateChanges.next();
286
- }
287
- /** @ignore */
288
- ngAfterViewInit() {
289
- this.selectionModel.changed$
290
- .pipe(takeUntil(this._ngDestroy))
291
- .subscribe(changeEvent => {
292
- changeEvent.added.forEach(option => this.options
293
- .find(o => this.compareWith(o.value, option.value))
294
- ?.select());
295
- changeEvent.removed.forEach(option => this.options
296
- .find(o => this.compareWith(o.value, option.value))
297
- ?.deselect());
298
- });
299
- this.options.changes
300
- .pipe(startWith(null), takeUntil(this._ngDestroy))
301
- .subscribe(() => {
302
- this._resetOptions();
303
- this._initializeSelection();
304
- });
305
- }
306
- /** @ignore */
307
- ngDoCheck() {
308
- const ngControl = this.ngControl;
309
- if (!ngControl) {
310
- return;
311
- }
312
- if (this._previousControl !== ngControl.control) {
313
- if (this._previousControl !== undefined &&
314
- ngControl.disabled !== null &&
315
- ngControl.disabled !== this.disabled) {
316
- this.disabled = ngControl?.disabled;
317
- }
318
- this._previousControl = ngControl.control;
319
- }
320
- this.updateErrorState();
321
- }
322
- /** @ignore */
323
- ngOnChanges(changes) {
324
- // Managing disabled state is handled via the `mixinDisabled` mixin/generator, but we still need to signal
325
- // to the parent form field so it can run change detection when disabled state is changed.
326
- if (changes['disabled']) {
327
- this.stateChanges.next();
328
- }
329
- }
330
- /** @ignore */
331
- ngOnDestroy() {
332
- this._ngDestroy.next();
333
- this._ngDestroy.complete();
334
- this.stateChanges.complete();
335
- }
336
- get value() {
337
- return this._value;
338
- }
339
- set value(value) {
340
- const hasAssigned = this._assignValue(value);
341
- if (hasAssigned) {
342
- this._cvaOnChange(value);
343
- }
344
- }
345
- get id() {
346
- return this._id;
347
- }
348
- set id(value) {
349
- this._id = value || this.uid;
350
- this.stateChanges.next();
351
- }
352
- get focused() {
353
- return this._focused || this.dropdownOpen;
354
- }
355
- /* ControlValueAccessor */
356
- /** @ignore */
357
- writeValue(value) {
358
- this._assignValue(value);
359
- }
360
- /** @ignore */
361
- registerOnChange(fn) {
362
- this._cvaOnChange = fn;
363
- }
364
- /** @ignore */
365
- registerOnTouched(fn) {
366
- this._cvaOnTouched = fn;
367
- }
368
- /** @ignore */
369
- setDisabledState(isDisabled) {
370
- this.disabled = isDisabled;
371
- this.changeDetector.markForCheck();
372
- this.stateChanges.next();
373
- }
374
- /* Internals */
375
- onFocus() {
376
- if (!this.disabled) {
377
- this._focused = true;
378
- this.stateChanges.next();
379
- }
380
- }
381
- /**
382
- * Calls the CVA touched callback only if the dropdown is closed.
383
- */
384
- onBlur() {
385
- this._focused = false;
386
- if (!this.disabled && !this.dropdownOpen) {
387
- this._cvaOnTouched();
388
- this.changeDetector.markForCheck();
389
- this.stateChanges.next();
390
- }
391
- }
392
- clearSelection() {
393
- this.value = null;
394
- this.focus();
395
- this._propagateChanges();
396
- }
397
- handleSearchSubmit(evt) {
398
- evt.preventDefault();
399
- evt.stopPropagation();
400
- if (this.activeIndex < 0 || this.activeIndex >= this.options.length)
401
- return;
402
- this.options.get(this.activeIndex)?.nativeElement.click();
403
- }
404
- handleSearchUpDown(evt, direction) {
405
- evt.preventDefault();
406
- if (direction === 'up') {
407
- if (this.activeIndex === this.options.length - 1) {
408
- this.activeIndex = (this.activeIndex + 1) % this.options.length;
409
- }
410
- else {
411
- this.activeIndex++;
412
- }
413
- }
414
- else {
415
- if (this.activeIndex <= 0) {
416
- this.activeIndex = this.options.length - 1;
417
- }
418
- else {
419
- this.activeIndex--;
420
- }
421
- }
422
- this.changeDetector.markForCheck();
423
- }
424
- markActive(index) {
425
- this.activeIndex = index;
426
- this.changeDetector.markForCheck();
427
- }
428
- selectedIsSingle(selected) {
429
- return !Array.isArray(selected);
430
- }
431
- _initializeSelection() {
432
- // We defer this work into a promise in order to avoid tripping Angular's
433
- // "Expression has changed after it was checked" error.
434
- Promise.resolve().then(() => {
435
- if (this.ngControl) {
436
- this._value = this.ngControl.value;
437
- }
438
- this._setSelectionByValue(this._value);
439
- this.stateChanges.next();
440
- });
441
- }
442
- _setSelectionByValue(value) {
443
- if (this.search === 'none') {
444
- this.selectionModel.clear();
445
- }
446
- if (this._multiple && value) {
447
- if (!Array.isArray(value)) {
448
- throw getImpdcSelectNonArrayValueError();
449
- }
450
- value.forEach(currentValue => this._selectOptionByValue(currentValue));
451
- this._sortValues();
452
- }
453
- else {
454
- this._selectOptionByValue(value);
455
- }
456
- this.changeDetector.detectChanges();
457
- }
458
- _selectOptionByValue(value) {
459
- const correspondingOption = this.options.find((option) => {
460
- if (this.selectionModel.isSelected(option)) {
461
- return false;
462
- }
463
- try {
464
- return option.value != null && this._compareWith(option.value, value);
465
- }
466
- catch (error) {
467
- console.warn(error);
468
- return false;
469
- }
470
- });
471
- if (correspondingOption) {
472
- this.selectionModel.select(correspondingOption);
473
- }
474
- return correspondingOption;
475
- }
476
- /** Assigns a value to the select control. Returns a boolean indicating whether or not
477
- * the value has changed.
478
- */
479
- _assignValue(newValue) {
480
- if (newValue !== this._value ||
481
- (this._multiple && Array.isArray(newValue))) {
482
- if (this.options) {
483
- this.selectionModel.clear();
484
- this._setSelectionByValue(newValue);
485
- }
486
- this._value = newValue;
487
- return true;
488
- }
489
- return false;
490
- }
491
- _resetOptions() {
492
- const changedOrDestroyed = merge(this.options.changes, this._ngDestroy);
493
- this.optionSelectionChanges
494
- .pipe(takeUntil(changedOrDestroyed))
495
- .subscribe(event => {
496
- this._onSelect(event.source, event.isUserInput);
497
- if (event.isUserInput && !this._multiple && this.dropdownOpen) {
498
- this.ngbDropdown.close();
499
- this.focus();
500
- }
501
- });
502
- merge(...this.options.map(option => option.stateChanges))
503
- .pipe(takeUntil(changedOrDestroyed))
504
- .subscribe(() => {
505
- this.changeDetector.detectChanges();
506
- this.stateChanges.next();
507
- });
508
- }
509
- _onSelect(option, isUserInput) {
510
- const wasSelected = this.selectionModel.isSelected(option);
511
- if (option.value == null && !this._multiple) {
512
- option.deselect();
513
- this.selectionModel.clear();
514
- if (this.value != null) {
515
- this._propagateChanges(option.value);
516
- }
517
- }
518
- else {
519
- if (wasSelected !== option.selected) {
520
- option.selected
521
- ? this.selectionModel.select(option)
522
- : this.selectionModel.deselect(option);
523
- }
524
- if (this._multiple) {
525
- this._sortValues();
526
- }
527
- }
528
- if (wasSelected !== this.selectionModel.isSelected(option)) {
529
- this._propagateChanges();
530
- }
531
- this.changeDetector.markForCheck();
532
- this.stateChanges.next();
533
- }
534
- _sortValues() {
535
- if (this._multiple &&
536
- (this.search === 'none' || this.search === 'static')) {
537
- const options = this.staticOptions.toArray();
538
- this.selectionModel.sort((a, b) => {
539
- return (options.findIndex(o => this.compareWith(o.value, a.value)) -
540
- options.findIndex(o => this.compareWith(o.value, b.value)));
541
- });
542
- this.stateChanges.next();
543
- }
544
- }
545
- _propagateChanges(fallbackValue) {
546
- let valToEmit = null;
547
- if (this._multiple) {
548
- valToEmit = this.selected.map(option => option.value);
549
- }
550
- else {
551
- valToEmit = this.selected
552
- ? this.selected.value
553
- : fallbackValue;
554
- }
555
- this._value = valToEmit;
556
- this.valueChange.emit(valToEmit);
557
- this._cvaOnChange(valToEmit);
558
- this.selectionChange.emit(this._buildChangeEvent(valToEmit));
559
- }
560
- _buildChangeEvent(value) {
561
- return new SelectChangeEvent(this, value);
562
- }
563
- /** @ignore */
564
- _deselectOption(option, markTouched = true) {
565
- if (this._multiple && this.selectionModel.isSelected(option)) {
566
- this.selectionModel.deselect(option);
567
- this._propagateChanges();
568
- if (markTouched) {
569
- this._cvaOnTouched();
570
- }
571
- this.changeDetector.markForCheck();
572
- this.stateChanges.next();
573
- }
574
- }
575
- _scrollToSelectedOption() {
576
- setTimeout(() => {
577
- if (this.dropdownOpen && this.selected && !Array.isArray(this.selected)) {
578
- const selectedOptionElement = this.options.find(o => !Array.isArray(this.selected) &&
579
- this.compareWith(o.value, this.selected.value));
580
- selectedOptionElement?.nativeElement.scrollIntoView({
581
- block: 'nearest',
582
- inline: 'nearest',
583
- behavior: 'instant'
584
- });
585
- }
586
- }, ON_OPEN_AUTO_SCROLL_TIMEOUT_MS);
587
- }
588
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: _SelectComponentBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
589
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: _SelectComponentBase, inputs: { value: "value", id: "id" }, outputs: { searchTextChanges: "searchTextChanges" }, queries: [{ propertyName: "staticOptions", predicate: SelectOptionComponent, descendants: true }], viewQueries: [{ propertyName: "ngbDropdown", first: true, predicate: NgbDropdown, descendants: true }, { propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true, read: ElementRef }, { propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true, read: (ElementRef) }, { propertyName: "options", predicate: SelectOptionDisplayComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
590
- }
591
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: _SelectComponentBase, decorators: [{
592
- type: Directive
593
- }], ctorParameters: () => [{ type: undefined }, { type: undefined }], propDecorators: { staticOptions: [{
594
- type: ContentChildren,
595
- args: [SelectOptionComponent, { descendants: true }]
596
- }], options: [{
597
- type: ViewChildren,
598
- args: [SelectOptionDisplayComponent]
599
- }], ngbDropdown: [{
600
- type: ViewChild,
601
- args: [NgbDropdown]
602
- }], toggleButtonRef: [{
603
- type: ViewChild,
604
- args: ['toggleButton', { read: ElementRef }]
605
- }], searchInputRef: [{
606
- type: ViewChild,
607
- args: ['searchInput', { read: (ElementRef) }]
608
- }], searchTextChanges: [{
609
- type: Output
610
- }], value: [{
611
- type: Input
612
- }], id: [{
613
- type: Input
614
- }] } });
615
- /**
616
- * The `SelectComponent` (`<impdc-select`) is a select-style dropdown input where an item (or multiple items) can be picked
617
- * from a list of *unique* available options. This component can be used within a `FormFieldComponent` (`<impdc-form-field`).
618
- * To use, add `SelectModule` to the `imports` array of the relevant `NgModule` or standalone component.
619
- */
620
- export class SelectComponent extends _SelectComponentBase {
621
- constructor(tabIndex) {
622
- super(`impdc-select-${nanoid()}`, tabIndex);
623
- this.controlType = 'impdc-select';
624
- this.supportsAffixes = true;
625
- /**
626
- * Allow the user to click a button inside of the select control and clear their selection(s);
627
- *
628
- * @default true
629
- */
630
- this.allowClear = true;
631
- this.multipleDisplay = 'inside';
632
- }
633
- get multiple() {
634
- return this._multiple;
635
- }
636
- set multiple(value) {
637
- if (this.selectionModel) {
638
- throw getImpdcSelectDynamicMultipleError();
639
- }
640
- this._multiple = value;
641
- }
642
- /** @ignore */
643
- deselectOption(option) {
644
- this._deselectOption(option);
645
- }
646
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SelectComponent, deps: [{ token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
647
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: SelectComponent, isStandalone: true, selector: "impdc-select", inputs: { disabled: "disabled", tabIndex: ["tabIndex", "tabIndex", numberAttribute], search: "search", placeholder: "placeholder", required: ["required", "required", booleanAttribute], compareWith: "compareWith", dropdownContainer: "dropdownContainer", errorStateMatcher: "errorStateMatcher", allowClear: ["allowClear", "allowClear", booleanAttribute], multiple: ["multiple", "multiple", booleanAttribute], multipleDisplay: "multipleDisplay" }, outputs: { selectionChange: "selectionChange", valueChange: "valueChange", searchTextChanges: "searchTextChanges" }, host: { listeners: { "focus": "onFocus(); focus()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.form-select": "true", "class.is-invalid": "errorState", "class.impdc-form-field-control": "true", "class.impdc-select--required": "required", "class.impdc-select--disabled": "disabled", "class.impdc-select--invalid": "errorState", "class.impdc-select--empty": "empty", "class.impdc-select--multiple": "multiple" } }, providers: [
648
- {
649
- provide: ImpdcFormFieldControl,
650
- useExisting: SelectComponent
651
- },
652
- {
653
- provide: IMPDC_SELECT_OPTION_PARENT_COMPONENT,
654
- useExisting: SelectComponent
655
- },
656
- {
657
- provide: IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT,
658
- useExisting: SelectComponent
659
- }
660
- ], exportAs: ["impdcSelect"], usesInheritance: true, ngImport: i0, template: "<div\n ngbDropdown\n #dropdown=\"ngbDropdown\"\n [autoClose]=\"multiple ? 'outside' : true\"\n [container]=\"dropdownContainer\"\n [dropdownClass]=\"dropdownContainer === 'body' ? 'impartner-hex' : ''\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"h-100 w-100\">\n <button\n #toggleButton\n class=\"impdc-select--toggle btn border-0 h-100 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n ngbDropdownToggle>\n @if (empty) {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @else { @if (selectedIsSingle(selected)) {\n <span class=\"impdc-select--text impdc-select--value-text\">\n {{ selected.label }}\n </span>\n } @else if (multipleDisplay === 'inside') {\n <impdc-select-value-tags-display />\n } @else {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @if (!disabled && allowClear) {\n <button\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"$event.stopPropagation(); dropdown.close(); clearSelection()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n } }\n </button>\n <div\n ngbDropdownMenu\n class=\"impdc-select--dropdown-menu bg-white text-gray-600\"\n role=\"listbox\"\n tabindex=\"-1\">\n <div *ngIf=\"search !== 'none'\" class=\"impdc-select--search\">\n <impdc-form-field>\n <span impdcTextPrefix (click)=\"searchInput.focus()\">\n <impdc-icon name=\"search\"></impdc-icon>\n </span>\n <input\n #searchInput\n impdcInput\n [formControl]=\"searchControl\"\n class=\"impdc-select--search-input\"\n type=\"search\"\n (keydown.enter)=\"handleSearchSubmit($event)\"\n (keydown.arrowdown)=\"handleSearchUpDown($event, 'up')\"\n (keydown.arrowup)=\"handleSearchUpDown($event, 'down')\" />\n <span impdcTextSuffix>\n <button\n *ngIf=\"searchControl.value\"\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"searchControl.reset(); searchInput.focus()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n </span>\n </impdc-form-field>\n </div>\n <div class=\"impdc-select--options\">\n @for (option of filteredOptions$ | async; track option.value; let idx =\n $index; let first = $first) { @if (option.groupLabel &&\n option.showGroupLabel) {\n <div class=\"impdc-select--option-group-label\">\n {{ option.groupLabel }}\n </div>\n }\n <impdc-select-option-display\n [class.impdc-select-option--active]=\"idx === activeIndex\"\n [class.impdc-select-option--grouped]=\"!!option.groupLabel\"\n [groupLabel]=\"option.groupLabel\"\n [label]=\"option.label\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [selected]=\"option.selected\"\n [highlightText]=\"searchControl.value\"\n (mouseenter)=\"markActive(idx)\"\n (focus)=\"markActive(idx)\" />\n }\n </div>\n </div>\n</div>\n", styles: [".impdc-select--clear-btn{align-items:center;color:var(--impd-color-gray-400);display:inline-flex;justify-content:center;padding:0;height:2rem;width:2rem;box-shadow:none!important}.impdc-select--clear-btn:focus-visible{box-shadow:var(--impartner-hex-btn-box-shadow),var(--impartner-hex-btn-focus-box-shadow)!important}.impdc-select--clear-btn impdc-icon{line-height:1}.impdc-select--dropdown-menu{overflow:hidden}.impdc-select--search{padding-left:var(--impd-size-2);padding-right:var(--impd-size-2)}.impdc-select--search [impdcTextSuffix]{min-width:3.4rem;width:3.4rem}.impdc-select--options{overflow-y:auto;overflow-x:hidden;max-height:var(--impd-size-72)}.impdc-select--option-group-label{color:var(--impd-color-gray-600);font-size:var(--impd-size-2_5);font-weight:var(--impd-font-weight-semibold);line-height:var(--impd-size-4);padding:var(--impd-size-1) var(--impd-size-4);text-transform:uppercase;white-space:nowrap}.impdc-select--option-group-label:not(:first-child){margin-top:var(--impd-size-2)}button[ngbDropdownToggle].dropdown-toggle:after{display:none}:host{padding:0!important;position:relative}:host.impdc-select--disabled{background-color:var(--impd-color-gray-100)}:host.no-caret{--impartner-hex-form-select-bg-img: none}:host:not(.no-caret) .impdc-select--toggle{padding-right:3.6rem}:host:not(.no-caret).is-invalid .impdc-select--toggle{padding-right:6.6rem}.impdc-select--toggle{font-weight:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;gap:var(--impd-size-1)}.impdc-select--toggle:disabled{cursor:default}.impdc-select--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.impdc-select--value-badges{display:flex;flex-wrap:wrap;gap:var(--impd-size-1);width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: SelectOptionDisplayComponent, selector: "impdc-select-option-display", inputs: ["selected", "value", "label", "groupLabel", "highlightText", "id", "disabled"], outputs: ["onSelectionChange"] }, { kind: "component", type: SelectValueTagsDisplayComponent, selector: "impdc-select-value-tags-display", inputs: ["rounded", "select", "readonly", "truncateThreshold", "showMoreLabel", "showLessLabel"] }, { kind: "ngmodule", type: FormFieldModule }, { kind: "component", type: i5.FormFieldComponent, selector: "impdc-form-field", exportAs: ["impdcFormField"] }, { kind: "directive", type: i6.PrefixDirective, selector: "[impdcPrefix], [impdcTextPrefix]", inputs: ["impdcTextPrefix"] }, { kind: "directive", type: i7.SuffixDirective, selector: "[impdcSuffix], [impdcTextSuffix]", inputs: ["impdcTextSuffix"] }, { kind: "directive", type: InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "ngmodule", type: BadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
661
- }
662
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SelectComponent, decorators: [{
663
- type: Component,
664
- args: [{ selector: 'impdc-select', exportAs: 'impdcSelect', standalone: true, imports: [
665
- CommonModule,
666
- AsyncPipe,
667
- ReactiveFormsModule,
668
- NgbDropdownModule,
669
- IconModule,
670
- SelectOptionDisplayComponent,
671
- SelectValueTagsDisplayComponent,
672
- FormFieldModule,
673
- InputDirective,
674
- BadgeModule
675
- ], inputs: [
676
- 'disabled',
677
- { name: 'tabIndex', transform: numberAttribute },
678
- 'search',
679
- 'placeholder',
680
- { name: 'required', transform: booleanAttribute },
681
- 'compareWith',
682
- 'dropdownContainer',
683
- 'errorStateMatcher'
684
- ], outputs: ['selectionChange', 'valueChange', 'searchTextChanges'], changeDetection: ChangeDetectionStrategy.OnPush, host: {
685
- '[attr.id]': 'id',
686
- '[attr.tabindex]': 'tabIndex',
687
- '[attr.aria-required]': 'required.toString()',
688
- '[attr.aria-disabled]': 'disabled.toString()',
689
- '[attr.aria-invalid]': 'errorState',
690
- '[class.form-select]': 'true',
691
- '[class.is-invalid]': 'errorState',
692
- '[class.impdc-form-field-control]': 'true',
693
- '[class.impdc-select--required]': 'required',
694
- '[class.impdc-select--disabled]': 'disabled',
695
- '[class.impdc-select--invalid]': 'errorState',
696
- '[class.impdc-select--empty]': 'empty',
697
- '[class.impdc-select--multiple]': 'multiple',
698
- '(focus)': 'onFocus(); focus()'
699
- }, providers: [
700
- {
701
- provide: ImpdcFormFieldControl,
702
- useExisting: SelectComponent
703
- },
704
- {
705
- provide: IMPDC_SELECT_OPTION_PARENT_COMPONENT,
706
- useExisting: SelectComponent
707
- },
708
- {
709
- provide: IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT,
710
- useExisting: SelectComponent
711
- }
712
- ], template: "<div\n ngbDropdown\n #dropdown=\"ngbDropdown\"\n [autoClose]=\"multiple ? 'outside' : true\"\n [container]=\"dropdownContainer\"\n [dropdownClass]=\"dropdownContainer === 'body' ? 'impartner-hex' : ''\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"h-100 w-100\">\n <button\n #toggleButton\n class=\"impdc-select--toggle btn border-0 h-100 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n ngbDropdownToggle>\n @if (empty) {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @else { @if (selectedIsSingle(selected)) {\n <span class=\"impdc-select--text impdc-select--value-text\">\n {{ selected.label }}\n </span>\n } @else if (multipleDisplay === 'inside') {\n <impdc-select-value-tags-display />\n } @else {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @if (!disabled && allowClear) {\n <button\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"$event.stopPropagation(); dropdown.close(); clearSelection()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n } }\n </button>\n <div\n ngbDropdownMenu\n class=\"impdc-select--dropdown-menu bg-white text-gray-600\"\n role=\"listbox\"\n tabindex=\"-1\">\n <div *ngIf=\"search !== 'none'\" class=\"impdc-select--search\">\n <impdc-form-field>\n <span impdcTextPrefix (click)=\"searchInput.focus()\">\n <impdc-icon name=\"search\"></impdc-icon>\n </span>\n <input\n #searchInput\n impdcInput\n [formControl]=\"searchControl\"\n class=\"impdc-select--search-input\"\n type=\"search\"\n (keydown.enter)=\"handleSearchSubmit($event)\"\n (keydown.arrowdown)=\"handleSearchUpDown($event, 'up')\"\n (keydown.arrowup)=\"handleSearchUpDown($event, 'down')\" />\n <span impdcTextSuffix>\n <button\n *ngIf=\"searchControl.value\"\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"searchControl.reset(); searchInput.focus()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n </span>\n </impdc-form-field>\n </div>\n <div class=\"impdc-select--options\">\n @for (option of filteredOptions$ | async; track option.value; let idx =\n $index; let first = $first) { @if (option.groupLabel &&\n option.showGroupLabel) {\n <div class=\"impdc-select--option-group-label\">\n {{ option.groupLabel }}\n </div>\n }\n <impdc-select-option-display\n [class.impdc-select-option--active]=\"idx === activeIndex\"\n [class.impdc-select-option--grouped]=\"!!option.groupLabel\"\n [groupLabel]=\"option.groupLabel\"\n [label]=\"option.label\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [selected]=\"option.selected\"\n [highlightText]=\"searchControl.value\"\n (mouseenter)=\"markActive(idx)\"\n (focus)=\"markActive(idx)\" />\n }\n </div>\n </div>\n</div>\n", styles: [".impdc-select--clear-btn{align-items:center;color:var(--impd-color-gray-400);display:inline-flex;justify-content:center;padding:0;height:2rem;width:2rem;box-shadow:none!important}.impdc-select--clear-btn:focus-visible{box-shadow:var(--impartner-hex-btn-box-shadow),var(--impartner-hex-btn-focus-box-shadow)!important}.impdc-select--clear-btn impdc-icon{line-height:1}.impdc-select--dropdown-menu{overflow:hidden}.impdc-select--search{padding-left:var(--impd-size-2);padding-right:var(--impd-size-2)}.impdc-select--search [impdcTextSuffix]{min-width:3.4rem;width:3.4rem}.impdc-select--options{overflow-y:auto;overflow-x:hidden;max-height:var(--impd-size-72)}.impdc-select--option-group-label{color:var(--impd-color-gray-600);font-size:var(--impd-size-2_5);font-weight:var(--impd-font-weight-semibold);line-height:var(--impd-size-4);padding:var(--impd-size-1) var(--impd-size-4);text-transform:uppercase;white-space:nowrap}.impdc-select--option-group-label:not(:first-child){margin-top:var(--impd-size-2)}button[ngbDropdownToggle].dropdown-toggle:after{display:none}:host{padding:0!important;position:relative}:host.impdc-select--disabled{background-color:var(--impd-color-gray-100)}:host.no-caret{--impartner-hex-form-select-bg-img: none}:host:not(.no-caret) .impdc-select--toggle{padding-right:3.6rem}:host:not(.no-caret).is-invalid .impdc-select--toggle{padding-right:6.6rem}.impdc-select--toggle{font-weight:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;gap:var(--impd-size-1)}.impdc-select--toggle:disabled{cursor:default}.impdc-select--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.impdc-select--value-badges{display:flex;flex-wrap:wrap;gap:var(--impd-size-1);width:100%}\n"] }]
713
- }], ctorParameters: () => [{ type: undefined, decorators: [{
714
- type: Attribute,
715
- args: ['tabindex']
716
- }] }], propDecorators: { allowClear: [{
717
- type: Input,
718
- args: [{ transform: booleanAttribute }]
719
- }], multiple: [{
720
- type: Input,
721
- args: [{ transform: booleanAttribute }]
722
- }], multipleDisplay: [{
723
- type: Input
724
- }] } });
725
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUdOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixlQUFlLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxNQUFNLEVBQ04sbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEdBQUcsRUFDSCxLQUFL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Q0Y7OzBCQVNZLFNBQVM7MkJBQUMsVUFBVTt5Q0FVMUIsVUFBVTtzQkFEaEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJbEIsUUFBUTtzQkFEM0IsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFhL0IsZUFBZTtzQkFEckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGUgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSwgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIEF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxuICBudW1iZXJBdHRyaWJ1dGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ2JEcm9wZG93biwgTmdiRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlZmVyLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRUaGVtZSB9IGZyb20gJy4uLy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGxjIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IEJhZGdlTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vYmFkZ2UnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2ljb24nO1xuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBJbXBkY0Zvcm1Sb290LFxuICBJTVBEQ19GT1JNX1JPT1QsXG4gIEZvcm1GaWVsZE1vZHVsZVxufSBmcm9tICcuLi8uLi9jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ2FuRGlzYWJsZSxcbiAgSGFzVGFiSW5kZXgsXG4gIElDYW5VcGRhdGVFcnJvclN0YXRlLFxuICBJSGFzRXJyb3JTdGF0ZSxcbiAgSW1wZGNGb3JtRmllbGRDb250cm9sLFxuICBtaXhpbkRpc2FibGVkLFxuICBtaXhpbkVycm9yU3RhdGUsXG4gIG1peGluVGFiSW5kZXhcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IElucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vaW5wdXQnO1xuaW1wb3J0IHtcbiAgSU1QRENfU0VMRUNUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULFxuICBJTVBEQ19TRUxFQ1RfVkFMVUVfQkFER0VTX1BBUkVOVF9DT01QT05FTlQsXG4gIElTZWxlY3RPcHRpb25QYXJlbnRDb21wb25lbnQsXG4gIElTZWxlY3RWYWx1ZUJhZGdlc1BhcmVudENvbXBvbmVudFxufSBmcm9tICcuL29wdGlvbi1wYXJlbnQnO1xuaW1wb3J0IHtcbiAgU2VsZWN0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlRXZlbnQsXG4gIFNlbGVjdE9wdGlvbkRpc3BsYXlDb21wb25lbnRcbn0gZnJvbSAnLi9vcHRpb24tZGlzcGxheSc7XG5pbXBvcnQgeyBTZWxlY3RNb2RlbCB9IGZyb20gJy4vc2VsZWN0LW1vZGVsJztcbmltcG9ydCB7IFNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vb3B0aW9uJztcbmltcG9ydCB7IElTZWxlY3RPcHRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2VsZWN0VmFsdWVUYWdzRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4vdmFsdWUtdGFncy1kaXNwbGF5JztcblxuZXhwb3J0IGNvbnN0IE9OX09QRU5fQVVUT19TQ1JPTExfVElNRU9VVF9NUyA9IDUwO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0Q2hhbmdlRXZlbnQ8VENvbXBvbmVudD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHNwZWNpZmljIFNlbGVjdENvbXBvbmVudCB0aGF0IGNoYW5nZWQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogVENvbXBvbmVudCxcbiAgICAvKiogVGhlIHNlbGVjdGVkIHZhbHVlKHMpICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBhbnlcbiAgKSB7fVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gYXNzaWduIGEgbm9uLWFycmF5IHZhbHVlIHRvIGEgc2VsZWN0XG4gKiBpbiBgbXVsdGlwbGVgIG1vZGUuIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIGFyZSBzdGlsbCB2YWxpZCB2YWx1ZXMgdG8gYWxsb3cgZm9yXG4gKiByZXNldHRpbmcgdGhlIHZhbHVlLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wZGNTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4gRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYXNzaWduaW5nIGEgbm9uLWZ1bmN0aW9uIHZhbHVlIHRvIHRoZSBjb21wYXJhdG9yXG4gKiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuIG9wdGlvbi4gTm90ZSB0aGF0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uXG4gKiBhY3R1YWxseSB0YWtlcyB0d28gdmFsdWVzIGFuZCByZXR1cm5zIGEgYm9vbGVhbiBpcyBub3QgY2hlY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGRjU2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCk6IEVycm9yIHtcbiAgcmV0dXJuIEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBhIHNlbGVjdCdzIGBtdWx0aXBsZWAgb3B0aW9uXG4gKiBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGRjU2VsZWN0RHluYW1pY011bHRpcGxlRXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4gRXJyb3IoJ0Nhbm5vdCBjaGFuZ2UgYG11bHRpcGxlYCBtb2RlIG9mIHNlbGVjdCBhZnRlciBpbml0aWFsaXphdGlvbi4nKTtcbn1cblxuY29uc3QgREVGQVVMVF9BQ1RJVkVfSU5ERVggPSAtMTtcblxuaW50ZXJmYWNlIElSZW5kZXJlZFNlbGVjdE9wdGlvbiBleHRlbmRzIElTZWxlY3RPcHRpb24ge1xuICByZWFkb25seSBzZWxlY3RlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3dHcm91cExhYmVsPzogYm9vbGVhbjtcbn1cblxuY29uc3QgX19TZWxlY3RDb21wb25lbnRCYXNlID0gbWl4aW5UYWJJbmRleChcbiAgbWl4aW5EaXNhYmxlZChcbiAgICBtaXhpbkVycm9yU3RhdGUoXG4gICAgICBjbGFzcyB7XG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICAgICAgICBwdWJsaWMgX2Zvcm1Sb290OiBJbXBkY0Zvcm1Sb290IHwgbnVsbCxcbiAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSB8IG51bGwsXG4gICAgICAgICAgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSB8IG51bGwsXG4gICAgICAgICAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbFxuICAgICAgICApIHt9XG4gICAgICB9XG4gICAgKVxuICApXG4pO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBfU2VsZWN0Q29tcG9uZW50QmFzZVxuICBleHRlbmRzIF9fU2VsZWN0Q29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzXG4gICAgSVNlbGVjdE9wdGlvblBhcmVudENvbXBvbmVudCxcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgRG9DaGVjayxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgSGFzVGFiSW5kZXgsXG4gICAgSW1wZGNGb3JtRmllbGRDb250cm9sPGFueT4sXG4gICAgQ2FuRGlzYWJsZSxcbiAgICBJQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgICBJSGFzRXJyb3JTdGF0ZVxue1xuICBAQ29udGVudENoaWxkcmVuKFNlbGVjdE9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgc3RhdGljT3B0aW9ucyE6IFF1ZXJ5TGlzdDxTZWxlY3RPcHRpb25Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oU2VsZWN0T3B0aW9uRGlzcGxheUNvbXBvbmVudClcbiAgcHJvdGVjdGVkIG9wdGlvbnMhOiBRdWVyeUxpc3Q8U2VsZWN0T3B0aW9uRGlzcGxheUNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZChOZ2JEcm9wZG93bilcbiAgcHJvdGVjdGVkIG5nYkRyb3Bkb3duITogTmdiRHJvcGRvd247XG5cbiAgQFZpZXdDaGlsZCgndG9nZ2xlQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByb3RlY3RlZCB0b2dnbGVCdXR0b25SZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiB9KVxuICBwcm90ZWN0ZWQgc2VhcmNoSW5wdXRSZWY/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCdub25lJyB8ICdzdGF0aWMnPihcbiAgICAnbm9uZSdcbiAgKTtcbiAgcHJpdmF0ZSBfcHJldmlvdXNDb250cm9sPzogQWJzdHJhY3RDb250cm9sIHwgbnVsbDtcbiAgcHJpdmF0ZSBfY29tcGFyZVdpdGggPSAobzE6IGFueSwgbzI6IGFueSkgPT4gbzEgPT09IG8yO1xuICBwcml2YXRlIF9jdmFPbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBfY3ZhT25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVpZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2hDb250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQmFkZ2VUaGVtZSA9IENvbXBvbmVudFRoZW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWRPcHRpb25zJDogT2JzZXJ2YWJsZTxJUmVuZGVyZWRTZWxlY3RPcHRpb25bXT4gPVxuICAgIHRoaXMuX3NlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hNb2RlID0+IHtcbiAgICAgICAgc3dpdGNoIChzZWFyY2hNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRpY09wdGlvbnMuY2hhbmdlcyBhcyBPYnNlcnZhYmxlPElTZWxlY3RPcHRpb25bXT5cbiAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuc3RhdGljT3B0aW9ucy50b0FycmF5KCkgYXMgSVNlbGVjdE9wdGlvbltdKSxcbiAgICAgICAgICAgICAgbWFwKG9wdGlvbnMgPT5cbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcChvcHQgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGdyb3VwTGFiZWw6IG9wdC5ncm91cExhYmVsLFxuICAgICAgICAgICAgICAgICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LmxhYmVsO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHQuZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHQpXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgKHRoaXMuc3RhdGljT3B0aW9ucy5jaGFuZ2VzIGFzIE9ic2VydmFibGU8SVNlbGVjdE9wdGlvbltdPikucGlwZShcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgodGhpcy5zdGF0aWNPcHRpb25zLnRvQXJyYXkoKSBhcyBJU2VsZWN0T3B0aW9uW10pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZXMucGlwZShzdGFydFdpdGgoJycpKVxuICAgICAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChbLCBzZWFyY2hUZXh0XSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSAhIXNlYXJjaFRleHQgPyAwIDogREVGQVVMVF9BQ1RJVkVfSU5ERVg7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBtYXAoKFtvcHRpb25zLCBzZWFyY2hUZXh0XSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkT3B0aW9ucyA9IG9wdGlvbnMubWFwKG9wdCA9PiAoe1xuICAgICAgICAgICAgICAgICAgZ3JvdXBMYWJlbDogb3B0Lmdyb3VwTGFiZWwsXG4gICAgICAgICAgICAgICAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHQubGFiZWw7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdC5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdClcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gISFzZWFyY2hUZXh0XG4gICAgICAgICAgICAgICAgICA/IHJlbmRlcmVkT3B0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgb3B0ID0+IGxjKG9wdC5sYWJlbCkuaW5kZXhPZihsYyhzZWFyY2hUZXh0KSkgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIDogcmVuZGVyZWRPcHRpb25zO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAob3B0aW9ucyA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBvcHRpb25zLnJlZHVjZSgocmVzdWx0LCBvcHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkR3JvdXBMYWJlbCA9IG9wdC5ncm91cExhYmVsPy50cmltKCkgfHwgJyc7XG4gICAgICAgICAgICBsZXQgc2hvd0dyb3VwTGFiZWwgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKCEocmVzb2x2ZWRHcm91cExhYmVsIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0W3Jlc29sdmVkR3JvdXBMYWJlbF0gPSBbXTtcbiAgICAgICAgICAgICAgc2hvd0dyb3VwTGFiZWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRbcmVzb2x2ZWRHcm91cExhYmVsXS5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ub3B0LFxuICAgICAgICAgICAgICBzaG93R3JvdXBMYWJlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0sIHt9IGFzIHsgW2tleTogc3RyaW5nXTogSVJlbmRlcmVkU2VsZWN0T3B0aW9uW10gfSlcbiAgICAgICAgKS5mbGF0TWFwKChbLCBncm91cE9wdGlvbnNdKSA9PiBncm91cE9wdGlvbnMpXG4gICAgICApXG4gICAgKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGlvbk1vZGVsITogU2VsZWN0TW9kZWw8SVNlbGVjdE9wdGlvbj47XG4gIHByb3RlY3RlZCBhY3RpdmVJbmRleCA9IERFRkFVTFRfQUNUSVZFX0lOREVYO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25TZWxlY3Rpb25DaGFuZ2VzOiBPYnNlcnZhYmxlPFNlbGVjdE9wdGlvblNlbGVjdGlvbkNoYW5nZUV2ZW50PiA9XG4gICAgZGVmZXIoKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChvcHRpb25zKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgIG1lcmdlKC4uLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ub25TZWxlY3Rpb25DaGFuZ2UpKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpXG4gICAgICApO1xuICAgIH0pO1xuXG4gIC8qKlxuICAgKiBTZXQgd2hldGhlciBvciBub3QgYW4gaW5wdXQgZmllbGQgd2lsbCBhcHBlYXIgZm9yIHNlYXJjaGluZyBhbmRcbiAgICogZmlsdGVyaW5nIHZpc2libGUgb3B0aW9ucy5cbiAgICpcbiAgICogLSBgJ25vbmUnYDogTm8gc2VhcmNoIGNvbnRyb2wgd2lsbCBiZSBkaXNwbGF5ZWQsIGFuZCBhbGwgc2VsZWN0IG9wdGlvbnMgYXJlIHByb3ZpZGVkIHZpYSBwcm9qZWN0ZWQgYDxpbXBkYy1zZWxlY3Qtb3B0aW9uPmAgZWxlbWVudHMuXG4gICAqIC0gYCdzdGF0aWMnYDogQSBzZWFyY2ggY29udHJvbCB3aWxsIGJlIGRpc3BsYXllZCwgc2VsZWN0IG9wdGlvbnMgYXJlIHByb3ZpZGVkIHZpYSBwcm9qZWN0ZWQgYDxpbXBkYy1zZWxlY3Qtb3B0aW9uPmAgZWxlbWVudHMsIGFuZFxuICAgKiBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlIGBbbGFiZWxdYCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgcHVibGljIGdldCBzZWFyY2goKTogJ25vbmUnIHwgJ3N0YXRpYycge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hTdWJqZWN0LnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VhcmNoKHZhbHVlOiAnbm9uZScgfCAnc3RhdGljJykge1xuICAgIHRoaXMuX3NlYXJjaFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYWNlaG9sZGVyIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIG5vIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcXC0gU2VsZWN0IC1cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgcHVibGljIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9wbGFjZWhvbGRlciA9ICctIFNlbGVjdCAtJztcblxuICAvKipcbiAgICogVXNlZCB0byBzZXQgcmVxdWlyZWRuZXNzIG9mIGNvbnRyb2wgaW4gYSB0ZW1wbGF0ZS1iYXNlZCBtYW5uZXI7XG4gICAqIG5vdCBuZWNlc3Nhcnkgd2hlbiB1c2luZyB0aGUgQW5ndWxhciByZWFjdGl2ZSBmb3JtcyBBUEkgYW5kIGByZXF1aXJlZGAgdmFsaWRhdG9yLlxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fcmVxdWlyZWQgPz9cbiAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgPz9cbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgYSBzaW5nbGUtc2VsZWN0IG9yIG11bHRpcGxlLXNlbGVjdC4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY29tcG9uZW50IGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cbiAgcHJvdGVjdGVkIF9tdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgb3B0aW9uIHZhbHVlcyB3aXRoIHNlbGVjdGVkIHZhbHVlcy4gVGhlIGZpcnN0IGFyZyBpcyBhXG4gICAqIGB2YWx1ZWAgZnJvbSBhbiBvcHRpb24sIGFuZCB0aGUgc2Vjb25kIGFyZyBpcyBhIGB2YWx1ZWAgZnJvbSB0aGUgc2VsZWN0aW9uIG9yIGFub3RoZXIgb3B0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGFyZVdpdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcmVXaXRoO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGFyZVdpdGgoZm46IChhOiBhbnksIGI6IGFueSkgPT4gYm9vbGVhbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGdldEltcGRjU2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAvLyBDaGFuZ2luZyB0aGUgY29tcGFyYXRvciBmdW5jdGlvbiBtZWFucyB0aGUgdmlzdWFsIHNlbGVjdGlvbiBtYXkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2N1bWVudCBlbGVtZW50IHRoYXQgdGhlIHNlbGVjdCBkcm9wZG93biB3aWxsIGJlIGF0dGFjaGVkIHRvIGluIHRoZSBET00gLSBlaXRoZXIgdGhlXG4gICAqIGRvY3VtZW50J3MgYDxib2R5PmAgdGFnLCBvciBhcyBhIGNoaWxkIG9mIHRoZSBjb21wb25lbnQgdGFnLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSAoYCdib2R5J2ApIGlzIGdlbmVyYWxseSB0aGUgY29ycmVjdCBjaG9pY2UsIGFuZCBzaG91bGQgb25seSBiZVxuICAgKiBvdmVycmlkZGVuIHdoZW4gYWJzb2x1dGVseSBjZXJ0YWluIHRoYXQgdGhlIHJlc3VsdCBiZWhhdmlvciBpcyB3aGF0J3MgZGVzaXJlZC5cbiAgICovXG4gIHB1YmxpYyBkcm9wZG93bkNvbnRhaW5lcjogJ2JvZHknIHwgbnVsbCA9ICdib2R5JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZXJyb3JTdGF0ZU1hdGNoZXIhOiBFcnJvclN0YXRlTWF0Y2hlcjtcblxuICAvKiogRXZlbnRzIGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCBieSB0aGUgdXNlci4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPFNlbGVjdENoYW5nZUV2ZW50PHRoaXM+PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RDaGFuZ2VFdmVudDx0aGlzPj4oKTtcblxuICAvKipcbiAgICogRXZlbnRzIGZpcmUgd2hlbiByYXcgdmFsdWUgb2Ygc2VsZWN0IGNoYW5nZXMuIE1haW5seSBleGlzdHMgdG8gaGFuZGxlXG4gICAqIHR3by13YXkgYmluZGluZyBvZiBgdmFsdWVgIGlucHV0IHByb3BlcnR5LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50cyBmaXJlIHdoZW4gdGhlIHRleHQgdmFsdWUgb2YgdGhlIG9wdGlvbiBzZWFyY2ggaW5wdXQgY29udHJvbCBoYXMgY2hhbmdlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoVGV4dENoYW5nZXM6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPVxuICAgIHRoaXMuc2VhcmNoQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIGRlYm91bmNlVGltZSgyMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG5cbiAgY29uc3RydWN0b3IodWlkOiBzdHJpbmcsIHRhYkluZGV4Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBpbmplY3QoRXJyb3JTdGF0ZU1hdGNoZXIpLFxuICAgICAgaW5qZWN0KElNUERDX0ZPUk1fUk9PVCwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIGluamVjdChOZ0Zvcm0sIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICBpbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pLFxuICAgICAgaW5qZWN0KE5nQ29udHJvbCwgeyBvcHRpb25hbDogdHJ1ZSwgc2VsZjogdHJ1ZSB9KVxuICAgICk7XG5cbiAgICB0aGlzLnVpZCA9IHVpZDtcblxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuXG4gICAgLy8gaWRlbXBvdGVudCBhc3NpZ25tZW50IC0gcmVzcGVjdHMgYXJiaXRyYXJ5IElEIHNldCB2aWEgYXR0ciBpZiBwcmVzZW50LCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBhdXRvIFVVSUQ7XG4gICAgLy8gYWxzbyB0cmlnZ2VycyBzdGF0ZUNoYW5nZXMgcHVsc2UgZm9yIHBhcmVudCBmb3JtLWZpZWxkIGNvbXBvbmVudFxuICAgIHRoaXMuaWQgPSB0aGlzLmlkO1xuXG4gICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4ID8/ICcnKSB8fCAwO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bk9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmdiRHJvcGRvd24/LmlzT3BlbigpID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc2VsZWN0aW9uTW9kZWwgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCk6IElTZWxlY3RPcHRpb24gfCBJU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZVxuICAgICAgPyB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCB8fCBbXVxuICAgICAgOiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZFswXTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVCdXR0b25SZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlT3BlbkNoYW5nZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB0aGlzLm9uRm9jdXMoKTtcblxuICAgICAgaWYgKHRoaXMuc2VhcmNoICE9PSAnbm9uZScgJiYgISF0aGlzLnNlYXJjaElucHV0UmVmKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgT05fT1BFTl9BVVRPX1NDUk9MTF9USU1FT1VUX01TKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9tdWx0aXBsZSAmJiAhIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uQmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlSW5kZXggPSBERUZBVUxUX0FDVElWRV9JTkRFWDtcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wucmVzZXQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICAvKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rcyAqL1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdE1vZGVsPElTZWxlY3RPcHRpb24+KFxuICAgICAgdGhpcy5fbXVsdGlwbGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aChhLnZhbHVlLCBiLnZhbHVlKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX25nRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKGNoYW5nZUV2ZW50ID0+IHtcbiAgICAgICAgY2hhbmdlRXZlbnQuYWRkZWQuZm9yRWFjaChvcHRpb24gPT5cbiAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgIC5maW5kKG8gPT4gdGhpcy5jb21wYXJlV2l0aChvLnZhbHVlLCBvcHRpb24udmFsdWUpKVxuICAgICAgICAgICAgPy5zZWxlY3QoKVxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VFdmVudC5yZW1vdmVkLmZvckVhY2gob3B0aW9uID0+XG4gICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICAuZmluZChvID0+IHRoaXMuY29tcGFyZVdpdGgoby52YWx1ZSwgb3B0aW9uLnZhbHVlKSlcbiAgICAgICAgICAgID8uZGVzZWxlY3QoKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fbmdEZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMubmdDb250cm9sO1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNDb250cm9sICE9PSBuZ0NvbnRyb2wuY29udHJvbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IG51bGwgJiZcbiAgICAgICAgbmdDb250cm9sLmRpc2FibGVkICE9PSB0aGlzLmRpc2FibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG5nQ29udHJvbD8uZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBNYW5hZ2luZyBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIHZpYSB0aGUgYG1peGluRGlzYWJsZWRgIG1peGluL2dlbmVyYXRvciwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gdG8gdGhlIHBhcmVudCBmb3JtIGZpZWxkIHNvIGl0IGNhbiBydW4gY2hhbmdlIGRldGVjdGlvbiB3aGVuIGRpc2FibGVkIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdEZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLl9uZ0Rlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyogSW1wZGNGb3JtRmllbGRDb250cm9sICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb250cm9sVHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzdXBwb3J0c0FmZml4ZXM6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBoYXNBc3NpZ25lZCA9IHRoaXMuX2Fzc2lnblZhbHVlKHZhbHVlKTtcblxuICAgIGlmIChoYXNBc3NpZ25lZCkge1xuICAgICAgdGhpcy5fY3ZhT25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMudWlkO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgX2lkITogc3RyaW5nO1xuXG4gIHB1YmxpYyBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLmRyb3Bkb3duT3BlbjtcbiAgfVxuICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAvKiBDb250cm9sVmFsdWVBY2Nlc3NvciAqL1xuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fYXNzaWduVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY3ZhT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9jdmFPblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qIEludGVybmFscyAqL1xuXG4gIHByb3RlY3RlZCBvbkZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBDVkEgdG91Y2hlZCBjYWxsYmFjayBvbmx5IGlmIHRoZSBkcm9wZG93biBpcyBjbG9zZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuX2N2YU9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5mb2N1cygpO1xuICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWFyY2hTdWJtaXQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4IDwgMCB8fCB0aGlzLmFjdGl2ZUluZGV4ID49IHRoaXMub3B0aW9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMub3B0aW9ucy5nZXQodGhpcy5hY3RpdmVJbmRleCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWFyY2hVcERvd24oZXZ0OiBFdmVudCwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9ICh0aGlzLmFjdGl2ZUluZGV4ICsgMSkgJSB0aGlzLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA8PSAwKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXgtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBY3RpdmUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkSXNTaW5nbGUoXG4gICAgc2VsZWN0ZWQ6IElTZWxlY3RPcHRpb24gfCBJU2VsZWN0T3B0aW9uW11cbiAgKTogc2VsZWN0ZWQgaXMgSVNlbGVjdE9wdGlvbiB7XG4gICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHNlbGVjdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gV2UgZGVmZXIgdGhpcyB3b3JrIGludG8gYSBwcm9taXNlIGluIG9yZGVyIHRvIGF2b2lkIHRyaXBwaW5nIEFuZ3VsYXInc1xuICAgIC8vIFwiRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZFwiIGVycm9yLlxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5uZ0NvbnRyb2wudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZTogYW55IHwgYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWFyY2ggPT09ICdub25lJykge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tdWx0aXBsZSAmJiB2YWx1ZSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBnZXRJbXBkY1NlbGVjdE5vbkFycmF5VmFsdWVFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZS5mb3JFYWNoKGN1cnJlbnRWYWx1ZSA9PiB0aGlzLl9zZWxlY3RPcHRpb25CeVZhbHVlKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgdGhpcy5fc29ydFZhbHVlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RPcHRpb25CeVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdE9wdGlvbkJ5VmFsdWUoXG4gICAgdmFsdWU6IGFueVxuICApOiBTZWxlY3RPcHRpb25EaXNwbGF5Q29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAob3B0aW9uOiBTZWxlY3RPcHRpb25EaXNwbGF5Q29tcG9uZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZSAhPSBudWxsICYmIHRoaXMuX2NvbXBhcmVXaXRoKG9wdGlvbi52YWx1ZSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmIChjb3JyZXNwb25kaW5nT3B0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdChjb3JyZXNwb25kaW5nT3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29ycmVzcG9uZGluZ09wdGlvbjtcbiAgfVxuXG4gIC8qKiBBc3NpZ25zIGEgdmFsdWUgdG8gdGhlIHNlbGVjdCBjb250cm9sLiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIHByaXZhdGUgX2Fzc2lnblZhbHVlKG5ld1ZhbHVlOiBhbnkgfCBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSB8fFxuICAgICAgKHRoaXMuX211bHRpcGxlICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucykge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRPcHRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9ucy5jaGFuZ2VzLCB0aGlzLl9uZ0Rlc3Ryb3kpO1xuXG4gICAgdGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwoY2hhbmdlZE9yRGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9vblNlbGVjdChldmVudC5zb3VyY2UsIGV2ZW50LmlzVXNlcklucHV0KTtcblxuICAgICAgICBpZiAoZXZlbnQuaXNVc2VySW5wdXQgJiYgIXRoaXMuX211bHRpcGxlICYmIHRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgdGhpcy5uZ2JEcm9wZG93bi5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBtZXJnZSguLi50aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24uc3RhdGVDaGFuZ2VzKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0KFxuICAgIG9wdGlvbjogU2VsZWN0T3B0aW9uRGlzcGxheUNvbXBvbmVudCxcbiAgICBpc1VzZXJJbnB1dDogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pO1xuXG4gICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsICYmICF0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgb3B0aW9uLmRlc2VsZWN0KCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG5cbiAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlcyhvcHRpb24udmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2FzU2VsZWN0ZWQgIT09IG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWRcbiAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KG9wdGlvbilcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3Qob3B0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX211bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2FzU2VsZWN0ZWQgIT09IHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0VmFsdWVzKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX211bHRpcGxlICYmXG4gICAgICAodGhpcy5zZWFyY2ggPT09ICdub25lJyB8fCB0aGlzLnNlYXJjaCA9PT0gJ3N0YXRpYycpXG4gICAgKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5zdGF0aWNPcHRpb25zLnRvQXJyYXkoKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgb3B0aW9ucy5maW5kSW5kZXgobyA9PiB0aGlzLmNvbXBhcmVXaXRoKG8udmFsdWUsIGEudmFsdWUpKSAtXG4gICAgICAgICAgb3B0aW9ucy5maW5kSW5kZXgobyA9PiB0aGlzLmNvbXBhcmVXaXRoKG8udmFsdWUsIGIudmFsdWUpKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Byb3BhZ2F0ZUNoYW5nZXMoZmFsbGJhY2tWYWx1ZT86IGFueSk6IHZvaWQge1xuICAgIGxldCB2YWxUb0VtaXQ6IGFueSA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHtcbiAgICAgIHZhbFRvRW1pdCA9ICh0aGlzLnNlbGVjdGVkIGFzIElTZWxlY3RPcHRpb25bXSkubWFwKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnZhbHVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxUb0VtaXQgPSB0aGlzLnNlbGVjdGVkXG4gICAgICAgID8gKHRoaXMuc2VsZWN0ZWQgYXMgSVNlbGVjdE9wdGlvbikudmFsdWVcbiAgICAgICAgOiBmYWxsYmFja1ZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlID0gdmFsVG9FbWl0O1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWxUb0VtaXQpO1xuICAgIHRoaXMuX2N2YU9uQ2hhbmdlKHZhbFRvRW1pdCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9idWlsZENoYW5nZUV2ZW50KHZhbFRvRW1pdCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9idWlsZENoYW5nZUV2ZW50KHZhbHVlOiBhbnkpOiBTZWxlY3RDaGFuZ2VFdmVudDx0aGlzPiB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RDaGFuZ2VFdmVudCh0aGlzLCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcm90ZWN0ZWQgX2Rlc2VsZWN0T3B0aW9uKFxuICAgIG9wdGlvbjogSVNlbGVjdE9wdGlvbixcbiAgICBtYXJrVG91Y2hlZDogYm9vbGVhbiA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX211bHRpcGxlICYmIHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KG9wdGlvbik7XG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCk7XG5cbiAgICAgIGlmIChtYXJrVG91Y2hlZCkge1xuICAgICAgICB0aGlzLl9jdmFPblRvdWNoZWQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zY3JvbGxUb1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuICYmIHRoaXMuc2VsZWN0ZWQgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25FbGVtZW50ID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkgJiZcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVdpdGgoby52YWx1ZSwgdGhpcy5zZWxlY3RlZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25FbGVtZW50Py5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBibG9jazogJ25lYXJlc3QnLFxuICAgICAgICAgIGlubGluZTogJ25lYXJlc3QnLFxuICAgICAgICAgIGJlaGF2aW9yOiAnaW5zdGFudCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgT05fT1BFTl9BVVRPX1NDUk9MTF9USU1FT1VUX01TKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgU2VsZWN0Q29tcG9uZW50YCAoYDxpbXBkYy1zZWxlY3RgKSBpcyBhIHNlbGVjdC1zdHlsZSBkcm9wZG93biBpbnB1dCB3aGVyZSBhbiBpdGVtIChvciBtdWx0aXBsZSBpdGVtcykgY2FuIGJlIHBpY2tlZFxuICogZnJvbSBhIGxpc3Qgb2YgKnVuaXF1ZSogYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY29tcG9uZW50IGNhbiBiZSB1c2VkIHdpdGhpbiBhIGBGb3JtRmllbGRDb21wb25lbnRgIChgPGltcGRjLWZvcm0tZmllbGRgKS5cbiAqIFRvIHVzZSwgYWRkIGBTZWxlY3RNb2R1bGVgIHRvIHRoZSBgaW1wb3J0c2AgYXJyYXkgb2YgdGhlIHJlbGV2YW50IGBOZ01vZHVsZWAgb3Igc3RhbmRhbG9uZSBjb21wb25lbnQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXNlbGVjdCcsXG4gIGV4cG9ydEFzOiAnaW1wZGNTZWxlY3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nYkRyb3Bkb3duTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgU2VsZWN0T3B0aW9uRGlzcGxheUNvbXBvbmVudCxcbiAgICBTZWxlY3RWYWx1ZVRhZ3NEaXNwbGF5Q29tcG9uZW50LFxuICAgIEZvcm1GaWVsZE1vZHVsZSxcbiAgICBJbnB1dERpcmVjdGl2ZSxcbiAgICBCYWRnZU1vZHVsZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gIGlucHV0czogW1xuICAgICdkaXNhYmxlZCcsXG4gICAgeyBuYW1lOiAndGFiSW5kZXgnLCB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9LFxuICAgICdzZWFyY2gnLFxuICAgICdwbGFjZWhvbGRlcicsXG4gICAgeyBuYW1lOiAncmVxdWlyZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSxcbiAgICAnY29tcGFyZVdpdGgnLFxuICAgICdkcm9wZG93bkNvbnRhaW5lcicsXG4gICAgJ2Vycm9yU3RhdGVNYXRjaGVyJ1xuICBdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dHMtbWV0YWRhdGEtcHJvcGVydHlcbiAgb3V0cHV0czogWydzZWxlY3Rpb25DaGFuZ2UnLCAndmFsdWVDaGFuZ2UnLCAnc2VhcmNoVGV4dENoYW5nZXMnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eVxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICdpZCcsXG4gICAgJ1thdHRyLnRhYmluZGV4XSc6ICd0YWJJbmRleCcsXG4gICAgJ1thdHRyLmFyaWEtcmVxdWlyZWRdJzogJ3JlcXVpcmVkLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZC50b1N0cmluZygpJyxcbiAgICAnW2F0dHIuYXJpYS1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmZvcm0tc2VsZWN0XSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmlzLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuaW1wZGMtZm9ybS1maWVsZC1jb250cm9sXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0taW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtLWVtcHR5XSc6ICdlbXB0eScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtLW11bHRpcGxlXSc6ICdtdWx0aXBsZScsXG4gICAgJyhmb2N1cyknOiAnb25Gb2N1cygpOyBmb2N1cygpJ1xuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBJbXBkY0Zvcm1GaWVsZENvbnRyb2wsXG4gICAgICB1c2VFeGlzdGluZzogU2VsZWN0Q29tcG9uZW50XG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBJTVBEQ19TRUxFQ1RfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogU2VsZWN0Q29tcG9uZW50XG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBJTVBEQ19TRUxFQ1RfVkFMVUVfQkFER0VTX1BBUkVOVF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogU2VsZWN0Q29tcG9uZW50XG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIF9TZWxlY3RDb21wb25lbnRCYXNlXG4gIGltcGxlbWVudHMgSVNlbGVjdFZhbHVlQmFkZ2VzUGFyZW50Q29tcG9uZW50XG57XG4gIHB1YmxpYyByZWFkb25seSBjb250cm9sVHlwZTogc3RyaW5nID0gJ2ltcGRjLXNlbGVjdCc7XG4gIHB1YmxpYyByZWFkb25seSBzdXBwb3J0c0FmZml4ZXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKEBBdHRyaWJ1dGUoJ3RhYmluZGV4JykgdGFiSW5kZXg/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihgaW1wZGMtc2VsZWN0LSR7bmFub2lkKCl9YCwgdGFiSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRoZSB1c2VyIHRvIGNsaWNrIGEgYnV0dG9uIGluc2lkZSBvZiB0aGUgc2VsZWN0IGNvbnRyb2wgYW5kIGNsZWFyIHRoZWlyIHNlbGVjdGlvbihzKTtcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBhbGxvd0NsZWFyOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICB0aHJvdyBnZXRJbXBkY1NlbGVjdER5bmFtaWNNdWx0aXBsZUVycm9yKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtdWx0aXBsZURpc3BsYXk6ICdpbnNpZGUnIHwgJ291dHNpZGUnID0gJ2luc2lkZSc7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGRlc2VsZWN0T3B0aW9uKG9wdGlvbjogSVNlbGVjdE9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Rlc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gIH1cbn1cbiIsIjxkaXZcbiAgbmdiRHJvcGRvd25cbiAgI2Ryb3Bkb3duPVwibmdiRHJvcGRvd25cIlxuICBbYXV0b0Nsb3NlXT1cIm11bHRpcGxlID8gJ291dHNpZGUnIDogdHJ1ZVwiXG4gIFtjb250YWluZXJdPVwiZHJvcGRvd25Db250YWluZXJcIlxuICBbZHJvcGRvd25DbGFzc109XCJkcm9wZG93bkNvbnRhaW5lciA9PT0gJ2JvZHknID8gJ2ltcGFydG5lci1oZXgnIDogJydcIlxuICAob3BlbkNoYW5nZSk9XCJoYW5kbGVPcGVuQ2hhbmdlKCRldmVudClcIlxuICBjbGFzcz1cImgtMTAwIHctMTAwXCI+XG4gIDxidXR0b25cbiAgICAjdG9nZ2xlQnV0dG9uXG4gICAgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLXRvZ2dsZSBidG4gYm9yZGVyLTAgaC0xMDAgdGV4dC1zdGFydFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxuICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICBuZ2JEcm9wZG93blRvZ2dsZT5cbiAgICBAaWYgKGVtcHR5KSB7XG4gICAgPHNwYW4gY2xhc3M9XCJpbXBkYy1zZWxlY3QtLXRleHQgaW1wZGMtc2VsZWN0LS1wbGFjZWhvbGRlclwiPnt7XG4gICAgICBwbGFjZWhvbGRlclxuICAgIH19PC9zcGFuPlxuICAgIH0gQGVsc2UgeyBAaWYgKHNlbGVjdGVkSXNTaW5nbGUoc2VsZWN0ZWQpKSB7XG4gICAgPHNwYW4gY2xhc3M9XCJpbXBkYy1zZWxlY3QtLXRleHQgaW1wZGMtc2VsZWN0LS12YWx1ZS10ZXh0XCI+XG4gICAgICB7eyBzZWxlY3RlZC5sYWJlbCB9fVxuICAgIDwvc3Bhbj5cbiAgICB9IEBlbHNlIGlmIChtdWx0aXBsZURpc3BsYXkgPT09ICdpbnNpZGUnKSB7XG4gICAgPGltcGRjLXNlbGVjdC12YWx1ZS10YWdzLWRpc3BsYXkgLz5cbiAgICB9IEBlbHNlIHtcbiAgICA8c3BhbiBjbGFzcz1cImltcGRjLXNlbGVjdC0tdGV4dCBpbXBkYy1zZWxlY3QtLXBsYWNlaG9sZGVyXCI+e3tcbiAgICAgIHBsYWNlaG9sZGVyXG4gICAgfX08L3NwYW4+XG4gICAgfSBAaWYgKCFkaXNhYmxlZCAmJiBhbGxvd0NsZWFyKSB7XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC0tY2xlYXItYnRuIGJ0biBidG4teHMgYnRuLWxpbmsgdGV4dC1ncmF5LTQwMCBtcy1hdXRvXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGRyb3Bkb3duLmNsb3NlKCk7IGNsZWFyU2VsZWN0aW9uKClcIj5cbiAgICAgIDxpbXBkYy1pY29uIG5hbWU9XCJ0aW1lc1wiIFtzaXplXT1cIjE2XCI+PC9pbXBkYy1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIH0gfVxuICA8L2J1dHRvbj5cbiAgPGRpdlxuICAgIG5nYkRyb3Bkb3duTWVudVxuICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LS1kcm9wZG93bi1tZW51IGJnLXdoaXRlIHRleHQtZ3JheS02MDBcIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgPGRpdiAqbmdJZj1cInNlYXJjaCAhPT0gJ25vbmUnXCIgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLXNlYXJjaFwiPlxuICAgICAgPGltcGRjLWZvcm0tZmllbGQ+XG4gICAgICAgIDxzcGFuIGltcGRjVGV4dFByZWZpeCAoY2xpY2spPVwic2VhcmNoSW5wdXQuZm9jdXMoKVwiPlxuICAgICAgICAgIDxpbXBkYy1pY29uIG5hbWU9XCJzZWFyY2hcIj48L2ltcGRjLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgaW1wZGNJbnB1dFxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWFyY2hDb250cm9sXCJcbiAgICAgICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC0tc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVTZWFyY2hTdWJtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24uYXJyb3dkb3duKT1cImhhbmRsZVNlYXJjaFVwRG93bigkZXZlbnQsICd1cCcpXCJcbiAgICAgICAgICAoa2V5ZG93bi5hcnJvd3VwKT1cImhhbmRsZVNlYXJjaFVwRG93bigkZXZlbnQsICdkb3duJylcIiAvPlxuICAgICAgICA8c3BhbiBpbXBkY1RleHRTdWZmaXg+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hDb250cm9sLnZhbHVlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLWNsZWFyLWJ0biBidG4gYnRuLXhzIGJ0bi1saW5rIHRleHQtZ3JheS00MDAgbXMtYXV0b1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoQ29udHJvbC5yZXNldCgpOyBzZWFyY2hJbnB1dC5mb2N1cygpXCI+XG4gICAgICAgICAgICA8aW1wZGMtaWNvbiBuYW1lPVwidGltZXNcIiBbc2l6ZV09XCIxNlwiPjwvaW1wZGMtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9pbXBkYy1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLW9wdGlvbnNcIj5cbiAgICAgIEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrIG9wdGlvbi52YWx1ZTsgbGV0IGlkeCA9XG4gICAgICAkaW5kZXg7IGxldCBmaXJzdCA9ICRmaXJzdCkgeyBAaWYgKG9wdGlvbi5ncm91cExhYmVsICYmXG4gICAgICBvcHRpb24uc2hvd0dyb3VwTGFiZWwpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLW9wdGlvbi1ncm91cC1sYWJlbFwiPlxuICAgICAgICB7eyBvcHRpb24uZ3JvdXBMYWJlbCB9fVxuICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvbi1kaXNwbGF5XG4gICAgICAgIFtjbGFzcy5pbXBkYy1zZWxlY3Qtb3B0aW9uLS1hY3RpdmVdPVwiaWR4ID09PSBhY3RpdmVJbmRleFwiXG4gICAgICAgIFtjbGFzcy5pbXBkYy1zZWxlY3Qtb3B0aW9uLS1ncm91cGVkXT1cIiEhb3B0aW9uLmdyb3VwTGFiZWxcIlxuICAgICAgICBbZ3JvdXBMYWJlbF09XCJvcHRpb24uZ3JvdXBMYWJlbFwiXG4gICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiEhb3B0aW9uLmRpc2FibGVkXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXG4gICAgICAgIFtoaWdobGlnaHRUZXh0XT1cInNlYXJjaENvbnRyb2wudmFsdWVcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJtYXJrQWN0aXZlKGlkeClcIlxuICAgICAgICAoZm9jdXMpPVwibWFya0FjdGl2ZShpZHgpXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==