@impartner/design-components 1.0.0

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 (315) hide show
  1. package/LICENSE.txt +11 -0
  2. package/README.md +22 -0
  3. package/constants/fontawesome-icons.d.ts +6 -0
  4. package/constants/index.d.ts +1 -0
  5. package/esm2020/constants/fontawesome-icons.mjs +3012 -0
  6. package/esm2020/constants/index.mjs +2 -0
  7. package/esm2020/impartner-design-components.mjs +5 -0
  8. package/esm2020/lib/alert/alert.component.mjs +57 -0
  9. package/esm2020/lib/alert/alert.module.mjs +18 -0
  10. package/esm2020/lib/alert/index.mjs +4 -0
  11. package/esm2020/lib/alert/theme/alert-theme.mjs +2 -0
  12. package/esm2020/lib/alert/theme/index.mjs +2 -0
  13. package/esm2020/lib/avatar/avatar.component.mjs +47 -0
  14. package/esm2020/lib/avatar/avatar.module.mjs +18 -0
  15. package/esm2020/lib/avatar/index.mjs +3 -0
  16. package/esm2020/lib/avatar-group/avatar-group.component.mjs +16 -0
  17. package/esm2020/lib/avatar-group/avatar-group.module.mjs +19 -0
  18. package/esm2020/lib/avatar-group/index.mjs +3 -0
  19. package/esm2020/lib/backdrop/backdrop.component.mjs +34 -0
  20. package/esm2020/lib/backdrop/backdrop.module.mjs +19 -0
  21. package/esm2020/lib/backdrop/index.mjs +3 -0
  22. package/esm2020/lib/badge/badge.component.mjs +98 -0
  23. package/esm2020/lib/badge/badge.module.mjs +19 -0
  24. package/esm2020/lib/badge/index.mjs +4 -0
  25. package/esm2020/lib/badge/types/badge-icon.mjs +2 -0
  26. package/esm2020/lib/badge/types/badge-size.mjs +7 -0
  27. package/esm2020/lib/badge/types/index.mjs +2 -0
  28. package/esm2020/lib/branding/branded.directive.mjs +19 -0
  29. package/esm2020/lib/branding/branding.module.mjs +19 -0
  30. package/esm2020/lib/branding/index.mjs +3 -0
  31. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +25 -0
  32. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +33 -0
  33. package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +19 -0
  34. package/esm2020/lib/breadcrumb/index.mjs +4 -0
  35. package/esm2020/lib/button/button.component.mjs +116 -0
  36. package/esm2020/lib/button/button.module.mjs +21 -0
  37. package/esm2020/lib/button/index.mjs +4 -0
  38. package/esm2020/lib/button/themes/button-theme.mjs +2 -0
  39. package/esm2020/lib/button/themes/index.mjs +2 -0
  40. package/esm2020/lib/button-group/button-group.component.mjs +52 -0
  41. package/esm2020/lib/button-group/button-group.module.mjs +20 -0
  42. package/esm2020/lib/button-group/index.mjs +3 -0
  43. package/esm2020/lib/card-heading/card-heading.component.mjs +30 -0
  44. package/esm2020/lib/card-heading/card-heading.module.mjs +19 -0
  45. package/esm2020/lib/card-heading/index.mjs +3 -0
  46. package/esm2020/lib/design-components.module.mjs +119 -0
  47. package/esm2020/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +22 -0
  48. package/esm2020/lib/dropdown/components/index.mjs +2 -0
  49. package/esm2020/lib/dropdown/dropdown.component.mjs +140 -0
  50. package/esm2020/lib/dropdown/dropdown.module.mjs +21 -0
  51. package/esm2020/lib/dropdown/index.mjs +5 -0
  52. package/esm2020/lib/dropdown/types/dropdown-position.mjs +2 -0
  53. package/esm2020/lib/dropdown/types/index.mjs +2 -0
  54. package/esm2020/lib/file-upload/directives/file-drop.directive.mjs +50 -0
  55. package/esm2020/lib/file-upload/directives/index.mjs +2 -0
  56. package/esm2020/lib/file-upload/file-upload.component.mjs +334 -0
  57. package/esm2020/lib/file-upload/file-upload.module.mjs +29 -0
  58. package/esm2020/lib/file-upload/index.mjs +5 -0
  59. package/esm2020/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +23 -0
  60. package/esm2020/lib/file-upload/pipes/index.mjs +2 -0
  61. package/esm2020/lib/form-field/controls/checkbox/checkbox.component.mjs +337 -0
  62. package/esm2020/lib/form-field/controls/checkbox/checkbox.module.mjs +19 -0
  63. package/esm2020/lib/form-field/controls/checkbox/index.mjs +3 -0
  64. package/esm2020/lib/form-field/controls/index.mjs +5 -0
  65. package/esm2020/lib/form-field/controls/input/index.mjs +2 -0
  66. package/esm2020/lib/form-field/controls/input/input.directive.mjs +233 -0
  67. package/esm2020/lib/form-field/controls/radio/index.mjs +6 -0
  68. package/esm2020/lib/form-field/controls/radio/injection-tokens.mjs +4 -0
  69. package/esm2020/lib/form-field/controls/radio/interfaces/index.mjs +4 -0
  70. package/esm2020/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +2 -0
  71. package/esm2020/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +11 -0
  72. package/esm2020/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +2 -0
  73. package/esm2020/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +260 -0
  74. package/esm2020/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +288 -0
  75. package/esm2020/lib/form-field/controls/radio/radio.module.mjs +20 -0
  76. package/esm2020/lib/form-field/controls/select/index.mjs +6 -0
  77. package/esm2020/lib/form-field/controls/select/option/index.mjs +2 -0
  78. package/esm2020/lib/form-field/controls/select/option/select-option.component.mjs +138 -0
  79. package/esm2020/lib/form-field/controls/select/option-parent.mjs +3 -0
  80. package/esm2020/lib/form-field/controls/select/select-model.mjs +149 -0
  81. package/esm2020/lib/form-field/controls/select/select.component.mjs +522 -0
  82. package/esm2020/lib/form-field/controls/select/select.module.mjs +20 -0
  83. package/esm2020/lib/form-field/controls/shared/index.mjs +2 -0
  84. package/esm2020/lib/form-field/controls/shared/toggle/components/index.mjs +2 -0
  85. package/esm2020/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +17 -0
  86. package/esm2020/lib/form-field/controls/shared/toggle/index.mjs +4 -0
  87. package/esm2020/lib/form-field/controls/shared/toggle/toggle.component.mjs +96 -0
  88. package/esm2020/lib/form-field/controls/shared/toggle/toggle.module.mjs +20 -0
  89. package/esm2020/lib/form-field/directives/corner-hint.directive.mjs +14 -0
  90. package/esm2020/lib/form-field/directives/error.directive.mjs +26 -0
  91. package/esm2020/lib/form-field/directives/form-root.directive.mjs +91 -0
  92. package/esm2020/lib/form-field/directives/hint.directive.mjs +24 -0
  93. package/esm2020/lib/form-field/directives/index.mjs +8 -0
  94. package/esm2020/lib/form-field/directives/label.directive.mjs +14 -0
  95. package/esm2020/lib/form-field/directives/prefix.directive.mjs +24 -0
  96. package/esm2020/lib/form-field/directives/suffix.directive.mjs +24 -0
  97. package/esm2020/lib/form-field/form-field-errors.mjs +5 -0
  98. package/esm2020/lib/form-field/form-field.component.mjs +132 -0
  99. package/esm2020/lib/form-field/impdc-forms.mjs +8 -0
  100. package/esm2020/lib/form-field/impdc-forms.module.mjs +68 -0
  101. package/esm2020/lib/form-field/index.mjs +2 -0
  102. package/esm2020/lib/form-field/services/error-state-matcher.service.mjs +28 -0
  103. package/esm2020/lib/form-field/services/index.mjs +3 -0
  104. package/esm2020/lib/form-field/services/unique-selection-dispatcher.service.mjs +48 -0
  105. package/esm2020/lib/form-field/shared/constructors.type.mjs +2 -0
  106. package/esm2020/lib/form-field/shared/disabled.mixin.mjs +15 -0
  107. package/esm2020/lib/form-field/shared/error-state.mixin.mjs +24 -0
  108. package/esm2020/lib/form-field/shared/form-field-control.mjs +10 -0
  109. package/esm2020/lib/form-field/shared/index.mjs +5 -0
  110. package/esm2020/lib/form-field/shared/tab-index.mixin.mjs +19 -0
  111. package/esm2020/lib/icon/icon.component.mjs +70 -0
  112. package/esm2020/lib/icon/icon.module.mjs +19 -0
  113. package/esm2020/lib/icon/index.mjs +3 -0
  114. package/esm2020/lib/index.mjs +26 -0
  115. package/esm2020/lib/modal/index.mjs +4 -0
  116. package/esm2020/lib/modal/modal.component.mjs +141 -0
  117. package/esm2020/lib/modal/modal.module.mjs +37 -0
  118. package/esm2020/lib/modal/types/index.mjs +3 -0
  119. package/esm2020/lib/modal/types/modal-component-sizes.mjs +9 -0
  120. package/esm2020/lib/modal/types/modal-theme.mjs +12 -0
  121. package/esm2020/lib/pagination/index.mjs +3 -0
  122. package/esm2020/lib/pagination/pagination.component.mjs +134 -0
  123. package/esm2020/lib/pagination/pagination.module.mjs +21 -0
  124. package/esm2020/lib/progress-bar/index.mjs +3 -0
  125. package/esm2020/lib/progress-bar/progress-bar.component.mjs +35 -0
  126. package/esm2020/lib/progress-bar/progress-bar.module.mjs +18 -0
  127. package/esm2020/lib/scrollable/index.mjs +3 -0
  128. package/esm2020/lib/scrollable/scrollable.component.mjs +193 -0
  129. package/esm2020/lib/scrollable/scrollable.module.mjs +21 -0
  130. package/esm2020/lib/select-icon/index.mjs +3 -0
  131. package/esm2020/lib/select-icon/select-icon.component.mjs +307 -0
  132. package/esm2020/lib/select-icon/select-icon.module.mjs +35 -0
  133. package/esm2020/lib/size-detection/directive/element-size.interface.mjs +2 -0
  134. package/esm2020/lib/size-detection/directive/index.mjs +3 -0
  135. package/esm2020/lib/size-detection/directive/size-detector.directive.mjs +43 -0
  136. package/esm2020/lib/size-detection/index.mjs +3 -0
  137. package/esm2020/lib/size-detection/size-detection.module.mjs +18 -0
  138. package/esm2020/lib/spinner/index.mjs +3 -0
  139. package/esm2020/lib/spinner/spinner.component.mjs +24 -0
  140. package/esm2020/lib/spinner/spinner.module.mjs +18 -0
  141. package/esm2020/lib/table/index.mjs +3 -0
  142. package/esm2020/lib/table/table.component.mjs +33 -0
  143. package/esm2020/lib/table/table.module.mjs +19 -0
  144. package/esm2020/lib/text-highlight/index.mjs +3 -0
  145. package/esm2020/lib/text-highlight/text-highlight.component.mjs +81 -0
  146. package/esm2020/lib/text-highlight/text-highlight.module.mjs +19 -0
  147. package/esm2020/public-api.mjs +9 -0
  148. package/esm2020/services/index.mjs +2 -0
  149. package/esm2020/services/interaction.service.mjs +54 -0
  150. package/esm2020/types/component-size.mjs +12 -0
  151. package/esm2020/types/component-theme.mjs +22 -0
  152. package/esm2020/types/index.mjs +3 -0
  153. package/esm2020/utilities/boolean-props.mjs +7 -0
  154. package/esm2020/utilities/dc.mjs +9 -0
  155. package/esm2020/utilities/index.mjs +6 -0
  156. package/esm2020/utilities/lc.mjs +9 -0
  157. package/esm2020/utilities/number-props.mjs +18 -0
  158. package/esm2020/utilities/sanitize.mjs +7 -0
  159. package/fesm2015/impartner-design-components.mjs +8295 -0
  160. package/fesm2015/impartner-design-components.mjs.map +1 -0
  161. package/fesm2020/impartner-design-components.mjs +8264 -0
  162. package/fesm2020/impartner-design-components.mjs.map +1 -0
  163. package/index.d.ts +5 -0
  164. package/lib/alert/alert.component.d.ts +29 -0
  165. package/lib/alert/alert.module.d.ts +8 -0
  166. package/lib/alert/index.d.ts +3 -0
  167. package/lib/alert/theme/alert-theme.d.ts +1 -0
  168. package/lib/alert/theme/index.d.ts +1 -0
  169. package/lib/avatar/avatar.component.d.ts +28 -0
  170. package/lib/avatar/avatar.module.d.ts +8 -0
  171. package/lib/avatar/index.d.ts +2 -0
  172. package/lib/avatar-group/avatar-group.component.d.ts +10 -0
  173. package/lib/avatar-group/avatar-group.module.d.ts +9 -0
  174. package/lib/avatar-group/index.d.ts +2 -0
  175. package/lib/backdrop/backdrop.component.d.ts +19 -0
  176. package/lib/backdrop/backdrop.module.d.ts +9 -0
  177. package/lib/backdrop/index.d.ts +2 -0
  178. package/lib/badge/badge.component.d.ts +48 -0
  179. package/lib/badge/badge.module.d.ts +9 -0
  180. package/lib/badge/index.d.ts +3 -0
  181. package/lib/badge/types/badge-icon.d.ts +1 -0
  182. package/lib/badge/types/badge-size.d.ts +6 -0
  183. package/lib/badge/types/index.d.ts +2 -0
  184. package/lib/branding/branded.directive.d.ts +6 -0
  185. package/lib/branding/branding.module.d.ts +9 -0
  186. package/lib/branding/index.d.ts +2 -0
  187. package/lib/breadcrumb/breadcrumb-item.component.d.ts +7 -0
  188. package/lib/breadcrumb/breadcrumb.component.d.ts +18 -0
  189. package/lib/breadcrumb/breadcrumb.module.d.ts +9 -0
  190. package/lib/breadcrumb/index.d.ts +3 -0
  191. package/lib/button/button.component.d.ts +47 -0
  192. package/lib/button/button.module.d.ts +11 -0
  193. package/lib/button/index.d.ts +3 -0
  194. package/lib/button/themes/button-theme.d.ts +1 -0
  195. package/lib/button/themes/index.d.ts +1 -0
  196. package/lib/button-group/button-group.component.d.ts +22 -0
  197. package/lib/button-group/button-group.module.d.ts +10 -0
  198. package/lib/button-group/index.d.ts +2 -0
  199. package/lib/card-heading/card-heading.component.d.ts +18 -0
  200. package/lib/card-heading/card-heading.module.d.ts +9 -0
  201. package/lib/card-heading/index.d.ts +2 -0
  202. package/lib/design-components.module.d.ts +22 -0
  203. package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +11 -0
  204. package/lib/dropdown/components/index.d.ts +1 -0
  205. package/lib/dropdown/dropdown.component.d.ts +65 -0
  206. package/lib/dropdown/dropdown.module.d.ts +11 -0
  207. package/lib/dropdown/index.d.ts +4 -0
  208. package/lib/dropdown/types/dropdown-position.d.ts +1 -0
  209. package/lib/dropdown/types/index.d.ts +1 -0
  210. package/lib/file-upload/directives/file-drop.directive.d.ts +11 -0
  211. package/lib/file-upload/directives/index.d.ts +1 -0
  212. package/lib/file-upload/file-upload.component.d.ts +105 -0
  213. package/lib/file-upload/file-upload.module.d.ts +13 -0
  214. package/lib/file-upload/index.d.ts +4 -0
  215. package/lib/file-upload/pipes/human-readable-byte-size.pipe.d.ts +7 -0
  216. package/lib/file-upload/pipes/index.d.ts +1 -0
  217. package/lib/form-field/controls/checkbox/checkbox.component.d.ts +133 -0
  218. package/lib/form-field/controls/checkbox/checkbox.module.d.ts +9 -0
  219. package/lib/form-field/controls/checkbox/index.d.ts +2 -0
  220. package/lib/form-field/controls/index.d.ts +4 -0
  221. package/lib/form-field/controls/input/index.d.ts +1 -0
  222. package/lib/form-field/controls/input/input.directive.d.ts +84 -0
  223. package/lib/form-field/controls/radio/index.d.ts +5 -0
  224. package/lib/form-field/controls/radio/injection-tokens.d.ts +4 -0
  225. package/lib/form-field/controls/radio/interfaces/index.d.ts +3 -0
  226. package/lib/form-field/controls/radio/interfaces/radio-button.interface.d.ts +6 -0
  227. package/lib/form-field/controls/radio/interfaces/radio-change-event.interface.d.ts +12 -0
  228. package/lib/form-field/controls/radio/interfaces/radio-group.interface.d.ts +13 -0
  229. package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +98 -0
  230. package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +104 -0
  231. package/lib/form-field/controls/radio/radio.module.d.ts +10 -0
  232. package/lib/form-field/controls/select/index.d.ts +5 -0
  233. package/lib/form-field/controls/select/option/index.d.ts +1 -0
  234. package/lib/form-field/controls/select/option/select-option.component.d.ts +60 -0
  235. package/lib/form-field/controls/select/option-parent.d.ts +5 -0
  236. package/lib/form-field/controls/select/select-model.d.ts +36 -0
  237. package/lib/form-field/controls/select/select.component.d.ts +170 -0
  238. package/lib/form-field/controls/select/select.module.d.ts +10 -0
  239. package/lib/form-field/controls/shared/index.d.ts +1 -0
  240. package/lib/form-field/controls/shared/toggle/components/index.d.ts +1 -0
  241. package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +6 -0
  242. package/lib/form-field/controls/shared/toggle/index.d.ts +3 -0
  243. package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +26 -0
  244. package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +10 -0
  245. package/lib/form-field/directives/corner-hint.directive.d.ts +5 -0
  246. package/lib/form-field/directives/error.directive.d.ts +8 -0
  247. package/lib/form-field/directives/form-root.directive.d.ts +26 -0
  248. package/lib/form-field/directives/hint.directive.d.ts +6 -0
  249. package/lib/form-field/directives/index.d.ts +7 -0
  250. package/lib/form-field/directives/label.directive.d.ts +5 -0
  251. package/lib/form-field/directives/prefix.directive.d.ts +9 -0
  252. package/lib/form-field/directives/suffix.directive.d.ts +9 -0
  253. package/lib/form-field/form-field-errors.d.ts +2 -0
  254. package/lib/form-field/form-field.component.d.ts +39 -0
  255. package/lib/form-field/impdc-forms.d.ts +7 -0
  256. package/lib/form-field/impdc-forms.module.d.ts +19 -0
  257. package/lib/form-field/index.d.ts +1 -0
  258. package/lib/form-field/services/error-state-matcher.service.d.ts +12 -0
  259. package/lib/form-field/services/index.d.ts +2 -0
  260. package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +29 -0
  261. package/lib/form-field/shared/constructors.type.d.ts +7 -0
  262. package/lib/form-field/shared/disabled.mixin.d.ts +10 -0
  263. package/lib/form-field/shared/error-state.mixin.d.ts +31 -0
  264. package/lib/form-field/shared/form-field-control.d.ts +24 -0
  265. package/lib/form-field/shared/index.d.ts +5 -0
  266. package/lib/form-field/shared/tab-index.mixin.d.ts +13 -0
  267. package/lib/icon/icon.component.d.ts +30 -0
  268. package/lib/icon/icon.module.d.ts +9 -0
  269. package/lib/icon/index.d.ts +2 -0
  270. package/lib/index.d.ts +25 -0
  271. package/lib/modal/index.d.ts +3 -0
  272. package/lib/modal/modal.component.d.ts +80 -0
  273. package/lib/modal/modal.module.d.ts +13 -0
  274. package/lib/modal/types/index.d.ts +2 -0
  275. package/lib/modal/types/modal-component-sizes.d.ts +3 -0
  276. package/lib/modal/types/modal-theme.d.ts +7 -0
  277. package/lib/pagination/index.d.ts +2 -0
  278. package/lib/pagination/pagination.component.d.ts +41 -0
  279. package/lib/pagination/pagination.module.d.ts +11 -0
  280. package/lib/progress-bar/index.d.ts +2 -0
  281. package/lib/progress-bar/progress-bar.component.d.ts +22 -0
  282. package/lib/progress-bar/progress-bar.module.d.ts +8 -0
  283. package/lib/scrollable/index.d.ts +2 -0
  284. package/lib/scrollable/scrollable.component.d.ts +39 -0
  285. package/lib/scrollable/scrollable.module.d.ts +11 -0
  286. package/lib/select-icon/index.d.ts +2 -0
  287. package/lib/select-icon/select-icon.component.d.ts +123 -0
  288. package/lib/select-icon/select-icon.module.d.ts +11 -0
  289. package/lib/size-detection/directive/element-size.interface.d.ts +4 -0
  290. package/lib/size-detection/directive/index.d.ts +2 -0
  291. package/lib/size-detection/directive/size-detector.directive.d.ts +14 -0
  292. package/lib/size-detection/index.d.ts +3 -0
  293. package/lib/size-detection/size-detection.module.d.ts +8 -0
  294. package/lib/spinner/index.d.ts +2 -0
  295. package/lib/spinner/spinner.component.d.ts +13 -0
  296. package/lib/spinner/spinner.module.d.ts +8 -0
  297. package/lib/table/index.d.ts +2 -0
  298. package/lib/table/table.component.d.ts +15 -0
  299. package/lib/table/table.module.d.ts +9 -0
  300. package/lib/text-highlight/index.d.ts +2 -0
  301. package/lib/text-highlight/text-highlight.component.d.ts +31 -0
  302. package/lib/text-highlight/text-highlight.module.d.ts +9 -0
  303. package/package.json +51 -0
  304. package/public-api.d.ts +4 -0
  305. package/services/index.d.ts +1 -0
  306. package/services/interaction.service.d.ts +14 -0
  307. package/types/component-size.d.ts +12 -0
  308. package/types/component-theme.d.ts +12 -0
  309. package/types/index.d.ts +2 -0
  310. package/utilities/boolean-props.d.ts +8 -0
  311. package/utilities/dc.d.ts +6 -0
  312. package/utilities/index.d.ts +5 -0
  313. package/utilities/lc.d.ts +6 -0
  314. package/utilities/number-props.d.ts +15 -0
  315. package/utilities/sanitize.d.ts +1 -0
@@ -0,0 +1,193 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../size-detection/directive/size-detector.directive";
5
+ /**
6
+ * The `ScrollableComponent` (`<impdc-scrollable` or `<div impdc-scrollable`) is a container that hides items that wouldn't fit
7
+ * with arrows on the left and right to slide between them.
8
+ * To use, import `ScrollableModule` or another module that imports and exports that module from `@impartner/design-components`.
9
+ * `ScrollableModule` also imports and exports [BrandingModule](./?path=/docs/design-components-directives-impdcbranded).
10
+ */
11
+ export class ScrollableComponent {
12
+ constructor(_cd) {
13
+ this._cd = _cd;
14
+ /**
15
+ * The base amount to scroll.
16
+ */
17
+ this.scrollUnit = 20;
18
+ /**
19
+ * Used in combination with `scrollUnit` to determine how far the Scrollable scrolls when directional arrows are clicked.
20
+ */
21
+ this.clickScrollMultiplier = 5;
22
+ this._scrollableBgColor = null;
23
+ this._width = 0;
24
+ }
25
+ get canScrollLeft() {
26
+ if (!this._contentElement) {
27
+ return false;
28
+ }
29
+ return Math.floor(this._contentElement.scrollLeft) > 0;
30
+ }
31
+ get canScrollRight() {
32
+ if (!this._contentElement) {
33
+ return false;
34
+ }
35
+ return (Math.ceil(this._contentElement.scrollLeft + this._width) <
36
+ this._contentElement.scrollWidth);
37
+ }
38
+ get _containerElement() {
39
+ if (!this.containerRef) {
40
+ return null;
41
+ }
42
+ return this.containerRef.nativeElement;
43
+ }
44
+ get _contentElement() {
45
+ if (!this.contentRef) {
46
+ return null;
47
+ }
48
+ return this.contentRef.nativeElement;
49
+ }
50
+ ngOnChanges(changes) {
51
+ if (changes['scrollUnit'] || changes['clickScrollMultiplier']) {
52
+ if (this._containerElement) {
53
+ this._width = this._containerElement?.clientWidth;
54
+ this._cd.detectChanges();
55
+ }
56
+ }
57
+ this._getBackgroundColorForButtons();
58
+ }
59
+ ngAfterViewInit() {
60
+ this._width = this.contentRef?.nativeElement.width;
61
+ this._getBackgroundColorForButtons();
62
+ this._cd.detectChanges();
63
+ }
64
+ async scroll(direction) {
65
+ if (!this._contentElement) {
66
+ return;
67
+ }
68
+ let pixels = direction * this.scrollUnit * this.clickScrollMultiplier;
69
+ let position = 0;
70
+ if (!pixels) {
71
+ if (direction === 1) {
72
+ position = this._contentElement.scrollWidth;
73
+ }
74
+ }
75
+ else {
76
+ position = this._contentElement.scrollLeft + pixels;
77
+ }
78
+ await this._scrollToPosition(this._contentElement, position);
79
+ this._cd.detectChanges();
80
+ }
81
+ widthChanged(elementSize) {
82
+ if (!elementSize || !elementSize.width) {
83
+ return;
84
+ }
85
+ this._width = elementSize.width;
86
+ this._cd.detectChanges();
87
+ }
88
+ async _scrollToPosition(container, position) {
89
+ position = Math.round(position);
90
+ if (container.scrollLeft === position) {
91
+ return;
92
+ }
93
+ let resolveFn;
94
+ let scrollListener;
95
+ let timeoutId;
96
+ const promise = new Promise(resolve => {
97
+ resolveFn = resolve;
98
+ });
99
+ const finished = () => {
100
+ container.removeEventListener('scroll', scrollListener);
101
+ resolveFn(null);
102
+ };
103
+ scrollListener = () => {
104
+ clearTimeout(timeoutId);
105
+ // scroll is finished when either the position has been reached, or 100ms have elapsed since the last scroll event
106
+ if (container.scrollLeft === position) {
107
+ finished();
108
+ }
109
+ else {
110
+ timeoutId = setTimeout(finished, 100);
111
+ }
112
+ };
113
+ container.addEventListener('scroll', scrollListener);
114
+ container.scrollTo({
115
+ left: position,
116
+ behavior: 'smooth'
117
+ });
118
+ return promise;
119
+ }
120
+ _getBackgroundColorForButtons() {
121
+ if (!this.contentRef) {
122
+ return;
123
+ }
124
+ const projectedElementCollection = this.contentRef.nativeElement.children;
125
+ if (!projectedElementCollection || !projectedElementCollection.length) {
126
+ return;
127
+ }
128
+ const firstElement = projectedElementCollection[0];
129
+ let backgroundColor = this._getBackGroundColor(firstElement);
130
+ if (!backgroundColor) {
131
+ backgroundColor = this._getAncestorBackgroundColor();
132
+ }
133
+ this._scrollableBgColor = backgroundColor;
134
+ }
135
+ _getAncestorBackgroundColor() {
136
+ if (!this.contentRef) {
137
+ return null;
138
+ }
139
+ let result = {
140
+ parent: this.contentRef.nativeElement.parentElement,
141
+ backgroundColor: null
142
+ };
143
+ let count = 6;
144
+ function getParentBackgroundColor(currentContext, getBackgroundColor) {
145
+ const result = { parent: null, backgroundColor: null };
146
+ if (currentContext && currentContext.parent) {
147
+ result.backgroundColor = getBackgroundColor(currentContext.parent);
148
+ if (!result.backgroundColor) {
149
+ result.parent = currentContext.parent.parentElement;
150
+ }
151
+ }
152
+ return result;
153
+ }
154
+ while (count > 0) {
155
+ if (result.backgroundColor) {
156
+ break;
157
+ }
158
+ result = getParentBackgroundColor(result, this._getBackGroundColor);
159
+ if (!result.parent) {
160
+ break;
161
+ }
162
+ count = count - 1;
163
+ }
164
+ return result.backgroundColor;
165
+ }
166
+ _getBackGroundColor(element) {
167
+ const computedBackgroundColor = getComputedStyle(element)['backgroundColor'];
168
+ if (computedBackgroundColor !== 'rgba(0, 0, 0, 0)') {
169
+ return computedBackgroundColor;
170
+ }
171
+ return element.style.backgroundColor;
172
+ }
173
+ }
174
+ ScrollableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
175
+ ScrollableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ScrollableComponent, selector: "impdc-scrollable, div[impdc-scrollable]", inputs: { scrollUnit: "scrollUnit", clickScrollMultiplier: "clickScrollMultiplier" }, host: { properties: { "style.--impdc-scrollable-bg": "this._scrollableBgColor" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }, { propertyName: "contentRef", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.SizeDetectorDirective, selector: "[impdcSizeDetector]", outputs: ["resized"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, decorators: [{
177
+ type: Component,
178
+ args: [{ selector: 'impdc-scrollable, div[impdc-scrollable]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"] }]
179
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { scrollUnit: [{
180
+ type: Input
181
+ }], clickScrollMultiplier: [{
182
+ type: Input
183
+ }], _scrollableBgColor: [{
184
+ type: HostBinding,
185
+ args: ['style.--impdc-scrollable-bg']
186
+ }], containerRef: [{
187
+ type: ViewChild,
188
+ args: ['container', { static: false }]
189
+ }], contentRef: [{
190
+ type: ViewChild,
191
+ args: ['content', { static: false }]
192
+ }] } });
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxXQUFXLEVBQ1gsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUd2Qjs7Ozs7R0FLRztBQU9ILE1BQU0sT0FBTyxtQkFBbUI7SUEyRDlCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBMUQxQzs7V0FFRztRQUVJLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFFL0I7O1dBRUc7UUFFSSwwQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFHekIsdUJBQWtCLEdBQWtCLElBQUksQ0FBQztRQXFCekMsV0FBTSxHQUFXLENBQUMsQ0FBQztJQXdCa0IsQ0FBQztJQTNDOUMsSUFBVyxhQUFhO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxDQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcs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QyxpQkFBaUIsQ0FBQyxDQUFDO1FBRS9DLElBQUksdUJBQXVCLEtBQUssa0JBQWtCLEVBQUU7WUFDbEQsT0FBTyx1QkFBdUIsQ0FBQztTQUNoQztRQUVELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDdkMsQ0FBQzs7aUhBbE9VLG1CQUFtQjtxR0FBbkIsbUJBQW1CLGlkQzFCaEMsbWZBZUE7NEZEV2EsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLHlDQUF5QyxtQkFHbEMsdUJBQXVCLENBQUMsTUFBTTt3R0FPeEMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxxQkFBcUI7c0JBRDNCLEtBQUs7Z0JBSUUsa0JBQWtCO3NCQUR6QixXQUFXO3VCQUFDLDZCQUE2QjtnQkF5Qm5DLFlBQVk7c0JBRGxCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFZbEMsVUFBVTtzQkFEaEIsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJRWxlbWVudFNpemUgfSBmcm9tICcuLi9zaXplLWRldGVjdGlvbic7XG5cbi8qKlxuICogVGhlIGBTY3JvbGxhYmxlQ29tcG9uZW50YCAoYDxpbXBkYy1zY3JvbGxhYmxlYCBvciBgPGRpdiBpbXBkYy1zY3JvbGxhYmxlYCkgaXMgYSBjb250YWluZXIgdGhhdCBoaWRlcyBpdGVtcyB0aGF0IHdvdWxkbid0IGZpdFxuICogd2l0aCBhcnJvd3Mgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHRvIHNsaWRlIGJldHdlZW4gdGhlbS5cbiAqIFRvIHVzZSwgaW1wb3J0IGBTY3JvbGxhYmxlTW9kdWxlYCBvciBhbm90aGVyIG1vZHVsZSB0aGF0IGltcG9ydHMgYW5kIGV4cG9ydHMgdGhhdCBtb2R1bGUgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKiBgU2Nyb2xsYWJsZU1vZHVsZWAgYWxzbyBpbXBvcnRzIGFuZCBleHBvcnRzIFtCcmFuZGluZ01vZHVsZV0oLi8/cGF0aD0vZG9jcy9kZXNpZ24tY29tcG9uZW50cy1kaXJlY3RpdmVzLWltcGRjYnJhbmRlZCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXNjcm9sbGFibGUsIGRpdltpbXBkYy1zY3JvbGxhYmxlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGFtb3VudCB0byBzY3JvbGwuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2Nyb2xsVW5pdDogbnVtYmVyID0gMjA7XG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgc2Nyb2xsVW5pdGAgdG8gZGV0ZXJtaW5lIGhvdyBmYXIgdGhlIFNjcm9sbGFibGUgc2Nyb2xscyB3aGVuIGRpcmVjdGlvbmFsIGFycm93cyBhcmUgY2xpY2tlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjbGlja1Njcm9sbE11bHRpcGxpZXIgPSA1O1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS1pbXBkYy1zY3JvbGxhYmxlLWJnJylcbiAgcHJpdmF0ZSBfc2Nyb2xsYWJsZUJnQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBnZXQgY2FuU2Nyb2xsTGVmdCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5fY29udGVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBjYW5TY3JvbGxSaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLl9jb250ZW50RWxlbWVudC5zY3JvbGxMZWZ0ICsgdGhpcy5fd2lkdGgpIDxcbiAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3dpZHRoOiBudW1iZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgY29udGFpbmVyUmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZ2V0IF9jb250YWluZXJFbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lclJlZikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBAVmlld0NoaWxkKCdjb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyBjb250ZW50UmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZ2V0IF9jb250ZW50RWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb250ZW50UmVmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2Nyb2xsVW5pdCddIHx8IGNoYW5nZXNbJ2NsaWNrU2Nyb2xsTXVsdGlwbGllciddKSB7XG4gICAgICBpZiAodGhpcy5fY29udGFpbmVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQ/LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2dldEJhY2tncm91bmRDb2xvckZvckJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmNvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQud2lkdGg7XG4gICAgdGhpcy5fZ2V0QmFja2dyb3VuZENvbG9yRm9yQnV0dG9ucygpO1xuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzY3JvbGwoZGlyZWN0aW9uOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBpeGVscyA9IGRpcmVjdGlvbiAqIHRoaXMuc2Nyb2xsVW5pdCAqIHRoaXMuY2xpY2tTY3JvbGxNdWx0aXBsaWVyO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICBpZiAoIXBpeGVscykge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbExlZnQgKyBwaXhlbHM7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fc2Nyb2xsVG9Qb3NpdGlvbih0aGlzLl9jb250ZW50RWxlbWVudCwgcG9zaXRpb24pO1xuXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHdpZHRoQ2hhbmdlZChlbGVtZW50U2l6ZTogSUVsZW1lbnRTaXplKTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50U2l6ZSB8fCAhZWxlbWVudFNpemUud2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fd2lkdGggPSBlbGVtZW50U2l6ZS53aWR0aDtcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9zY3JvbGxUb1Bvc2l0aW9uKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBwb3NpdGlvbiA9IE1hdGgucm91bmQocG9zaXRpb24pO1xuXG4gICAgaWYgKGNvbnRhaW5lci5zY3JvbGxMZWZ0ID09PSBwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlRm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcbiAgICBsZXQgc2Nyb2xsTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gICAgbGV0IHRpbWVvdXRJZDogYW55O1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgcmVzb2x2ZUZuID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIHJlc29sdmVGbihudWxsKTtcbiAgICB9O1xuXG4gICAgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgLy8gc2Nyb2xsIGlzIGZpbmlzaGVkIHdoZW4gZWl0aGVyIHRoZSBwb3NpdGlvbiBoYXMgYmVlbiByZWFjaGVkLCBvciAxMDBtcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3Qgc2Nyb2xsIGV2ZW50XG4gICAgICBpZiAoY29udGFpbmVyLnNjcm9sbExlZnQgPT09IHBvc2l0aW9uKSB7XG4gICAgICAgIGZpbmlzaGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZpbmlzaGVkLCAxMDApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIpO1xuXG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHtcbiAgICAgIGxlZnQ6IHBvc2l0aW9uLFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJhY2tncm91bmRDb2xvckZvckJ1dHRvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvbjogSFRNTENvbGxlY3Rpb24gPVxuICAgICAgdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG5cbiAgICBpZiAoIXByb2plY3RlZEVsZW1lbnRDb2xsZWN0aW9uIHx8ICFwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvblswXSBhcyBIVE1MRWxlbWVudDtcbiAgICBsZXQgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsID0gdGhpcy5fZ2V0QmFja0dyb3VuZENvbG9yKGZpcnN0RWxlbWVudCk7XG5cbiAgICBpZiAoIWJhY2tncm91bmRDb2xvcikge1xuICAgICAgYmFja2dyb3VuZENvbG9yID0gdGhpcy5fZ2V0QW5jZXN0b3JCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zY3JvbGxhYmxlQmdDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEFuY2VzdG9yQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb250ZW50UmVmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0eXBlIHBhcmVudEJnUmVzdWx0ID0ge1xuICAgICAgcGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyB8IG51bGw7XG4gICAgfTtcblxuICAgIGxldCByZXN1bHQ6IHBhcmVudEJnUmVzdWx0ID0ge1xuICAgICAgcGFyZW50OiAodGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG51bGxcbiAgICB9O1xuXG4gICAgbGV0IGNvdW50ID0gNjtcblxuICAgIGZ1bmN0aW9uIGdldFBhcmVudEJhY2tncm91bmRDb2xvcihcbiAgICAgIGN1cnJlbnRDb250ZXh0OiBwYXJlbnRCZ1Jlc3VsdCxcbiAgICAgIGdldEJhY2tncm91bmRDb2xvcjogKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBzdHJpbmcgfCBudWxsXG4gICAgKTogcGFyZW50QmdSZXN1bHQge1xuICAgICAgY29uc3QgcmVzdWx0OiBwYXJlbnRCZ1Jlc3VsdCA9IHsgcGFyZW50OiBudWxsLCBiYWNrZ3JvdW5kQ29sb3I6IG51bGwgfTtcbiAgICAgIGlmIChjdXJyZW50Q29udGV4dCAmJiBjdXJyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgcmVzdWx0LmJhY2tncm91bmRDb2xvciA9IGdldEJhY2tncm91bmRDb2xvcihjdXJyZW50Q29udGV4dC5wYXJlbnQpO1xuXG4gICAgICAgIGlmICghcmVzdWx0LmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBjdXJyZW50Q29udGV4dC5wYXJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHdoaWxlIChjb3VudCA+IDApIHtcbiAgICAgIGlmIChyZXN1bHQuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZ2V0UGFyZW50QmFja2dyb3VuZENvbG9yKHJlc3VsdCwgdGhpcy5fZ2V0QmFja0dyb3VuZENvbG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY291bnQgPSBjb3VudCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCYWNrR3JvdW5kQ29sb3IoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb21wdXRlZEJhY2tncm91bmRDb2xvciA9XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpWydiYWNrZ3JvdW5kQ29sb3InXTtcblxuICAgIGlmIChjb21wdXRlZEJhY2tncm91bmRDb2xvciAhPT0gJ3JnYmEoMCwgMCwgMCwgMCknKSB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRCYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiaW1wZGMtc2Nyb2xsYWJsZVwiXG4gICNjb250YWluZXJcbiAgaW1wZGNTaXplRGV0ZWN0b3JcbiAgKHJlc2l6ZWQpPVwid2lkdGhDaGFuZ2VkKCRldmVudClcIj5cbiAgPGEgY2xhc3M9XCJpbXBkYy1zY3JvbGxhYmxlLWxlZnRcIiAoY2xpY2spPVwic2Nyb2xsKC0xKVwiICpuZ0lmPVwiY2FuU2Nyb2xsTGVmdFwiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCBkZWZhdWx0XCI+PC9pPlxuICA8L2E+XG4gIDxkaXYgI2NvbnRlbnQgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxhIGNsYXNzPVwiaW1wZGMtc2Nyb2xsYWJsZS1yaWdodFwiIChjbGljayk9XCJzY3JvbGwoMSlcIiAqbmdJZj1cImNhblNjcm9sbFJpZ2h0XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBkZWZhdWx0XCI+PC9pPlxuICA8L2E+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { BrandingModule } from '../branding';
4
+ import { SizeDetectionModule } from '../size-detection';
5
+ import { ScrollableComponent } from './scrollable.component';
6
+ import * as i0 from "@angular/core";
7
+ export class ScrollableModule {
8
+ constructor() { }
9
+ }
10
+ ScrollableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ ScrollableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, declarations: [ScrollableComponent], imports: [CommonModule, SizeDetectionModule, BrandingModule], exports: [ScrollableComponent, BrandingModule] });
12
+ ScrollableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, imports: [CommonModule, SizeDetectionModule, BrandingModule, BrandingModule] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [CommonModule, SizeDetectionModule, BrandingModule],
17
+ declarations: [ScrollableComponent],
18
+ exports: [ScrollableComponent, BrandingModule]
19
+ }]
20
+ }], ctorParameters: function () { return []; } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixnQkFBZSxDQUFDOzs4R0FETCxnQkFBZ0I7K0dBQWhCLGdCQUFnQixpQkFIWixtQkFBbUIsYUFEeEIsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsYUFFakQsbUJBQW1CLEVBQUUsY0FBYzsrR0FFbEMsZ0JBQWdCLFlBSmpCLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBRTVCLGNBQWM7NEZBRWxDLGdCQUFnQjtrQkFMNUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO29CQUM1RCxZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnJhbmRpbmdNb2R1bGUgfSBmcm9tICcuLi9icmFuZGluZyc7XG5pbXBvcnQgeyBTaXplRGV0ZWN0aW9uTW9kdWxlIH0gZnJvbSAnLi4vc2l6ZS1kZXRlY3Rpb24nO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTaXplRGV0ZWN0aW9uTW9kdWxlLCBCcmFuZGluZ01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1Njcm9sbGFibGVDb21wb25lbnRdLFxuICBleHBvcnRzOiBbU2Nyb2xsYWJsZUNvbXBvbmVudCwgQnJhbmRpbmdNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGFibGVNb2R1bGUge1xuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './select-icon.component';
2
+ export * from './select-icon.module';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1pY29uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2VsZWN0LWljb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VsZWN0LWljb24ubW9kdWxlJztcbiJdfQ==
@@ -0,0 +1,307 @@
1
+ /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Inject, Input, Optional, Output, Self, ViewChild } from '@angular/core';
3
+ import { FormControl, Validators } from '@angular/forms';
4
+ import { nanoid } from 'nanoid';
5
+ import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, map, startWith, Subject } from 'rxjs';
6
+ import { FontAwesomeIcons } from '../../constants';
7
+ import { coerceBooleanPropertyValue } from '../../utilities';
8
+ import { ImpdcFormFieldControl, IMPDC_FORM_ROOT, mixinDisabled, mixinErrorState, mixinTabIndex } from '../form-field';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../form-field";
11
+ import * as i2 from "@angular/forms";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@ng-bootstrap/ng-bootstrap";
14
+ import * as i5 from "../form-field/form-field.component";
15
+ import * as i6 from "../form-field/controls/input/input.directive";
16
+ import * as i7 from "../form-field/directives/prefix.directive";
17
+ export class ImpdcSelectIconChange {
18
+ constructor(source, value) {
19
+ this.source = source;
20
+ this.value = value;
21
+ }
22
+ }
23
+ const _SelectIconComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
24
+ constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
25
+ this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
26
+ this._formRoot = _formRoot;
27
+ this._parentForm = _parentForm;
28
+ this._parentFormGroup = _parentFormGroup;
29
+ this.ngControl = ngControl;
30
+ this.stateChanges = new Subject();
31
+ }
32
+ })));
33
+ /**
34
+ * The `SelectIconComponent` (`<impdc-select-icon`) is a select dropdown with search that shows all standard icons from Bootstrap 5.
35
+ * To use, import `SelectIconModule` or another module that imports and exports that module from `@impartner/design-components`.
36
+ */
37
+ export class SelectIconComponent extends _SelectIconComponentBase {
38
+ constructor(_changeDetector, _defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
39
+ super(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl);
40
+ this._changeDetector = _changeDetector;
41
+ this.searchControl = new FormControl('');
42
+ this._uid = `impdc-select-icon-${nanoid()}`;
43
+ this._dropdownOpen = false;
44
+ this._iconOptionsSubject = new BehaviorSubject(FontAwesomeIcons);
45
+ this._cvaOnChange = () => { };
46
+ this._cvaOnTouched = () => { };
47
+ this._placeholder = '- Select -';
48
+ /** Events fire when selection has been changed by the user. */
49
+ this.selectionChange = new EventEmitter();
50
+ /**
51
+ * Events fire when raw value of select changes. Mainly exists to handle
52
+ * two-way binding of `value` input property.
53
+ * @ignore
54
+ */
55
+ this.valueChange = new EventEmitter();
56
+ this._value = null;
57
+ this._focused = false;
58
+ this.controlType = 'impdc-select-icon';
59
+ this.supportsAffixes = true;
60
+ this.allowSearch = false;
61
+ this.showText = true;
62
+ this.showSelectedText = true;
63
+ const debouncedSearchValues = this.searchControl.valueChanges.pipe(startWith(''), debounceTime(200), distinctUntilChanged());
64
+ this.filteredOptions$ = combineLatest([
65
+ debouncedSearchValues,
66
+ this._iconOptionsSubject.asObservable()
67
+ ]).pipe(map(([searchTerm, iconOptions]) => {
68
+ if (!searchTerm) {
69
+ return [...iconOptions];
70
+ }
71
+ const searchTermLowerCase = searchTerm.toLowerCase();
72
+ return iconOptions.filter(option => option.toLowerCase().indexOf(searchTermLowerCase) > -1);
73
+ }));
74
+ if (this.ngControl) {
75
+ this.ngControl.valueAccessor = this;
76
+ }
77
+ this.id = this.id;
78
+ }
79
+ get iconOptions() {
80
+ return [...this._iconOptionsSubject.value];
81
+ }
82
+ /**
83
+ * Set to override the default set of FontAwesome icon options.
84
+ */
85
+ set iconOptions(iconOptions) {
86
+ if (iconOptions) {
87
+ this._iconOptionsSubject.next([...iconOptions]);
88
+ }
89
+ }
90
+ /**
91
+ * The placeholder text that will be displayed when no selection has been made.
92
+ *
93
+ * @default \- Select -
94
+ */
95
+ get placeholder() {
96
+ return this._placeholder;
97
+ }
98
+ set placeholder(value) {
99
+ this._placeholder = value;
100
+ this.stateChanges.next();
101
+ }
102
+ get empty() {
103
+ return !this.value;
104
+ }
105
+ /** @ignore */
106
+ focus(options) {
107
+ this._toggleButtonRef.nativeElement.focus(options);
108
+ }
109
+ /* Lifecycle Hooks */
110
+ /** @ignore */
111
+ ngDoCheck() {
112
+ const ngControl = this.ngControl;
113
+ if (!ngControl) {
114
+ return;
115
+ }
116
+ if (this._previousControl !== ngControl.control) {
117
+ if (this._previousControl !== undefined &&
118
+ ngControl.disabled !== null &&
119
+ ngControl.disabled !== this.disabled) {
120
+ this.disabled = ngControl?.disabled;
121
+ }
122
+ this._previousControl = ngControl.control;
123
+ }
124
+ this.updateErrorState();
125
+ }
126
+ /** @ignore */
127
+ ngOnChanges(changes) {
128
+ // Managing disabled state is handled via the `mixinDisabled` mixin/generator, but we still need to signal
129
+ // to the parent form field so it can run change detection when disabled state is changed.
130
+ if (changes['disabled']) {
131
+ this.stateChanges.next();
132
+ }
133
+ }
134
+ /** @ignore */
135
+ ngOnDestroy() {
136
+ this.stateChanges.complete();
137
+ }
138
+ /* ControlValueAccessor */
139
+ /** @ignore */
140
+ writeValue(value) {
141
+ this.value = value;
142
+ this._changeDetector.markForCheck();
143
+ }
144
+ /** @ignore */
145
+ registerOnChange(fn) {
146
+ this._cvaOnChange = fn;
147
+ }
148
+ /** @ignore */
149
+ registerOnTouched(fn) {
150
+ this._cvaOnTouched = fn;
151
+ }
152
+ /** @ignore */
153
+ setDisabledState(isDisabled) {
154
+ this.disabled = isDisabled;
155
+ this._changeDetector.markForCheck();
156
+ }
157
+ /* ImpdcFormFieldControl */
158
+ get value() {
159
+ return this._value;
160
+ }
161
+ set value(value) {
162
+ const newValue = (value && this.iconOptions.find(opt => opt === value)) || null;
163
+ if (newValue !== this._value) {
164
+ this._value = newValue;
165
+ this.stateChanges.next();
166
+ }
167
+ }
168
+ get id() {
169
+ return this._id;
170
+ }
171
+ set id(value) {
172
+ this._id = value || this._uid;
173
+ this.stateChanges.next();
174
+ }
175
+ /**
176
+ * Used to set requiredness of control in a template-based manner;
177
+ * not necessary when using the Angular reactive forms API and `required` validator.
178
+ *
179
+ * @default false
180
+ */
181
+ get required() {
182
+ return (this._required ??
183
+ this.ngControl?.control?.hasValidator(Validators.required) ??
184
+ false);
185
+ }
186
+ set required(value) {
187
+ this._required = coerceBooleanPropertyValue(value);
188
+ this.stateChanges.next();
189
+ }
190
+ get focused() {
191
+ return this._focused || this._dropdownOpen;
192
+ }
193
+ /* Internals */
194
+ handleOpenChange(isOpen) {
195
+ this._dropdownOpen = isOpen;
196
+ this.searchControl.reset();
197
+ if (isOpen) {
198
+ this._onFocus();
199
+ }
200
+ else {
201
+ this._onBlur();
202
+ }
203
+ this.stateChanges.next();
204
+ }
205
+ selectIcon(iconName) {
206
+ if (iconName !== this.value) {
207
+ this.value = iconName;
208
+ this.valueChange.emit(this.value);
209
+ this._cvaOnChange(this.value);
210
+ this.selectionChange.emit(this._buildChangeEvent(this.value));
211
+ this._changeDetector.markForCheck();
212
+ }
213
+ if (this._dropdownOpen) {
214
+ this.focus();
215
+ }
216
+ }
217
+ _onFocus() {
218
+ if (!this.disabled) {
219
+ this._focused = true;
220
+ this.stateChanges.next();
221
+ }
222
+ }
223
+ /**
224
+ * Calls the CVA touched callback only if the dropdown is closed.
225
+ */
226
+ _onBlur() {
227
+ this._focused = false;
228
+ if (!this.disabled && !this._dropdownOpen) {
229
+ this._cvaOnTouched();
230
+ this._changeDetector.markForCheck();
231
+ this.stateChanges.next();
232
+ }
233
+ }
234
+ _buildChangeEvent(value) {
235
+ return new ImpdcSelectIconChange(this, value);
236
+ }
237
+ }
238
+ SelectIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectIconComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ErrorStateMatcher }, { token: IMPDC_FORM_ROOT, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
239
+ SelectIconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SelectIconComponent, selector: "impdc-select-icon", inputs: { disabled: "disabled", tabIndex: "tabIndex", allowSearch: "allowSearch", iconOptions: "iconOptions", showText: "showText", showSelectedText: "showSelectedText", placeholder: "placeholder", errorStateMatcher: "errorStateMatcher", value: "value", id: "id", required: "required" }, outputs: { selectionChange: "selectionChange", valueChange: "valueChange" }, 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-icon--required": "required", "class.impdc-select-icon--disabled": "disabled", "class.impdc-select-icon--invalid": "errorState", "class.impdc-select-icon--empty": "empty" }, classAttribute: "impdc-select-icon" }, providers: [
240
+ {
241
+ provide: ImpdcFormFieldControl,
242
+ useExisting: SelectIconComponent
243
+ }
244
+ ], viewQueries: [{ propertyName: "_toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n ngbDropdown\n autoClose=\"outside\"\n container=\"body\"\n dropdownClass=\"impartner-hex\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"w-100\">\n <button\n #toggleButton\n class=\"impdc-select-icon--toggle btn border-0 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n ngbDropdownToggle>\n <ng-container [ngSwitch]=\"empty\">\n <span\n class=\"impdc-select-icon--text impdc-select-icon--placeholder\"\n *ngSwitchCase=\"true\">\n {{ placeholder }}\n </span>\n <div\n class=\"impdc-select-icon--text impdc-select-icon--value-text\"\n *ngSwitchCase=\"false\">\n <i class=\"fas fa-{{ value }}\"></i>\n <span *ngIf=\"showSelectedText\" class=\"ms-2\">{{ value }}</span>\n </div>\n </ng-container>\n </button>\n <div ngbDropdownMenu class=\"select-icon-dropdown-menu\" tabindex=\"-1\">\n <div *ngIf=\"allowSearch\" class=\"select-icon-search\">\n <impdc-form-field>\n <span impdcTextPrefix><i class=\"fas fa-search\"></i></span>\n <input\n impdcInput\n [formControl]=\"searchControl\"\n class=\"select-icon-search-input\"\n type=\"search\" />\n </impdc-form-field>\n </div>\n <div class=\"select-icon-grid\">\n <button\n *ngFor=\"let iconName of filteredOptions$ | async\"\n type=\"button\"\n (click)=\"selectIcon(iconName)\"\n class=\"icon-option\"\n [class.selected]=\"value === iconName\"\n [title]=\"iconName\"\n [attr.aria-labelledby]=\"showText ? id + '_' + iconName : null\">\n <div class=\"icon-container\">\n <i class=\"fs-2xl fas fa-{{ iconName }}\"></i>\n </div>\n <div\n id=\"{{ id }}_{{ iconName }}\"\n class=\"icon-label\"\n [class.sr-only]=\"!showText\">\n {{ iconName }}\n </div>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{padding:0!important;position:relative}:host.impdc-select-icon--disabled{background-color:var(--impd-color-gray-100)}.impdc-select-icon--toggle{font-weight:inherit;padding-right:3.6rem;-webkit-user-select:none;user-select:none;width:100%}:host-context(.is-invalid) .impdc-select-icon--toggle{padding-right:6.6rem}.impdc-select-icon--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.select-icon-dropdown-menu{background-color:var(--impd-color-white);color:var(--impd-color-gray-600);max-width:51.2rem;min-width:32rem;overflow:hidden;width:100%}.select-icon-search{margin:var(--impd-size-2);font-size:var(--impd-font-size-sm)}.select-icon-grid{display:grid;align-items:start;grid-template-columns:repeat(auto-fit,minmax(4.8rem,1fr));gap:var(--impd-size-4);width:100%;max-height:var(--impd-size-40);overflow-y:auto;overflow-x:hidden;padding:var(--impd-size-4);-webkit-user-select:none;user-select:none}button[ngbDropdownToggle].dropdown-toggle:after{display:none}.icon-option{padding:0;background:unset;border:none}.icon-option:focus{outline:0}.icon-container{height:4rem;width:4rem;margin-left:auto;margin-right:auto;display:flex;align-items:center;justify-content:center;border-radius:50%;justify-items:center}.selected>.icon-container,:hover>.icon-container,:focus>.icon-container{background-color:var(--impartner-hex-primary);color:var(--impartner-hex-white)}.icon-label{text-align:center;font-size:1rem}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "component", type: i5.FormFieldComponent, selector: "impdc-form-field", exportAs: ["impdcFormField"] }, { kind: "directive", type: i6.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i7.PrefixDirective, selector: "[impdcPrefix], [impdcTextPrefix]", inputs: ["impdcTextPrefix"] }, { 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: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectIconComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ selector: 'impdc-select-icon', inputs: ['disabled', 'tabIndex'], changeDetection: ChangeDetectionStrategy.OnPush, host: {
248
+ class: 'impdc-select-icon',
249
+ '[attr.id]': 'id',
250
+ '[attr.tabindex]': 'tabIndex',
251
+ '[attr.aria-required]': 'required.toString()',
252
+ '[attr.aria-disabled]': 'disabled.toString()',
253
+ '[attr.aria-invalid]': 'errorState',
254
+ '[class.form-select]': 'true',
255
+ '[class.is-invalid]': 'errorState',
256
+ '[class.impdc-form-field-control]': 'true',
257
+ '[class.impdc-select-icon--required]': 'required',
258
+ '[class.impdc-select-icon--disabled]': 'disabled',
259
+ '[class.impdc-select-icon--invalid]': 'errorState',
260
+ '[class.impdc-select-icon--empty]': 'empty',
261
+ '(focus)': '_onFocus(); focus()'
262
+ }, providers: [
263
+ {
264
+ provide: ImpdcFormFieldControl,
265
+ useExisting: SelectIconComponent
266
+ }
267
+ ], template: "<div\n ngbDropdown\n autoClose=\"outside\"\n container=\"body\"\n dropdownClass=\"impartner-hex\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"w-100\">\n <button\n #toggleButton\n class=\"impdc-select-icon--toggle btn border-0 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n ngbDropdownToggle>\n <ng-container [ngSwitch]=\"empty\">\n <span\n class=\"impdc-select-icon--text impdc-select-icon--placeholder\"\n *ngSwitchCase=\"true\">\n {{ placeholder }}\n </span>\n <div\n class=\"impdc-select-icon--text impdc-select-icon--value-text\"\n *ngSwitchCase=\"false\">\n <i class=\"fas fa-{{ value }}\"></i>\n <span *ngIf=\"showSelectedText\" class=\"ms-2\">{{ value }}</span>\n </div>\n </ng-container>\n </button>\n <div ngbDropdownMenu class=\"select-icon-dropdown-menu\" tabindex=\"-1\">\n <div *ngIf=\"allowSearch\" class=\"select-icon-search\">\n <impdc-form-field>\n <span impdcTextPrefix><i class=\"fas fa-search\"></i></span>\n <input\n impdcInput\n [formControl]=\"searchControl\"\n class=\"select-icon-search-input\"\n type=\"search\" />\n </impdc-form-field>\n </div>\n <div class=\"select-icon-grid\">\n <button\n *ngFor=\"let iconName of filteredOptions$ | async\"\n type=\"button\"\n (click)=\"selectIcon(iconName)\"\n class=\"icon-option\"\n [class.selected]=\"value === iconName\"\n [title]=\"iconName\"\n [attr.aria-labelledby]=\"showText ? id + '_' + iconName : null\">\n <div class=\"icon-container\">\n <i class=\"fs-2xl fas fa-{{ iconName }}\"></i>\n </div>\n <div\n id=\"{{ id }}_{{ iconName }}\"\n class=\"icon-label\"\n [class.sr-only]=\"!showText\">\n {{ iconName }}\n </div>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{padding:0!important;position:relative}:host.impdc-select-icon--disabled{background-color:var(--impd-color-gray-100)}.impdc-select-icon--toggle{font-weight:inherit;padding-right:3.6rem;-webkit-user-select:none;user-select:none;width:100%}:host-context(.is-invalid) .impdc-select-icon--toggle{padding-right:6.6rem}.impdc-select-icon--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.select-icon-dropdown-menu{background-color:var(--impd-color-white);color:var(--impd-color-gray-600);max-width:51.2rem;min-width:32rem;overflow:hidden;width:100%}.select-icon-search{margin:var(--impd-size-2);font-size:var(--impd-font-size-sm)}.select-icon-grid{display:grid;align-items:start;grid-template-columns:repeat(auto-fit,minmax(4.8rem,1fr));gap:var(--impd-size-4);width:100%;max-height:var(--impd-size-40);overflow-y:auto;overflow-x:hidden;padding:var(--impd-size-4);-webkit-user-select:none;user-select:none}button[ngbDropdownToggle].dropdown-toggle:after{display:none}.icon-option{padding:0;background:unset;border:none}.icon-option:focus{outline:0}.icon-container{height:4rem;width:4rem;margin-left:auto;margin-right:auto;display:flex;align-items:center;justify-content:center;border-radius:50%;justify-items:center}.selected>.icon-container,:hover>.icon-container,:focus>.icon-container{background-color:var(--impartner-hex-primary);color:var(--impartner-hex-white)}.icon-label{text-align:center;font-size:1rem}\n"] }]
268
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ErrorStateMatcher }, { type: undefined, decorators: [{
269
+ type: Optional
270
+ }, {
271
+ type: Inject,
272
+ args: [IMPDC_FORM_ROOT]
273
+ }] }, { type: i2.NgForm, decorators: [{
274
+ type: Optional
275
+ }] }, { type: i2.FormGroupDirective, decorators: [{
276
+ type: Optional
277
+ }] }, { type: i2.NgControl, decorators: [{
278
+ type: Self
279
+ }, {
280
+ type: Optional
281
+ }] }]; }, propDecorators: { _toggleButtonRef: [{
282
+ type: ViewChild,
283
+ args: ['toggleButton', { static: true, read: ElementRef }]
284
+ }], allowSearch: [{
285
+ type: Input
286
+ }], iconOptions: [{
287
+ type: Input
288
+ }], showText: [{
289
+ type: Input
290
+ }], showSelectedText: [{
291
+ type: Input
292
+ }], placeholder: [{
293
+ type: Input
294
+ }], errorStateMatcher: [{
295
+ type: Input
296
+ }], selectionChange: [{
297
+ type: Output
298
+ }], valueChange: [{
299
+ type: Output
300
+ }], value: [{
301
+ type: Input
302
+ }], id: [{
303
+ type: Input
304
+ }], required: [{
305
+ type: Input
306
+ }] } });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9zZWxlY3QtaWNvbi9zZWxlY3QtaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1pY29uL3NlbGVjdC1pY29uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxXQUFXLEVBSVgsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFnQiwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFJTCxxQkFBcUIsRUFFckIsZUFBZSxFQUNmLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNkLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFFdkIsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUFtQixNQUEyQixFQUFTLEtBQVU7UUFBOUMsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFBUyxVQUFLLEdB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QUFROzswQkFDUixRQUFROzswQkFDUixJQUFJOzswQkFBSSxRQUFROzRDQXRGVCxnQkFBZ0I7c0JBRHpCLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXFCdEQsV0FBVztzQkFEakIsS0FBSztnQkFXSyxXQUFXO3NCQURyQixLQUFLO2dCQVlDLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBU0ssV0FBVztzQkFEckIsS0FBSztnQkFXVSxpQkFBaUI7c0JBRGhDLEtBQUs7Z0JBS1UsZUFBZTtzQkFEOUIsTUFBTTtnQkFTUyxXQUFXO3NCQUQxQixNQUFNO2dCQThISSxLQUFLO3NCQURmLEtBQUs7Z0JBZ0JLLEVBQUU7c0JBRFosS0FBSztnQkFpQkssUUFBUTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGUgKi9cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvbnRBd2Vzb21lSWNvbnMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQge1xuICBFcnJvclN0YXRlTWF0Y2hlcixcbiAgSUNhblVwZGF0ZUVycm9yU3RhdGUsXG4gIElIYXNFcnJvclN0YXRlLFxuICBJbXBkY0Zvcm1GaWVsZENvbnRyb2wsXG4gIEltcGRjRm9ybVJvb3QsXG4gIElNUERDX0ZPUk1fUk9PVCxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5FcnJvclN0YXRlLFxuICBtaXhpblRhYkluZGV4XG59IGZyb20gJy4uL2Zvcm0tZmllbGQnO1xuXG5leHBvcnQgY2xhc3MgSW1wZGNTZWxlY3RJY29uQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogU2VsZWN0SWNvbkNvbXBvbmVudCwgcHVibGljIHZhbHVlOiBhbnkpIHt9XG59XG5cbmNvbnN0IF9TZWxlY3RJY29uQ29tcG9uZW50QmFzZSA9IG1peGluVGFiSW5kZXgoXG4gIG1peGluRGlzYWJsZWQoXG4gICAgbWl4aW5FcnJvclN0YXRlKFxuICAgICAgY2xhc3Mge1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICBwdWJsaWMgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICAgICAgcHVibGljIF9mb3JtUm9vdDogSW1wZGNGb3JtUm9vdCxcbiAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICAgIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGxcbiAgICAgICAgKSB7fVxuICAgICAgfVxuICAgIClcbiAgKVxuKTtcblxuLyoqXG4gKiBUaGUgYFNlbGVjdEljb25Db21wb25lbnRgIChgPGltcGRjLXNlbGVjdC1pY29uYCkgaXMgYSBzZWxlY3QgZHJvcGRvd24gd2l0aCBzZWFyY2ggdGhhdCBzaG93cyBhbGwgc3RhbmRhcmQgaWNvbnMgZnJvbSBCb290c3RyYXAgNS5cbiAqIFRvIHVzZSwgaW1wb3J0IGBTZWxlY3RJY29uTW9kdWxlYCBvciBhbm90aGVyIG1vZHVsZSB0aGF0IGltcG9ydHMgYW5kIGV4cG9ydHMgdGhhdCBtb2R1bGUgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXNlbGVjdC1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC1pY29uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWljb24uY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dHMtbWV0YWRhdGEtcHJvcGVydHlcbiAgaW5wdXRzOiBbJ2Rpc2FibGVkJywgJ3RhYkluZGV4J10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnaW1wZGMtc2VsZWN0LWljb24nLFxuICAgICdbYXR0ci5pZF0nOiAnaWQnLFxuICAgICdbYXR0ci50YWJpbmRleF0nOiAndGFiSW5kZXgnLFxuICAgICdbYXR0ci5hcmlhLXJlcXVpcmVkXSc6ICdyZXF1aXJlZC50b1N0cmluZygpJyxcbiAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQudG9TdHJpbmcoKScsXG4gICAgJ1thdHRyLmFyaWEtaW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5mb3JtLXNlbGVjdF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5pcy1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmltcGRjLWZvcm0tZmllbGQtY29udHJvbF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtaWNvbi0tcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC1pY29uLS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LWljb24tLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LWljb24tLWVtcHR5XSc6ICdlbXB0eScsXG4gICAgJyhmb2N1cyknOiAnX29uRm9jdXMoKTsgZm9jdXMoKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogSW1wZGNGb3JtRmllbGRDb250cm9sLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlbGVjdEljb25Db21wb25lbnRcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0SWNvbkNvbXBvbmVudFxuICBleHRlbmRzIF9TZWxlY3RJY29uQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgSW1wZGNGb3JtRmllbGRDb250cm9sPHN0cmluZyB8IG51bGw+LFxuICAgIElDYW5VcGRhdGVFcnJvclN0YXRlLFxuICAgIElIYXNFcnJvclN0YXRlLFxuICAgIERvQ2hlY2ssXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveVxue1xuICBAVmlld0NoaWxkKCd0b2dnbGVCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcm90ZWN0ZWQgX3RvZ2dsZUJ1dHRvblJlZiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBfdWlkID0gYGltcGRjLXNlbGVjdC1pY29uLSR7bmFub2lkKCl9YDtcbiAgcHJvdGVjdGVkIF9kcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pY29uT3B0aW9uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IHN0cmluZ1tdPihcbiAgICBGb250QXdlc29tZUljb25zXG4gICk7XG4gIHByaXZhdGUgX3ByZXZpb3VzQ29udHJvbD86IEFic3RyYWN0Q29udHJvbCB8IG51bGw7XG4gIHByaXZhdGUgX2N2YU9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF9jdmFPblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgb3Igbm90IGFuIGlucHV0IGZpZWxkIHdpbGwgYXBwZWFyIGZvciBzZWFyY2hpbmcgYW5kXG4gICAqIGZpbHRlcmluZyBpY29uIG9wdGlvbnMuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhbGxvd1NlYXJjaDogYm9vbGVhbjtcblxuICBwdWJsaWMgZ2V0IGljb25PcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2ljb25PcHRpb25zU3ViamVjdC52YWx1ZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldCBvZiBGb250QXdlc29tZSBpY29uIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGljb25PcHRpb25zKGljb25PcHRpb25zOiBzdHJpbmdbXSkge1xuICAgIGlmIChpY29uT3B0aW9ucykge1xuICAgICAgdGhpcy5faWNvbk9wdGlvbnNTdWJqZWN0Lm5leHQoWy4uLmljb25PcHRpb25zXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBpY29uIG5hbWVzIGFzIGxhYmVscyBmb3IgaWNvbiBvcHRpb25zLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1RleHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBpY29uIGluc2lkZSB0aGUgY29udHJvbC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dTZWxlY3RlZFRleHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXFwtIFNlbGVjdCAtXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnLSBTZWxlY3QgLSc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGVycm9yU3RhdGVNYXRjaGVyITogRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgLyoqIEV2ZW50cyBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SW1wZGNTZWxlY3RJY29uQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SW1wZGNTZWxlY3RJY29uQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudHMgZmlyZSB3aGVuIHJhdyB2YWx1ZSBvZiBzZWxlY3QgY2hhbmdlcy4gTWFpbmx5IGV4aXN0cyB0byBoYW5kbGVcbiAgICogdHdvLXdheSBiaW5kaW5nIG9mIGB2YWx1ZWAgaW5wdXQgcHJvcGVydHkuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSU1QRENfRk9STV9ST09UKSBfZm9ybVJvb3Q6IEltcGRjRm9ybVJvb3QsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICBfZm9ybVJvb3QsXG4gICAgICBfcGFyZW50Rm9ybSxcbiAgICAgIF9wYXJlbnRGb3JtR3JvdXAsXG4gICAgICBuZ0NvbnRyb2xcbiAgICApO1xuXG4gICAgdGhpcy5hbGxvd1NlYXJjaCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RleHQgPSB0cnVlO1xuICAgIHRoaXMuc2hvd1NlbGVjdGVkVGV4dCA9IHRydWU7XG5cbiAgICBjb25zdCBkZWJvdW5jZWRTZWFyY2hWYWx1ZXMgPSB0aGlzLnNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIGRlYm91bmNlZFNlYXJjaFZhbHVlcyxcbiAgICAgIHRoaXMuX2ljb25PcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWFyY2hUZXJtLCBpY29uT3B0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pY29uT3B0aW9uc107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hUZXJtTG93ZXJDYXNlID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gaWNvbk9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRlcm1Mb3dlckNhc2UpID4gLTFcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5pZCA9IHRoaXMuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fdG9nZ2xlQnV0dG9uUmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICAvKiBMaWZlY3ljbGUgSG9va3MgKi9cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMubmdDb250cm9sO1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNDb250cm9sICE9PSBuZ0NvbnRyb2wuY29udHJvbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IG51bGwgJiZcbiAgICAgICAgbmdDb250cm9sLmRpc2FibGVkICE9PSB0aGlzLmRpc2FibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG5nQ29udHJvbD8uZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBNYW5hZ2luZyBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIHZpYSB0aGUgYG1peGluRGlzYWJsZWRgIG1peGluL2dlbmVyYXRvciwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gdG8gdGhlIHBhcmVudCBmb3JtIGZpZWxkIHNvIGl0IGNhbiBydW4gY2hhbmdlIGRldGVjdGlvbiB3aGVuIGRpc2FibGVkIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qIENvbnRyb2xWYWx1ZUFjY2Vzc29yICovXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2N2YU9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fY3ZhT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyogSW1wZGNGb3JtRmllbGRDb250cm9sICovXG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICh2YWx1ZSAmJiB0aGlzLmljb25PcHRpb25zLmZpbmQob3B0ID0+IG9wdCA9PT0gdmFsdWUpKSB8fCBudWxsO1xuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByb3RlY3RlZCBfaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHJlcXVpcmVkbmVzcyBvZiBjb250cm9sIGluIGEgdGVtcGxhdGUtYmFzZWQgbWFubmVyO1xuICAgKiBub3QgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgdGhlIEFuZ3VsYXIgcmVhY3RpdmUgZm9ybXMgQVBJIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRvci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3JlcXVpcmVkID8/XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpID8/XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHlWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLl9kcm9wZG93bk9wZW47XG4gIH1cbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnaW1wZGMtc2VsZWN0LWljb24nO1xuICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNBZmZpeGVzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiBJbnRlcm5hbHMgKi9cblxuICBwcm90ZWN0ZWQgaGFuZGxlT3BlbkNoYW5nZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kcm9wZG93bk9wZW4gPSBpc09wZW47XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLnJlc2V0KCk7XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB0aGlzLl9vbkZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uQmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJY29uKGljb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaWNvbk5hbWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpY29uTmFtZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuX2N2YU9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9idWlsZENoYW5nZUV2ZW50KHRoaXMudmFsdWUpKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIENWQSB0b3VjaGVkIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5fZHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLl9jdmFPblRvdWNoZWQoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQ2hhbmdlRXZlbnQodmFsdWU6IHN0cmluZyB8IG51bGwpOiBJbXBkY1NlbGVjdEljb25DaGFuZ2Uge1xuICAgIHJldHVybiBuZXcgSW1wZGNTZWxlY3RJY29uQ2hhbmdlKHRoaXMsIHZhbHVlKTtcbiAgfVxufVxuIiwiPGRpdlxuICBuZ2JEcm9wZG93blxuICBhdXRvQ2xvc2U9XCJvdXRzaWRlXCJcbiAgY29udGFpbmVyPVwiYm9keVwiXG4gIGRyb3Bkb3duQ2xhc3M9XCJpbXBhcnRuZXItaGV4XCJcbiAgKG9wZW5DaGFuZ2UpPVwiaGFuZGxlT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgY2xhc3M9XCJ3LTEwMFwiPlxuICA8YnV0dG9uXG4gICAgI3RvZ2dsZUJ1dHRvblxuICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LWljb24tLXRvZ2dsZSBidG4gYm9yZGVyLTAgdGV4dC1zdGFydFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImVtcHR5XCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC1pY29uLS10ZXh0IGltcGRjLXNlbGVjdC1pY29uLS1wbGFjZWhvbGRlclwiXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LWljb24tLXRleHQgaW1wZGMtc2VsZWN0LWljb24tLXZhbHVlLXRleHRcIlxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEte3sgdmFsdWUgfX1cIj48L2k+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1NlbGVjdGVkVGV4dFwiIGNsYXNzPVwibXMtMlwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cInNlbGVjdC1pY29uLWRyb3Bkb3duLW1lbnVcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgPGRpdiAqbmdJZj1cImFsbG93U2VhcmNoXCIgY2xhc3M9XCJzZWxlY3QtaWNvbi1zZWFyY2hcIj5cbiAgICAgIDxpbXBkYy1mb3JtLWZpZWxkPlxuICAgICAgICA8c3BhbiBpbXBkY1RleHRQcmVmaXg+PGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaW1wZGNJbnB1dFxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWFyY2hDb250cm9sXCJcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdC1pY29uLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiIC8+XG4gICAgICA8L2ltcGRjLWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1pY29uLWdyaWRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IGljb25OYW1lIG9mIGZpbHRlcmVkT3B0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SWNvbihpY29uTmFtZSlcIlxuICAgICAgICBjbGFzcz1cImljb24tb3B0aW9uXCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInZhbHVlID09PSBpY29uTmFtZVwiXG4gICAgICAgIFt0aXRsZV09XCJpY29uTmFtZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJzaG93VGV4dCA/IGlkICsgJ18nICsgaWNvbk5hbWUgOiBudWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZnMtMnhsIGZhcyBmYS17eyBpY29uTmFtZSB9fVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cInt7IGlkIH19X3t7IGljb25OYW1lIH19XCJcbiAgICAgICAgICBjbGFzcz1cImljb24tbGFiZWxcIlxuICAgICAgICAgIFtjbGFzcy5zci1vbmx5XT1cIiFzaG93VGV4dFwiPlxuICAgICAgICAgIHt7IGljb25OYW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=