@ardium-ui/ui 4.4.2 → 5.0.0-alpha.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 (350) hide show
  1. package/fesm2022/ardium-ui-ui.mjs +2482 -2400
  2. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  3. package/lib/_internal/boolean-component.d.ts +1 -1
  4. package/lib/_internal/disablable-component.d.ts +1 -1
  5. package/lib/_internal/focusable-component.d.ts +1 -1
  6. package/lib/_internal/form-field-component.d.ts +1 -1
  7. package/lib/_internal/ngmodel-component.d.ts +1 -1
  8. package/lib/_internal/selectable-list-component.d.ts +1 -1
  9. package/lib/_internal/utils/date.utils.d.ts +3 -0
  10. package/lib/buttons/_button-base.d.ts +1 -1
  11. package/lib/calendar/calendar.component.d.ts +8 -2
  12. package/lib/file-inputs/file-input-base.d.ts +1 -1
  13. package/lib/form-field/form-field-base.d.ts +1 -1
  14. package/lib/inputs/_simple-input-base.d.ts +3 -3
  15. package/lib/inputs/autocomplete-input/autocomplete-input.component.d.ts +66 -0
  16. package/lib/inputs/autocomplete-input/autocomplete-input.defaults.d.ts +15 -0
  17. package/lib/inputs/autocomplete-input/autocomplete-input.directives.d.ts +33 -0
  18. package/lib/inputs/autocomplete-input/autocomplete-input.module.d.ts +13 -0
  19. package/lib/inputs/autocomplete-input/index.d.ts +3 -0
  20. package/lib/inputs/date-input/date-input.component.d.ts +5 -2
  21. package/lib/inputs/input/index.d.ts +2 -1
  22. package/lib/inputs/input/input.component.d.ts +3 -56
  23. package/lib/inputs/input/input.defaults.d.ts +1 -10
  24. package/lib/inputs/input/input.directives.d.ts +0 -13
  25. package/lib/inputs/input/input.module.d.ts +3 -5
  26. package/lib/inputs/input-utils.d.ts +8 -8
  27. package/lib/option/option.component.d.ts +1 -1
  28. package/lib/slider/abstract-slider.d.ts +1 -1
  29. package/package.json +1 -3
  30. package/prebuilt-themes/default/inputs/{simple-input.css → autocomplete-input.css} +40 -15
  31. package/prebuilt-themes/default/inputs/autocomplete-input.css.map +1 -0
  32. package/prebuilt-themes/default/inputs/input.css +0 -25
  33. package/prebuilt-themes/default/inputs/input.css.map +1 -1
  34. package/public-api.d.ts +1 -1
  35. package/themes/default/inputs/autocomplete-input.scss +46 -0
  36. package/themes/default/inputs/input.scss +0 -34
  37. package/esm2022/ardium-ui-ui.mjs +0 -5
  38. package/esm2022/lib/_internal/boolean-component.mjs +0 -95
  39. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +0 -15
  40. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +0 -18
  41. package/esm2022/lib/_internal/disablable-component.mjs +0 -51
  42. package/esm2022/lib/_internal/focusable-component.mjs +0 -85
  43. package/esm2022/lib/_internal/form-field-component.mjs +0 -33
  44. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +0 -453
  45. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +0 -370
  46. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +0 -157
  47. package/esm2022/lib/_internal/models/pagination.model.mjs +0 -90
  48. package/esm2022/lib/_internal/models/queue.mjs +0 -59
  49. package/esm2022/lib/_internal/ngmodel-component.mjs +0 -101
  50. package/esm2022/lib/_internal/public-api.mjs +0 -2
  51. package/esm2022/lib/_internal/selectable-list-component.mjs +0 -271
  52. package/esm2022/lib/badge/badge.defaults.mjs +0 -20
  53. package/esm2022/lib/badge/badge.directive.mjs +0 -97
  54. package/esm2022/lib/badge/badge.module.mjs +0 -18
  55. package/esm2022/lib/badge/badge.types.mjs +0 -16
  56. package/esm2022/lib/badge/index.mjs +0 -5
  57. package/esm2022/lib/buttons/_button-base.defaults.mjs +0 -17
  58. package/esm2022/lib/buttons/_button-base.mjs +0 -26
  59. package/esm2022/lib/buttons/button/button.component.mjs +0 -38
  60. package/esm2022/lib/buttons/button/button.defaults.mjs +0 -17
  61. package/esm2022/lib/buttons/button/button.module.mjs +0 -18
  62. package/esm2022/lib/buttons/button/index.mjs +0 -4
  63. package/esm2022/lib/buttons/fab/fab.component.mjs +0 -33
  64. package/esm2022/lib/buttons/fab/fab.defaults.mjs +0 -17
  65. package/esm2022/lib/buttons/fab/fab.module.mjs +0 -18
  66. package/esm2022/lib/buttons/fab/index.mjs +0 -4
  67. package/esm2022/lib/buttons/general-button.types.mjs +0 -55
  68. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +0 -39
  69. package/esm2022/lib/buttons/icon-button/icon-button.defaults.mjs +0 -9
  70. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +0 -18
  71. package/esm2022/lib/buttons/icon-button/index.mjs +0 -4
  72. package/esm2022/lib/calendar/calendar.component.mjs +0 -466
  73. package/esm2022/lib/calendar/calendar.defaults.mjs +0 -26
  74. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  75. package/esm2022/lib/calendar/calendar.internal-directives.mjs +0 -22
  76. package/esm2022/lib/calendar/calendar.internal-types.mjs +0 -2
  77. package/esm2022/lib/calendar/calendar.module.mjs +0 -71
  78. package/esm2022/lib/calendar/calendar.types.mjs +0 -6
  79. package/esm2022/lib/calendar/index.mjs +0 -6
  80. package/esm2022/lib/calendar/views/days-view/days-view.component.mjs +0 -282
  81. package/esm2022/lib/calendar/views/days-view/days-view.helpers.mjs +0 -65
  82. package/esm2022/lib/calendar/views/months-view/months-view.component.mjs +0 -245
  83. package/esm2022/lib/calendar/views/months-view/months-view.helpers.mjs +0 -22
  84. package/esm2022/lib/calendar/views/years-view/years-view.component.mjs +0 -244
  85. package/esm2022/lib/calendar/views/years-view/years-view.helpers.mjs +0 -14
  86. package/esm2022/lib/card/card.children.mjs +0 -96
  87. package/esm2022/lib/card/card.component.mjs +0 -38
  88. package/esm2022/lib/card/card.defaults.mjs +0 -17
  89. package/esm2022/lib/card/card.module.mjs +0 -59
  90. package/esm2022/lib/card/card.types.mjs +0 -9
  91. package/esm2022/lib/card/index.mjs +0 -6
  92. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -68
  93. package/esm2022/lib/checkbox/checkbox.defaults.mjs +0 -17
  94. package/esm2022/lib/checkbox/checkbox.directives.mjs +0 -14
  95. package/esm2022/lib/checkbox/checkbox.internal-directives.mjs +0 -15
  96. package/esm2022/lib/checkbox/checkbox.module.mjs +0 -20
  97. package/esm2022/lib/checkbox/checkbox.types.mjs +0 -6
  98. package/esm2022/lib/checkbox/index.mjs +0 -6
  99. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +0 -116
  100. package/esm2022/lib/checkbox-list/checkbox-list.defaults.mjs +0 -25
  101. package/esm2022/lib/checkbox-list/checkbox-list.directives.mjs +0 -14
  102. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +0 -21
  103. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +0 -7
  104. package/esm2022/lib/checkbox-list/index.mjs +0 -6
  105. package/esm2022/lib/chip/chip.component.mjs +0 -36
  106. package/esm2022/lib/chip/chip.defaults.mjs +0 -20
  107. package/esm2022/lib/chip/chip.module.mjs +0 -21
  108. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +0 -53
  109. package/esm2022/lib/chip/deletable-chip/deletable-chip.defaults.mjs +0 -17
  110. package/esm2022/lib/chip/index.mjs +0 -8
  111. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +0 -53
  112. package/esm2022/lib/chip/selectable-chip/selectable-chip.defaults.mjs +0 -18
  113. package/esm2022/lib/dialog/dialog.component.mjs +0 -109
  114. package/esm2022/lib/dialog/dialog.defaults.mjs +0 -26
  115. package/esm2022/lib/dialog/dialog.directives.mjs +0 -25
  116. package/esm2022/lib/dialog/dialog.module.mjs +0 -21
  117. package/esm2022/lib/dialog/dialog.types.mjs +0 -10
  118. package/esm2022/lib/dialog/index.mjs +0 -6
  119. package/esm2022/lib/divider/divider.component.mjs +0 -19
  120. package/esm2022/lib/divider/divider.defaults.mjs +0 -13
  121. package/esm2022/lib/divider/divider.module.mjs +0 -18
  122. package/esm2022/lib/divider/index.mjs +0 -4
  123. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +0 -112
  124. package/esm2022/lib/dropdown-panel/dropdown-panel.defaults.mjs +0 -17
  125. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +0 -18
  126. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +0 -10
  127. package/esm2022/lib/dropdown-panel/index.mjs +0 -5
  128. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +0 -70
  129. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.defaults.mjs +0 -18
  130. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +0 -42
  131. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +0 -52
  132. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +0 -5
  133. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +0 -120
  134. package/esm2022/lib/file-inputs/file-input/file-input.defaults.mjs +0 -23
  135. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +0 -86
  136. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +0 -55
  137. package/esm2022/lib/file-inputs/file-input/index.mjs +0 -5
  138. package/esm2022/lib/file-inputs/file-input-base.defaults.mjs +0 -8
  139. package/esm2022/lib/file-inputs/file-input-base.mjs +0 -356
  140. package/esm2022/lib/file-inputs/file-input-types.mjs +0 -8
  141. package/esm2022/lib/form-field/error/error.component.mjs +0 -17
  142. package/esm2022/lib/form-field/error/error.directive.mjs +0 -17
  143. package/esm2022/lib/form-field/form-field-base.mjs +0 -53
  144. package/esm2022/lib/form-field/form-field-child.token.mjs +0 -3
  145. package/esm2022/lib/form-field/form-field-native-inputs.mjs +0 -80
  146. package/esm2022/lib/form-field/form-field.component.mjs +0 -12
  147. package/esm2022/lib/form-field/form-field.defaults.mjs +0 -17
  148. package/esm2022/lib/form-field/form-field.module.mjs +0 -49
  149. package/esm2022/lib/form-field/hint/hint.component.mjs +0 -17
  150. package/esm2022/lib/form-field/hint/hint.directive.mjs +0 -30
  151. package/esm2022/lib/form-field/horizontal-form-field.component.mjs +0 -12
  152. package/esm2022/lib/form-field/index.mjs +0 -10
  153. package/esm2022/lib/form-field/label/label.component.mjs +0 -27
  154. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +0 -58
  155. package/esm2022/lib/form-field-frame/form-field-frame.defaults.mjs +0 -18
  156. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +0 -25
  157. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +0 -19
  158. package/esm2022/lib/form-field-frame/index.mjs +0 -5
  159. package/esm2022/lib/icon/icon.component.mjs +0 -52
  160. package/esm2022/lib/icon/icon.defaults.mjs +0 -17
  161. package/esm2022/lib/icon/icon.module.mjs +0 -19
  162. package/esm2022/lib/icon/icon.pipe.mjs +0 -18
  163. package/esm2022/lib/icon/index.mjs +0 -5
  164. package/esm2022/lib/inputs/_simple-input-base.mjs +0 -153
  165. package/esm2022/lib/inputs/date-input/date-input.component.mjs +0 -375
  166. package/esm2022/lib/inputs/date-input/date-input.defaults.mjs +0 -38
  167. package/esm2022/lib/inputs/date-input/date-input.directive.mjs +0 -163
  168. package/esm2022/lib/inputs/date-input/date-input.module.mjs +0 -108
  169. package/esm2022/lib/inputs/date-input/date-input.serializers.mjs +0 -49
  170. package/esm2022/lib/inputs/date-input/date-input.types.mjs +0 -5
  171. package/esm2022/lib/inputs/date-input/index.mjs +0 -6
  172. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +0 -265
  173. package/esm2022/lib/inputs/digit-input/digit-input.defaults.mjs +0 -24
  174. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +0 -267
  175. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +0 -19
  176. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +0 -15
  177. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +0 -8
  178. package/esm2022/lib/inputs/digit-input/index.mjs +0 -5
  179. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +0 -180
  180. package/esm2022/lib/inputs/hex-input/hex-input.defaults.mjs +0 -26
  181. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +0 -36
  182. package/esm2022/lib/inputs/hex-input/hex-input.model.mjs +0 -97
  183. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +0 -37
  184. package/esm2022/lib/inputs/hex-input/index.mjs +0 -5
  185. package/esm2022/lib/inputs/input/index.mjs +0 -4
  186. package/esm2022/lib/inputs/input/input.component.mjs +0 -278
  187. package/esm2022/lib/inputs/input/input.defaults.mjs +0 -21
  188. package/esm2022/lib/inputs/input/input.directives.mjs +0 -58
  189. package/esm2022/lib/inputs/input/input.module.mjs +0 -61
  190. package/esm2022/lib/inputs/input-transformers.mjs +0 -66
  191. package/esm2022/lib/inputs/input-types.mjs +0 -6
  192. package/esm2022/lib/inputs/input-utils.mjs +0 -186
  193. package/esm2022/lib/inputs/number-input/index.mjs +0 -5
  194. package/esm2022/lib/inputs/number-input/number-input.component.mjs +0 -250
  195. package/esm2022/lib/inputs/number-input/number-input.defaults.mjs +0 -27
  196. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +0 -14
  197. package/esm2022/lib/inputs/number-input/number-input.module.mjs +0 -21
  198. package/esm2022/lib/inputs/password-input/index.mjs +0 -6
  199. package/esm2022/lib/inputs/password-input/password-input.component.mjs +0 -167
  200. package/esm2022/lib/inputs/password-input/password-input.defaults.mjs +0 -24
  201. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +0 -49
  202. package/esm2022/lib/inputs/password-input/password-input.module.mjs +0 -41
  203. package/esm2022/lib/inputs/password-input/password-input.types.mjs +0 -2
  204. package/esm2022/lib/inputs/simple-input/index.mjs +0 -5
  205. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +0 -50
  206. package/esm2022/lib/inputs/simple-input/simple-input.defaults.mjs +0 -25
  207. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +0 -36
  208. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +0 -37
  209. package/esm2022/lib/kbd/index.mjs +0 -6
  210. package/esm2022/lib/kbd/kbd.component.mjs +0 -30
  211. package/esm2022/lib/kbd/kbd.defaults.mjs +0 -15
  212. package/esm2022/lib/kbd/kbd.directive.mjs +0 -33
  213. package/esm2022/lib/kbd/kbd.module.mjs +0 -20
  214. package/esm2022/lib/kbd/kbd.pipe.mjs +0 -21
  215. package/esm2022/lib/kbd-shortcut/index.mjs +0 -4
  216. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +0 -36
  217. package/esm2022/lib/kbd-shortcut/kbd-shortcut.defaults.mjs +0 -8
  218. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +0 -19
  219. package/esm2022/lib/modal/index.mjs +0 -5
  220. package/esm2022/lib/modal/modal.component.mjs +0 -95
  221. package/esm2022/lib/modal/modal.defaults.mjs +0 -20
  222. package/esm2022/lib/modal/modal.directives.mjs +0 -14
  223. package/esm2022/lib/modal/modal.module.mjs +0 -22
  224. package/esm2022/lib/option/index.mjs +0 -3
  225. package/esm2022/lib/option/option.component.mjs +0 -55
  226. package/esm2022/lib/option/option.module.mjs +0 -18
  227. package/esm2022/lib/progress-bar/index.mjs +0 -6
  228. package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -58
  229. package/esm2022/lib/progress-bar/progress-bar.defaults.mjs +0 -21
  230. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +0 -14
  231. package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -19
  232. package/esm2022/lib/progress-bar/progress-bar.types.mjs +0 -19
  233. package/esm2022/lib/progress-circle/index.mjs +0 -6
  234. package/esm2022/lib/progress-circle/progress-circle.component.mjs +0 -45
  235. package/esm2022/lib/progress-circle/progress-circle.defaults.mjs +0 -21
  236. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +0 -14
  237. package/esm2022/lib/progress-circle/progress-circle.module.mjs +0 -19
  238. package/esm2022/lib/progress-circle/progress-circle.types.mjs +0 -10
  239. package/esm2022/lib/radio/index.mjs +0 -5
  240. package/esm2022/lib/radio/radio/radio.component.mjs +0 -119
  241. package/esm2022/lib/radio/radio/radio.defaults.mjs +0 -16
  242. package/esm2022/lib/radio/radio-group.component.mjs +0 -203
  243. package/esm2022/lib/radio/radio.module.mjs +0 -19
  244. package/esm2022/lib/search-functions.mjs +0 -64
  245. package/esm2022/lib/segment/index.mjs +0 -6
  246. package/esm2022/lib/segment/segment.component.mjs +0 -125
  247. package/esm2022/lib/segment/segment.defaults.mjs +0 -26
  248. package/esm2022/lib/segment/segment.directives.mjs +0 -14
  249. package/esm2022/lib/segment/segment.module.mjs +0 -19
  250. package/esm2022/lib/segment/segment.types.mjs +0 -13
  251. package/esm2022/lib/select/index.mjs +0 -6
  252. package/esm2022/lib/select/select.component.mjs +0 -836
  253. package/esm2022/lib/select/select.defaults.mjs +0 -53
  254. package/esm2022/lib/select/select.directive.mjs +0 -171
  255. package/esm2022/lib/select/select.module.mjs +0 -112
  256. package/esm2022/lib/select/select.types.mjs +0 -2
  257. package/esm2022/lib/slide-toggle/index.mjs +0 -5
  258. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +0 -43
  259. package/esm2022/lib/slide-toggle/slide-toggle.defaults.mjs +0 -21
  260. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +0 -18
  261. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +0 -5
  262. package/esm2022/lib/slider/abstract-slider.mjs +0 -251
  263. package/esm2022/lib/slider/index.mjs +0 -8
  264. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +0 -151
  265. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +0 -18
  266. package/esm2022/lib/slider/slider.component.mjs +0 -100
  267. package/esm2022/lib/slider/slider.defaults.mjs +0 -14
  268. package/esm2022/lib/slider/slider.directive.mjs +0 -16
  269. package/esm2022/lib/slider/slider.module.mjs +0 -20
  270. package/esm2022/lib/slider/slider.types.mjs +0 -10
  271. package/esm2022/lib/snackbar/index.mjs +0 -5
  272. package/esm2022/lib/snackbar/snackbar-ref.mjs +0 -51
  273. package/esm2022/lib/snackbar/snackbar.component.mjs +0 -48
  274. package/esm2022/lib/snackbar/snackbar.service.mjs +0 -224
  275. package/esm2022/lib/snackbar/snackbar.token.mjs +0 -26
  276. package/esm2022/lib/snackbar/snackbar.types.mjs +0 -25
  277. package/esm2022/lib/spinner/index.mjs +0 -4
  278. package/esm2022/lib/spinner/spinner.component.mjs +0 -19
  279. package/esm2022/lib/spinner/spinner.defaults.mjs +0 -14
  280. package/esm2022/lib/spinner/spinner.module.mjs +0 -18
  281. package/esm2022/lib/star/index.mjs +0 -6
  282. package/esm2022/lib/star/rating-display/index.mjs +0 -6
  283. package/esm2022/lib/star/rating-display/rating-display.component.mjs +0 -71
  284. package/esm2022/lib/star/rating-display/rating-display.defaults.mjs +0 -16
  285. package/esm2022/lib/star/rating-display/rating-display.directives.mjs +0 -16
  286. package/esm2022/lib/star/rating-display/rating-display.module.mjs +0 -20
  287. package/esm2022/lib/star/rating-display/rating-display.types.mjs +0 -2
  288. package/esm2022/lib/star/rating-input/index.mjs +0 -6
  289. package/esm2022/lib/star/rating-input/rating-input.component.mjs +0 -191
  290. package/esm2022/lib/star/rating-input/rating-input.defaults.mjs +0 -17
  291. package/esm2022/lib/star/rating-input/rating-input.directives.mjs +0 -16
  292. package/esm2022/lib/star/rating-input/rating-input.module.mjs +0 -20
  293. package/esm2022/lib/star/rating-input/rating-input.types.mjs +0 -2
  294. package/esm2022/lib/star/star-button/index.mjs +0 -6
  295. package/esm2022/lib/star/star-button/star-button.component.mjs +0 -55
  296. package/esm2022/lib/star/star-button/star-button.defaults.mjs +0 -18
  297. package/esm2022/lib/star/star-button/star-button.directives.mjs +0 -16
  298. package/esm2022/lib/star/star-button/star-button.module.mjs +0 -20
  299. package/esm2022/lib/star/star-button/star-button.types.mjs +0 -2
  300. package/esm2022/lib/star/star.component.mjs +0 -36
  301. package/esm2022/lib/star/star.defaults.mjs +0 -15
  302. package/esm2022/lib/star/star.directives.mjs +0 -16
  303. package/esm2022/lib/star/star.module.mjs +0 -20
  304. package/esm2022/lib/star/star.types.mjs +0 -23
  305. package/esm2022/lib/statebox/index.mjs +0 -4
  306. package/esm2022/lib/statebox/statebox.component.mjs +0 -114
  307. package/esm2022/lib/statebox/statebox.defaults.mjs +0 -20
  308. package/esm2022/lib/statebox/statebox.module.mjs +0 -18
  309. package/esm2022/lib/statebox/statebox.types.mjs +0 -2
  310. package/esm2022/lib/tabber/index.mjs +0 -6
  311. package/esm2022/lib/tabber/tab/tab.component.mjs +0 -44
  312. package/esm2022/lib/tabber/tab/tab.defaults.mjs +0 -13
  313. package/esm2022/lib/tabber/tabber.component.mjs +0 -90
  314. package/esm2022/lib/tabber/tabber.defaults.mjs +0 -19
  315. package/esm2022/lib/tabber/tabber.module.mjs +0 -19
  316. package/esm2022/lib/table/index.mjs +0 -6
  317. package/esm2022/lib/table/table-item-storage.mjs +0 -564
  318. package/esm2022/lib/table/table.component.mjs +0 -367
  319. package/esm2022/lib/table/table.defaults.mjs +0 -53
  320. package/esm2022/lib/table/table.directives.mjs +0 -62
  321. package/esm2022/lib/table/table.module.mjs +0 -47
  322. package/esm2022/lib/table/table.types.mjs +0 -30
  323. package/esm2022/lib/table/utils.mjs +0 -18
  324. package/esm2022/lib/table-from-csv/index.mjs +0 -4
  325. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +0 -120
  326. package/esm2022/lib/table-from-csv/table-from-csv.defaults.mjs +0 -15
  327. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +0 -19
  328. package/esm2022/lib/table-pagination/index.mjs +0 -5
  329. package/esm2022/lib/table-pagination/table-pagination.component.mjs +0 -108
  330. package/esm2022/lib/table-pagination/table-pagination.defaults.mjs +0 -25
  331. package/esm2022/lib/table-pagination/table-pagination.module.mjs +0 -21
  332. package/esm2022/lib/table-pagination/table-pagination.types.mjs +0 -7
  333. package/esm2022/lib/text-list/index.mjs +0 -4
  334. package/esm2022/lib/text-list/text-list.component.mjs +0 -18
  335. package/esm2022/lib/text-list/text-list.module.mjs +0 -19
  336. package/esm2022/lib/text-list/text-list.pipe.mjs +0 -16
  337. package/esm2022/lib/types/alignment.types.mjs +0 -10
  338. package/esm2022/lib/types/button.types.mjs +0 -6
  339. package/esm2022/lib/types/colors.types.mjs +0 -43
  340. package/esm2022/lib/types/item-storage.types.mjs +0 -6
  341. package/esm2022/lib/types/theming.types.mjs +0 -48
  342. package/esm2022/lib/types/utility.types.mjs +0 -5
  343. package/esm2022/public-api.mjs +0 -74
  344. package/lib/inputs/simple-input/index.d.ts +0 -4
  345. package/lib/inputs/simple-input/simple-input.component.d.ts +0 -13
  346. package/lib/inputs/simple-input/simple-input.defaults.d.ts +0 -6
  347. package/lib/inputs/simple-input/simple-input.directives.d.ts +0 -20
  348. package/lib/inputs/simple-input/simple-input.module.d.ts +0 -11
  349. package/prebuilt-themes/default/inputs/simple-input.css.map +0 -1
  350. package/themes/default/inputs/simple-input.scss +0 -12
@@ -1,370 +0,0 @@
1
- import { computed, signal } from '@angular/core';
2
- import { resolvePath } from 'resolve-object-path';
3
- import { evaluate, isArray, isDefined, isObject, isPrimitive } from 'simple-bool';
4
- export class SimpleItemStorage {
5
- constructor(_ardParentComp) {
6
- this._ardParentComp = _ardParentComp;
7
- this._items = signal([]);
8
- this._highlightedItems = signal([]);
9
- this._selectedItems = signal([]);
10
- /**
11
- * Gets all items.
12
- */
13
- this.items = this._items.asReadonly();
14
- /**
15
- * Gets all currently highlighted items.
16
- */
17
- this.highlightedItems = this._highlightedItems.asReadonly();
18
- /**
19
- * Gets all currently selected items.
20
- */
21
- this.selectedItems = this._selectedItems.asReadonly();
22
- /**
23
- * Gets the values of the currently selected items.
24
- */
25
- this.value = computed(() => this._itemsToValue(this._selectedItems()));
26
- /**
27
- * Returns true if at least one item is highlighted, otherwise false.
28
- */
29
- this.isAnyItemHighlighted = computed(() => this._highlightedItems().length > 0);
30
- /**
31
- * Returns true if the parent component defines the limit of concurrently selectable items and the amount of currently selected items matches that limit. Otherwise returns false.
32
- *
33
- * **TLDR**: true if `maxSelectedItems` is defined and the number of selected items matches that value.
34
- */
35
- this.isItemLimitReached = computed(() => {
36
- const msi = this._ardParentComp.maxSelectedItems();
37
- if (!this._ardParentComp.multiselectable() || !isDefined(msi)) {
38
- return false;
39
- }
40
- return msi <= this.selectedItems().length;
41
- });
42
- /**
43
- * Finds all highlightable items. An item is considered highlightable if it is **not** disabled.
44
- * @returns An array of all highlightable items.
45
- */
46
- this.highlightableItems = computed(() => this._items().filter(item => !item.disabled()));
47
- }
48
- /**
49
- * Maps an array of items into their values.
50
- * @param items The items to convert to value.
51
- * @returns An array of item values.
52
- */
53
- _itemsToValue(items) {
54
- return items.map(item => item.value());
55
- }
56
- /**
57
- * Sets the component's items. Takes into account the values defined by the parent component for `valueFrom`, `labelFrom`, and `disabledFrom`.
58
- * @param items An array of items to be set as the component's items.
59
- * @returns true if at least one of the items is of primitive type, otherwise false.
60
- */
61
- setItems(items) {
62
- let areItemsPrimitive = false;
63
- if (items.some(isPrimitive)) {
64
- items = items.map(this._primitiveItemsMapFn);
65
- areItemsPrimitive = true;
66
- }
67
- this._items.set(items.map((item, index) => {
68
- return this._setItemsMapFn(item, index, areItemsPrimitive);
69
- }));
70
- }
71
- _primitiveItemsMapFn(item) {
72
- return { value: item };
73
- }
74
- _setItemsMapFn(rawItemData, index, areItemsPrimitive) {
75
- if (areItemsPrimitive) {
76
- return {
77
- itemData: signal(rawItemData),
78
- index: index,
79
- value: signal(rawItemData.value),
80
- label: signal(rawItemData.value?.toString?.() ?? String(rawItemData.value)),
81
- disabled: signal(false),
82
- selected: signal(false),
83
- highlighted: signal(false),
84
- };
85
- }
86
- //get value
87
- const valuePath = this._ardParentComp.valueFrom() ?? this._ardParentComp.labelFrom() ?? this._ardParentComp.DEFAULTS.valueFrom;
88
- const value = resolvePath(rawItemData, valuePath);
89
- //get label
90
- const labelPath = this._ardParentComp.labelFrom() ?? this._ardParentComp.valueFrom() ?? this._ardParentComp.DEFAULTS.labelFrom;
91
- const label = resolvePath(rawItemData, labelPath) ?? value;
92
- //get disabled
93
- const disabledPath = this._ardParentComp.disabledFrom() ?? this._ardParentComp.DEFAULTS.disabledFrom;
94
- let disabled = evaluate(resolvePath(rawItemData, disabledPath));
95
- if (this._ardParentComp.invertDisabled()) {
96
- disabled = !disabled;
97
- }
98
- //return
99
- return {
100
- itemData: signal(rawItemData),
101
- index: index,
102
- value: signal(value),
103
- label: signal(label?.toString?.() ?? String(label)),
104
- disabled: signal(disabled),
105
- selected: signal(false),
106
- highlighted: signal(false),
107
- };
108
- }
109
- /**
110
- * Writes a new value to the item storage. Selects the correct items based on the provided values, warning the user if the value is not found.
111
- * @param ngModel The value of the ngModel to set.
112
- */
113
- writeValue(ngModel) {
114
- this._forceUnselectAll();
115
- if (!this._validateWriteValue(ngModel))
116
- return;
117
- const selectItemByValue = (value) => {
118
- if (value === null || value === undefined) {
119
- this.unselectAll();
120
- return;
121
- }
122
- const item = this.findItemByValue(value);
123
- if (item) {
124
- this.selectItem(item);
125
- return;
126
- }
127
- console.error(`ARD-WA${this._ardParentComp._componentId}3: Couldn't find an item with value ${value?.toString?.() || String(value)}.`);
128
- };
129
- if (this._ardParentComp.multiselectable()) {
130
- for (const modelValue of ngModel) {
131
- selectItemByValue(modelValue);
132
- }
133
- }
134
- else {
135
- selectItemByValue(ngModel);
136
- }
137
- }
138
- _validateSingleElementType(item) {
139
- if (!isDefined(this._ardParentComp.compareWith()) && isObject(item) && this._ardParentComp.valueFrom()) {
140
- if (!this._ardParentComp.multiselectable() && Array.isArray(item)) {
141
- console.error(`ARD-FT${this._ardParentComp._componentId}0s: a non-multiselectable <ard-${this._ardParentComp._componentName}> expects its value not to be an array, got "[${item}]". If the value is supposed to be an array, use [compareWith].`);
142
- return false;
143
- }
144
- let jsonItemString = `${item}`;
145
- try {
146
- jsonItemString = JSON.stringify(item);
147
- }
148
- catch (error) {
149
- /* ignore */
150
- }
151
- console.error(`ARD-FT${this._ardParentComp._componentId}2: Setting object ${jsonItemString} as your value with [valueFrom] is not allowed unless [compareWith] is used.`);
152
- return false;
153
- }
154
- return true;
155
- }
156
- /**
157
- * Validates that all values of the value to be written are able to be accurately compared against the storage items.
158
- *
159
- * An item from the ngModel array is considered valid if it is a primitive value, or if all of the below points are met:
160
- * 1. The parent component defines the `compareWith` property.
161
- * 2. The ngModel value item is an object (or array).
162
- * 3. The parent component has a defined `valueFrom` property.
163
- * @param ngModel The value of ngModel to validate.
164
- * @returns true if all items are valid, otherwise false.
165
- */
166
- _validateWriteValue(ngModel) {
167
- if (this._ardParentComp.multiselectable()) {
168
- if (!isArray(ngModel)) {
169
- throw new Error(`ARD-FT${this._ardParentComp._componentId}0m: a multiselectable <ard-${this._ardParentComp._componentName}> expects its value to be an array, got "${ngModel}".`);
170
- }
171
- return ngModel.every(v => this._validateSingleElementType(v));
172
- }
173
- return this._validateSingleElementType(ngModel);
174
- }
175
- findItemByValue(valueToFind) {
176
- let findBy;
177
- const cmpFn = this._ardParentComp.compareWith();
178
- if (isDefined(cmpFn)) {
179
- findBy = item => cmpFn(valueToFind, item.value());
180
- }
181
- else {
182
- findBy = item => item.value() === valueToFind;
183
- }
184
- return this._items().find(item => findBy(item));
185
- }
186
- /**
187
- * Unselects all selected items.
188
- *
189
- * If the parent component requires at least one value to be selected at all times, the first selected items is left selected.
190
- * @returns An array of items cleared, mapped to only their values.
191
- */
192
- unselectAll() {
193
- for (const item of this._selectedItems()) {
194
- item.selected.set(false);
195
- }
196
- const ret = this.value();
197
- if (this._ardParentComp.isValueRequired() && this._selectedItems().length > 0) {
198
- this._selectedItems().first().selected.set(true);
199
- ret.splice(0, 1);
200
- }
201
- this._selectedItems.set([]);
202
- return ret;
203
- }
204
- /**
205
- * Unselects all selected items, no matter what the component settings are.
206
- * @returns An array of items cleared, mapped to only their values.
207
- */
208
- _forceUnselectAll() {
209
- for (const item of this._selectedItems()) {
210
- item.selected.set(false);
211
- }
212
- const ret = this._itemsToValue(this._selectedItems());
213
- this._selectedItems.set([]);
214
- return ret;
215
- }
216
- /**
217
- * Selects one or multiple items.
218
- *
219
- * Accounts for the limit of concurrently selected items defined by the parent component.
220
- * @param items A rest operator array of item objects to be selected.
221
- * @returns A tuple containing three arrays, all mapped to only their values:
222
- * - An array of items selected,
223
- * - An array of items unselected,
224
- * - An array of items failed to select due to the limit.
225
- */
226
- selectItem(...items) {
227
- if (this.isItemLimitReached()) {
228
- return [[], [], this._itemsToValue(items)];
229
- }
230
- let unselected = [];
231
- if (!this._ardParentComp.multiselectable()) {
232
- unselected = this._forceUnselectAll();
233
- }
234
- let itemsSelectedCount = 0;
235
- const itemsSelected = [];
236
- for (const item of items) {
237
- itemsSelectedCount++;
238
- if (item.selected())
239
- continue;
240
- if (this.isItemLimitReached()) {
241
- break;
242
- }
243
- item.selected.set(true);
244
- itemsSelected.push(item);
245
- }
246
- this._selectedItems.update(v => [...v, ...itemsSelected]);
247
- const itemsFailedToSelect = items.slice(itemsSelectedCount - 1);
248
- return [this._itemsToValue(itemsSelected), unselected, this._itemsToValue(itemsFailedToSelect)];
249
- }
250
- /**
251
- *
252
- * @param items A rest operator array of item objects to be unselected.
253
- * @returns An array of items unselected, mapped to only their values.
254
- */
255
- unselectItem(...items) {
256
- let skippedItem = false;
257
- for (const item of items) {
258
- if (this._ardParentComp.isValueRequired() && !skippedItem) {
259
- skippedItem = true;
260
- continue;
261
- }
262
- if (!item.selected())
263
- continue;
264
- item.selected.set(false);
265
- }
266
- this._selectedItems.update(v => v.filter(v => v.selected()));
267
- return this._itemsToValue(items);
268
- }
269
- /**
270
- * Unhighlights all currently highlighted items.
271
- */
272
- unhighlightAll() {
273
- for (const item of this._highlightedItems()) {
274
- item.highlighted.set(false);
275
- }
276
- this._highlightedItems.set([]);
277
- }
278
- /**
279
- * Highlights the given item, while unhighlighting all other items. Does nothing when the item is disabled.
280
- * @param item The item to be highlighted.
281
- * @returns The highlighted item.
282
- */
283
- highlightSingleItem(item) {
284
- if (!item || item.disabled())
285
- return null;
286
- this.unhighlightAll();
287
- return this.highlightItem(item);
288
- }
289
- /**
290
- * Highlights all given items.
291
- * @param items A rest operator array of items to be highlighted.
292
- * @returns The last highlighted item.
293
- */
294
- highlightItem(...items) {
295
- for (const item of items) {
296
- item.highlighted.set(true);
297
- }
298
- this._highlightedItems.update(v => [...v, ...items]);
299
- return items.last();
300
- }
301
- /**
302
- * Unhighlights all given items.
303
- * @param items A rest operator array of items to be unhighlighted.
304
- */
305
- unhighlightItem(...items) {
306
- for (const item of items) {
307
- if (!item || !item.highlighted())
308
- return;
309
- item.highlighted.set(false);
310
- }
311
- this._highlightedItems.update(v => v.filter(v => v.highlighted()));
312
- }
313
- /**
314
- * Highlights the first item out of all items.
315
- * @returns The highlighted item.
316
- */
317
- highlightFirstItem() {
318
- this.unhighlightAll();
319
- const itemToHighlight = this.highlightableItems().first();
320
- return this.highlightItem(itemToHighlight);
321
- }
322
- /**
323
- * Highlights the last item out of all items.
324
- * @returns The highlighted item.
325
- */
326
- highlightLastItem() {
327
- this.unhighlightAll();
328
- const itemToHighlight = this.highlightableItems().last();
329
- return this.highlightItem(itemToHighlight);
330
- }
331
- /**
332
- * Highlights all non-disabled items.
333
- */
334
- highlightAllItems() {
335
- const itemsToHighlight = this.highlightableItems();
336
- this.highlightItem(...itemsToHighlight);
337
- }
338
- /**
339
- * Highlights the next non-disabled item defined by the offset amount.
340
- *
341
- * If `hasShift` is set to true, all originally highlighted items are kept. Otherwise, all original items are unselected.
342
- * @param offset The amount of items to offset the highlight by.
343
- * @param hasShift Whether the user has the shift key pressed.
344
- * @returns The item highlighted.
345
- */
346
- highlightNextItem(offset, hasShift) {
347
- if (!this.isAnyItemHighlighted()) {
348
- return this.highlightFirstItem();
349
- }
350
- const currentItem = this.highlightedItems().last();
351
- const itemsWithoutDisabled = this._items().filter(item => !item.disabled() && (!this.isItemLimitReached() || item.selected()));
352
- const currentIndexInItems = itemsWithoutDisabled.findIndex(item => item.index === currentItem.index);
353
- let nextItemIndex = currentIndexInItems + offset;
354
- if (nextItemIndex >= itemsWithoutDisabled.length) {
355
- nextItemIndex -= itemsWithoutDisabled.length;
356
- }
357
- if (nextItemIndex < 0) {
358
- nextItemIndex += itemsWithoutDisabled.length;
359
- }
360
- const itemToHighlight = itemsWithoutDisabled[nextItemIndex];
361
- if (hasShift && this._ardParentComp.multiselectable()) {
362
- if (itemToHighlight.highlighted()) {
363
- this.unhighlightItem(currentItem);
364
- }
365
- return this.highlightItem(itemToHighlight);
366
- }
367
- return this.highlightSingleItem(itemToHighlight);
368
- }
369
- }
370
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWl0ZW0tc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvX2ludGVybmFsL2l0ZW0tc3RvcmFnZXMvc2ltcGxlLWl0ZW0tc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUF1QmxGLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFBNkIsY0FBcUM7UUFBckMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBSmpELFdBQU0sR0FBRyxNQUFNLENBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFHLE1BQU0sQ0FBb0IsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxNQUFNLENBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBSWhFOztXQUVHO1FBQ00sVUFBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEU7O1dBRUc7UUFDTSxrQkFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUQ7O1dBRUc7UUFDTSxVQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQVUzRTs7V0FFRztRQUNNLHlCQUFvQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVB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LElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQzVFLENBQUM7UUFDRixNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJHLElBQUksYUFBYSxHQUFHLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztRQUNqRCxJQUFJLGFBQWEsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxhQUFhLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixhQUFhLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1FBQy9DLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU1RCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDdEQsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBTUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIGNvbXB1dGVkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICdyZXNvbHZlLW9iamVjdC1wYXRoJztcclxuaW1wb3J0IHsgZXZhbHVhdGUsIGlzQXJyYXksIGlzRGVmaW5lZCwgaXNPYmplY3QsIGlzUHJpbWl0aXZlIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBBcmRPcHRpb25TaW1wbGUsIENvbXBhcmVXaXRoRm4gfSBmcm9tICcuLi8uLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xyXG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RvcmFnZUhvc3REZWZhdWx0cyB7XHJcbiAgdmFsdWVGcm9tOiBzdHJpbmc7XHJcbiAgbGFiZWxGcm9tOiBzdHJpbmc7XHJcbiAgZGlzYWJsZWRGcm9tOiBzdHJpbmc7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVJdGVtU3RvcmFnZUhvc3Qge1xyXG4gIHJlYWRvbmx5IHZhbHVlRnJvbTogU2lnbmFsPE51bGxhYmxlPHN0cmluZz4+O1xyXG4gIHJlYWRvbmx5IGxhYmVsRnJvbTogU2lnbmFsPE51bGxhYmxlPHN0cmluZz4+O1xyXG4gIHJlYWRvbmx5IGRpc2FibGVkRnJvbTogU2lnbmFsPE51bGxhYmxlPHN0cmluZz4+O1xyXG4gIHJlYWRvbmx5IGludmVydERpc2FibGVkOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgcmVhZG9ubHkgREVGQVVMVFM6IEl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzO1xyXG4gIHJlYWRvbmx5IGNvbXBhcmVXaXRoOiBTaWduYWw8TnVsbGFibGU8Q29tcGFyZVdpdGhGbj4+O1xyXG4gIHJlYWRvbmx5IG11bHRpc2VsZWN0YWJsZTogU2lnbmFsPGJvb2xlYW4+O1xyXG4gIHJlYWRvbmx5IGlzVmFsdWVSZXF1aXJlZDogU2lnbmFsPGJvb2xlYW4+O1xyXG4gIHJlYWRvbmx5IG1heFNlbGVjdGVkSXRlbXM6IFNpZ25hbDxOdWxsYWJsZTxudW1iZXI+PjtcclxuICByZWFkb25seSBfY29tcG9uZW50SWQ6IHN0cmluZztcclxuICByZWFkb25seSBfY29tcG9uZW50TmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2ltcGxlSXRlbVN0b3JhZ2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2l0ZW1zID0gc2lnbmFsPEFyZE9wdGlvblNpbXBsZVtdPihbXSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaGlnaGxpZ2h0ZWRJdGVtcyA9IHNpZ25hbDxBcmRPcHRpb25TaW1wbGVbXT4oW10pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGVkSXRlbXMgPSBzaWduYWw8QXJkT3B0aW9uU2ltcGxlW10+KFtdKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfYXJkUGFyZW50Q29tcDogU2ltcGxlSXRlbVN0b3JhZ2VIb3N0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBpdGVtcy5cclxuICAgKi9cclxuICByZWFkb25seSBpdGVtcyA9IHRoaXMuX2l0ZW1zLmFzUmVhZG9ubHkoKTtcclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaGlnaGxpZ2h0ZWRJdGVtcyA9IHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMuYXNSZWFkb25seSgpO1xyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcy5cclxuICAgKi9cclxuICByZWFkb25seSBzZWxlY3RlZEl0ZW1zID0gdGhpcy5fc2VsZWN0ZWRJdGVtcy5hc1JlYWRvbmx5KCk7XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgdmFsdWVzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgdmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fc2VsZWN0ZWRJdGVtcygpKSk7XHJcbiAgLyoqXHJcbiAgICogTWFwcyBhbiBhcnJheSBvZiBpdGVtcyBpbnRvIHRoZWlyIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGNvbnZlcnQgdG8gdmFsdWUuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaXRlbSB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaXRlbXNUb1ZhbHVlKGl0ZW1zOiBBcmRPcHRpb25TaW1wbGVbXSk6IGFueVtdIHtcclxuICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBpdGVtIGlzIGhpZ2hsaWdodGVkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaXNBbnlJdGVtSGlnaGxpZ2h0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zKCkubGVuZ3RoID4gMCk7XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJlbnQgY29tcG9uZW50IGRlZmluZXMgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RhYmxlIGl0ZW1zIGFuZCB0aGUgYW1vdW50IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBtYXRjaGVzIHRoYXQgbGltaXQuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxyXG4gICAqXHJcbiAgICogKipUTERSKio6IHRydWUgaWYgYG1heFNlbGVjdGVkSXRlbXNgIGlzIGRlZmluZWQgYW5kIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGF0IHZhbHVlLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlzSXRlbUxpbWl0UmVhY2hlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IG1zaSA9IHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgaWYgKCF0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSgpIHx8ICFpc0RlZmluZWQobXNpKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbXNpIDw9IHRoaXMuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aDtcclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgY29tcG9uZW50J3MgaXRlbXMuIFRha2VzIGludG8gYWNjb3VudCB0aGUgdmFsdWVzIGRlZmluZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnQgZm9yIGB2YWx1ZUZyb21gLCBgbGFiZWxGcm9tYCwgYW5kIGBkaXNhYmxlZEZyb21gLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBpdGVtcyB0byBiZSBzZXQgYXMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBpdGVtcyBpcyBvZiBwcmltaXRpdmUgdHlwZSwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAqL1xyXG4gIHNldEl0ZW1zKGl0ZW1zOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgIGxldCBhcmVJdGVtc1ByaW1pdGl2ZSA9IGZhbHNlO1xyXG4gICAgaWYgKGl0ZW1zLnNvbWUoaXNQcmltaXRpdmUpKSB7XHJcbiAgICAgIGl0ZW1zID0gaXRlbXMubWFwKHRoaXMuX3ByaW1pdGl2ZUl0ZW1zTWFwRm4pO1xyXG4gICAgICBhcmVJdGVtc1ByaW1pdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXRlbXMuc2V0KFxyXG4gICAgICBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldEl0ZW1zTWFwRm4oaXRlbSwgaW5kZXgsIGFyZUl0ZW1zUHJpbWl0aXZlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3ByaW1pdGl2ZUl0ZW1zTWFwRm48VD4oaXRlbTogVCk6IHsgdmFsdWU6IFQgfSB7XHJcbiAgICByZXR1cm4geyB2YWx1ZTogaXRlbSB9O1xyXG4gIH1cclxuICBwcml2YXRlIF9zZXRJdGVtc01hcEZuKHJhd0l0ZW1EYXRhOiBhbnksIGluZGV4OiBudW1iZXIsIGFyZUl0ZW1zUHJpbWl0aXZlOiBib29sZWFuKTogQXJkT3B0aW9uU2ltcGxlIHtcclxuICAgIGlmIChhcmVJdGVtc1ByaW1pdGl2ZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGl0ZW1EYXRhOiBzaWduYWwocmF3SXRlbURhdGEpLFxyXG4gICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICB2YWx1ZTogc2lnbmFsKHJhd0l0ZW1EYXRhLnZhbHVlKSxcclxuICAgICAgICBsYWJlbDogc2lnbmFsKHJhd0l0ZW1EYXRhLnZhbHVlPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKHJhd0l0ZW1EYXRhLnZhbHVlKSksXHJcbiAgICAgICAgZGlzYWJsZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgICAgc2VsZWN0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgICAgaGlnaGxpZ2h0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvL2dldCB2YWx1ZVxyXG4gICAgY29uc3QgdmFsdWVQYXRoID1cclxuICAgICAgdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLmxhYmVsRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMudmFsdWVGcm9tO1xyXG4gICAgY29uc3QgdmFsdWUgPSByZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgdmFsdWVQYXRoKTtcclxuXHJcbiAgICAvL2dldCBsYWJlbFxyXG4gICAgY29uc3QgbGFiZWxQYXRoID1cclxuICAgICAgdGhpcy5fYXJkUGFyZW50Q29tcC5sYWJlbEZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLnZhbHVlRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMubGFiZWxGcm9tO1xyXG4gICAgY29uc3QgbGFiZWwgPSByZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgbGFiZWxQYXRoKSA/PyB2YWx1ZTtcclxuXHJcbiAgICAvL2dldCBkaXNhYmxlZFxyXG4gICAgY29uc3QgZGlzYWJsZWRQYXRoID0gdGhpcy5fYXJkUGFyZW50Q29tcC5kaXNhYmxlZEZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLmRpc2FibGVkRnJvbTtcclxuICAgIGxldCBkaXNhYmxlZCA9IGV2YWx1YXRlKHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBkaXNhYmxlZFBhdGgpKTtcclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmludmVydERpc2FibGVkKCkpIHtcclxuICAgICAgZGlzYWJsZWQgPSAhZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9yZXR1cm5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1EYXRhOiBzaWduYWwocmF3SXRlbURhdGEpLFxyXG4gICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgIHZhbHVlOiBzaWduYWwodmFsdWUpLFxyXG4gICAgICBsYWJlbDogc2lnbmFsKGxhYmVsPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKGxhYmVsKSksXHJcbiAgICAgIGRpc2FibGVkOiBzaWduYWwoZGlzYWJsZWQpLFxyXG4gICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgaGlnaGxpZ2h0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICB9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBXcml0ZXMgYSBuZXcgdmFsdWUgdG8gdGhlIGl0ZW0gc3RvcmFnZS4gU2VsZWN0cyB0aGUgY29ycmVjdCBpdGVtcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsdWVzLCB3YXJuaW5nIHRoZSB1c2VyIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuXHJcbiAgICogQHBhcmFtIG5nTW9kZWwgVGhlIHZhbHVlIG9mIHRoZSBuZ01vZGVsIHRvIHNldC5cclxuICAgKi9cclxuICB3cml0ZVZhbHVlKG5nTW9kZWw6IGFueVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZVVuc2VsZWN0QWxsKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl92YWxpZGF0ZVdyaXRlVmFsdWUobmdNb2RlbCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RJdGVtQnlWYWx1ZSA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5maW5kSXRlbUJ5VmFsdWUodmFsdWUpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgYEFSRC1XQSR7dGhpcy5fYXJkUGFyZW50Q29tcC5fY29tcG9uZW50SWR9MzogQ291bGRuJ3QgZmluZCBhbiBpdGVtIHdpdGggdmFsdWUgJHt2YWx1ZT8udG9TdHJpbmc/LigpIHx8IFN0cmluZyh2YWx1ZSl9LmBcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAubXVsdGlzZWxlY3RhYmxlKCkpIHtcclxuICAgICAgZm9yIChjb25zdCBtb2RlbFZhbHVlIG9mIG5nTW9kZWwpIHtcclxuICAgICAgICBzZWxlY3RJdGVtQnlWYWx1ZShtb2RlbFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0SXRlbUJ5VmFsdWUobmdNb2RlbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWxpZGF0ZVNpbmdsZUVsZW1lbnRUeXBlKGl0ZW06IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuX2FyZFBhcmVudENvbXAuY29tcGFyZVdpdGgoKSkgJiYgaXNPYmplY3QoaXRlbSkgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKSkge1xyXG4gICAgICBpZiAoIXRoaXMuX2FyZFBhcmVudENvbXAubXVsdGlzZWxlY3RhYmxlKCkgJiYgQXJyYXkuaXNBcnJheShpdGVtKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgQVJELUZUJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnRJZH0wczogYSBub24tbXVsdGlzZWxlY3RhYmxlIDxhcmQtJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnROYW1lfT4gZXhwZWN0cyBpdHMgdmFsdWUgbm90IHRvIGJlIGFuIGFycmF5LCBnb3QgXCJbJHtpdGVtfV1cIi4gSWYgdGhlIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIGFuIGFycmF5LCB1c2UgW2NvbXBhcmVXaXRoXS5gXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBqc29uSXRlbVN0cmluZyA9IGAke2l0ZW19YDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBqc29uSXRlbVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGl0ZW0pO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8qIGlnbm9yZSAqL1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgIGBBUkQtRlQke3RoaXMuX2FyZFBhcmVudENvbXAuX2NvbXBvbmVudElkfTI6IFNldHRpbmcgb2JqZWN0ICR7anNvbkl0ZW1TdHJpbmd9IGFzIHlvdXIgdmFsdWUgd2l0aCBbdmFsdWVGcm9tXSBpcyBub3QgYWxsb3dlZCB1bmxlc3MgW2NvbXBhcmVXaXRoXSBpcyB1c2VkLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyB0aGF0IGFsbCB2YWx1ZXMgb2YgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gYXJlIGFibGUgdG8gYmUgYWNjdXJhdGVseSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzdG9yYWdlIGl0ZW1zLlxyXG4gICAqXHJcbiAgICogQW4gaXRlbSBmcm9tIHRoZSBuZ01vZGVsIGFycmF5IGlzIGNvbnNpZGVyZWQgdmFsaWQgaWYgaXQgaXMgYSBwcmltaXRpdmUgdmFsdWUsIG9yIGlmIGFsbCBvZiB0aGUgYmVsb3cgcG9pbnRzIGFyZSBtZXQ6XHJcbiAgICogMS4gVGhlIHBhcmVudCBjb21wb25lbnQgZGVmaW5lcyB0aGUgYGNvbXBhcmVXaXRoYCBwcm9wZXJ0eS5cclxuICAgKiAyLiBUaGUgbmdNb2RlbCB2YWx1ZSBpdGVtIGlzIGFuIG9iamVjdCAob3IgYXJyYXkpLlxyXG4gICAqIDMuIFRoZSBwYXJlbnQgY29tcG9uZW50IGhhcyBhIGRlZmluZWQgYHZhbHVlRnJvbWAgcHJvcGVydHkuXHJcbiAgICogQHBhcmFtIG5nTW9kZWwgVGhlIHZhbHVlIG9mIG5nTW9kZWwgdG8gdmFsaWRhdGUuXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGVXcml0ZVZhbHVlKG5nTW9kZWw6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSgpKSB7XHJcbiAgICAgIGlmICghaXNBcnJheShuZ01vZGVsKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGBBUkQtRlQke3RoaXMuX2FyZFBhcmVudENvbXAuX2NvbXBvbmVudElkfTBtOiBhIG11bHRpc2VsZWN0YWJsZSA8YXJkLSR7dGhpcy5fYXJkUGFyZW50Q29tcC5fY29tcG9uZW50TmFtZX0+IGV4cGVjdHMgaXRzIHZhbHVlIHRvIGJlIGFuIGFycmF5LCBnb3QgXCIke25nTW9kZWx9XCIuYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5nTW9kZWwuZXZlcnkodiA9PiB0aGlzLl92YWxpZGF0ZVNpbmdsZUVsZW1lbnRUeXBlKHYpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVNpbmdsZUVsZW1lbnRUeXBlKG5nTW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgZmluZEl0ZW1CeVZhbHVlKHZhbHVlVG9GaW5kOiBhbnkpOiBBcmRPcHRpb25TaW1wbGUgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGZpbmRCeTogKGl0ZW06IEFyZE9wdGlvblNpbXBsZSkgPT4gYm9vbGVhbjtcclxuICAgIGNvbnN0IGNtcEZuID0gdGhpcy5fYXJkUGFyZW50Q29tcC5jb21wYXJlV2l0aCgpO1xyXG4gICAgaWYgKGlzRGVmaW5lZChjbXBGbikpIHtcclxuICAgICAgZmluZEJ5ID0gaXRlbSA9PiBjbXBGbih2YWx1ZVRvRmluZCwgaXRlbS52YWx1ZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbmRCeSA9IGl0ZW0gPT4gaXRlbS52YWx1ZSgpID09PSB2YWx1ZVRvRmluZDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pdGVtcygpLmZpbmQoaXRlbSA9PiBmaW5kQnkoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5zZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcy5cclxuICAgKlxyXG4gICAqIElmIHRoZSBwYXJlbnQgY29tcG9uZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0byBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXMsIHRoZSBmaXJzdCBzZWxlY3RlZCBpdGVtcyBpcyBsZWZ0IHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cclxuICAgKi9cclxuICB1bnNlbGVjdEFsbCgpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcygpKSB7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXQgPSB0aGlzLnZhbHVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaXNWYWx1ZVJlcXVpcmVkKCkgJiYgdGhpcy5fc2VsZWN0ZWRJdGVtcygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcygpLmZpcnN0KCkuc2VsZWN0ZWQuc2V0KHRydWUpO1xyXG4gICAgICByZXQuc3BsaWNlKDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMuc2V0KFtdKTtcclxuXHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVbnNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zLCBubyBtYXR0ZXIgd2hhdCB0aGUgY29tcG9uZW50IHNldHRpbmdzIGFyZS5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpdGVtcyBjbGVhcmVkLCBtYXBwZWQgdG8gb25seSB0aGVpciB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZm9yY2VVbnNlbGVjdEFsbCgpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcygpKSB7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXQgPSB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fc2VsZWN0ZWRJdGVtcygpKTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnNldChbXSk7XHJcblxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2VsZWN0cyBvbmUgb3IgbXVsdGlwbGUgaXRlbXMuXHJcbiAgICpcclxuICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBvYmplY3RzIHRvIGJlIHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEEgdHVwbGUgY29udGFpbmluZyB0aHJlZSBhcnJheXMsIGFsbCBtYXBwZWQgdG8gb25seSB0aGVpciB2YWx1ZXM6XHJcbiAgICogLSBBbiBhcnJheSBvZiBpdGVtcyBzZWxlY3RlZCxcclxuICAgKiAtIEFuIGFycmF5IG9mIGl0ZW1zIHVuc2VsZWN0ZWQsXHJcbiAgICogLSBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0IGR1ZSB0byB0aGUgbGltaXQuXHJcbiAgICovXHJcbiAgc2VsZWN0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uU2ltcGxlW10pOiBbYW55W10sIGFueVtdLCBhbnlbXV0ge1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKCkpIHtcclxuICAgICAgcmV0dXJuIFtbXSwgW10sIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtcyldO1xyXG4gICAgfVxyXG4gICAgbGV0IHVuc2VsZWN0ZWQgPSBbXTtcclxuICAgIGlmICghdGhpcy5fYXJkUGFyZW50Q29tcC5tdWx0aXNlbGVjdGFibGUoKSkge1xyXG4gICAgICB1bnNlbGVjdGVkID0gdGhpcy5fZm9yY2VVbnNlbGVjdEFsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpdGVtc1NlbGVjdGVkQ291bnQgPSAwO1xyXG4gICAgY29uc3QgaXRlbXNTZWxlY3RlZDogQXJkT3B0aW9uU2ltcGxlW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpdGVtc1NlbGVjdGVkQ291bnQrKztcclxuICAgICAgaWYgKGl0ZW0uc2VsZWN0ZWQoKSkgY29udGludWU7XHJcbiAgICAgIGlmICh0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCgpKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5zZWxlY3RlZC5zZXQodHJ1ZSk7XHJcbiAgICAgIGl0ZW1zU2VsZWN0ZWQucHVzaChpdGVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMudXBkYXRlKHYgPT4gWy4uLnYsIC4uLml0ZW1zU2VsZWN0ZWRdKTtcclxuXHJcbiAgICBjb25zdCBpdGVtc0ZhaWxlZFRvU2VsZWN0ID0gaXRlbXMuc2xpY2UoaXRlbXNTZWxlY3RlZENvdW50IC0gMSk7XHJcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1NlbGVjdGVkKSwgdW5zZWxlY3RlZCwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zRmFpbGVkVG9TZWxlY3QpXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXRlbXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gb2JqZWN0cyB0byBiZSB1bnNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIHVuc2VsZWN0ZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cclxuICAgKi9cclxuICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvblNpbXBsZVtdKTogYW55W10ge1xyXG4gICAgbGV0IHNraXBwZWRJdGVtID0gZmFsc2U7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaXNWYWx1ZVJlcXVpcmVkKCkgJiYgIXNraXBwZWRJdGVtKSB7XHJcbiAgICAgICAgc2tpcHBlZEl0ZW0gPSB0cnVlO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWl0ZW0uc2VsZWN0ZWQoKSkgY29udGludWU7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMudXBkYXRlKHYgPT4gdi5maWx0ZXIodiA9PiB2LnNlbGVjdGVkKCkpKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVuaGlnaGxpZ2h0cyBhbGwgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zLlxyXG4gICAqL1xyXG4gIHVuaGlnaGxpZ2h0QWxsKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMoKSkge1xyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLnNldChbXSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIGdpdmVuIGl0ZW0sIHdoaWxlIHVuaGlnaGxpZ2h0aW5nIGFsbCBvdGhlciBpdGVtcy4gRG9lcyBub3RoaW5nIHdoZW4gdGhlIGl0ZW0gaXMgZGlzYWJsZWQuXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYmUgaGlnaGxpZ2h0ZWQuXHJcbiAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtOiBBcmRPcHRpb25TaW1wbGUpOiBBcmRPcHRpb25TaW1wbGUgfCBudWxsIHtcclxuICAgIGlmICghaXRlbSB8fCBpdGVtLmRpc2FibGVkKCkpIHJldHVybiBudWxsO1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyBhbGwgZ2l2ZW4gaXRlbXMuXHJcbiAgICogQHBhcmFtIGl0ZW1zIEEgcmVzdCBvcGVyYXRvciBhcnJheSBvZiBpdGVtcyB0byBiZSBoaWdobGlnaHRlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgbGFzdCBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvblNpbXBsZVtdKTogQXJkT3B0aW9uU2ltcGxlIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldCh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMudXBkYXRlKHYgPT4gWy4uLnYsIC4uLml0ZW1zXSk7XHJcbiAgICByZXR1cm4gaXRlbXMubGFzdCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVbmhpZ2hsaWdodHMgYWxsIGdpdmVuIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdW5oaWdobGlnaHRlZC5cclxuICAgKi9cclxuICB1bmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvblNpbXBsZVtdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmhpZ2hsaWdodGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMudXBkYXRlKHYgPT4gdi5maWx0ZXIodiA9PiB2LmhpZ2hsaWdodGVkKCkpKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyB0aGUgZmlyc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodEZpcnN0SXRlbSgpOiBBcmRPcHRpb25TaW1wbGUgfCBudWxsIHtcclxuICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcclxuXHJcbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSB0aGlzLmhpZ2hsaWdodGFibGVJdGVtcygpLmZpcnN0KCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIGxhc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodExhc3RJdGVtKCk6IEFyZE9wdGlvblNpbXBsZSB8IG51bGwge1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuaGlnaGxpZ2h0YWJsZUl0ZW1zKCkubGFzdCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIGFsbCBub24tZGlzYWJsZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0QWxsSXRlbXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5oaWdobGlnaHRhYmxlSXRlbXMoKTtcclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXNUb0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIG5leHQgbm9uLWRpc2FibGVkIGl0ZW0gZGVmaW5lZCBieSB0aGUgb2Zmc2V0IGFtb3VudC5cclxuICAgKlxyXG4gICAqIElmIGBoYXNTaGlmdGAgaXMgc2V0IHRvIHRydWUsIGFsbCBvcmlnaW5hbGx5IGhpZ2hsaWdodGVkIGl0ZW1zIGFyZSBrZXB0LiBPdGhlcndpc2UsIGFsbCBvcmlnaW5hbCBpdGVtcyBhcmUgdW5zZWxlY3RlZC5cclxuICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgb2YgaXRlbXMgdG8gb2Zmc2V0IHRoZSBoaWdobGlnaHQgYnkuXHJcbiAgICogQHBhcmFtIGhhc1NoaWZ0IFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBzaGlmdCBrZXkgcHJlc3NlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSBoaWdobGlnaHRlZC5cclxuICAgKi9cclxuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkT3B0aW9uU2ltcGxlIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuaXNBbnlJdGVtSGlnaGxpZ2h0ZWQoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gdGhpcy5oaWdobGlnaHRlZEl0ZW1zKCkubGFzdCgpO1xyXG4gICAgY29uc3QgaXRlbXNXaXRob3V0RGlzYWJsZWQgPSB0aGlzLl9pdGVtcygpLmZpbHRlcihcclxuICAgICAgaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCgpICYmICghdGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQoKSB8fCBpdGVtLnNlbGVjdGVkKCkpXHJcbiAgICApO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4SW5JdGVtcyA9IGl0ZW1zV2l0aG91dERpc2FibGVkLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaW5kZXggPT09IGN1cnJlbnRJdGVtLmluZGV4KTtcclxuXHJcbiAgICBsZXQgbmV4dEl0ZW1JbmRleCA9IGN1cnJlbnRJbmRleEluSXRlbXMgKyBvZmZzZXQ7XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA+PSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGgpIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCAtPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA8IDApIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCArPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSBpdGVtc1dpdGhvdXREaXNhYmxlZFtuZXh0SXRlbUluZGV4XTtcclxuXHJcbiAgICBpZiAoaGFzU2hpZnQgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC5tdWx0aXNlbGVjdGFibGUoKSkge1xyXG4gICAgICBpZiAoaXRlbVRvSGlnaGxpZ2h0LmhpZ2hsaWdodGVkKCkpIHtcclxuICAgICAgICB0aGlzLnVuaGlnaGxpZ2h0SXRlbShjdXJyZW50SXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaW5kcyBhbGwgaGlnaGxpZ2h0YWJsZSBpdGVtcy4gQW4gaXRlbSBpcyBjb25zaWRlcmVkIGhpZ2hsaWdodGFibGUgaWYgaXQgaXMgKipub3QqKiBkaXNhYmxlZC5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgaGlnaGxpZ2h0YWJsZSBpdGVtcy5cclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodGFibGVJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSkpO1xyXG59XHJcbiJdfQ==
@@ -1,157 +0,0 @@
1
- import { computed, signal } from '@angular/core';
2
- import { resolvePath } from 'resolve-object-path';
3
- import { any, isDefined, isPrimitive } from 'simple-bool';
4
- export class SimplestItemStorage {
5
- constructor(_ardParentComp) {
6
- this._ardParentComp = _ardParentComp;
7
- this._items = signal([]);
8
- this._highlightedItem = signal(null);
9
- /**
10
- * Gets all items.
11
- */
12
- this.items = this._items.asReadonly();
13
- /**
14
- * The currently highlighted item.
15
- */
16
- this.highlightedItem = this._highlightedItem.asReadonly();
17
- /**
18
- * True if at least one item is highlighted, otherwise false.
19
- */
20
- this.isAnyItemHighlighted = computed(() => isDefined(this._highlightedItem()));
21
- }
22
- /**
23
- * Sets the component's items. Takes into account the values defined by the parent component for `suggValueFrom` and `suggLabelFrom`.
24
- * @param items An array of items to be set as the component's items.
25
- * @returns true if at least one of the items is of primitive type, otherwise false.
26
- */
27
- setItems(items) {
28
- let areItemsPrimitive = false;
29
- if (any(items, isPrimitive)) {
30
- items = items.map(this._primitiveItemsMapFn);
31
- areItemsPrimitive = true;
32
- }
33
- this._items.set(items.map((item, index) => {
34
- return this._setItemsMapFn(item, index, areItemsPrimitive);
35
- }));
36
- }
37
- _primitiveItemsMapFn(item) {
38
- return { value: item };
39
- }
40
- _setItemsMapFn(rawItemData, index, areItemsPrimitive) {
41
- if (areItemsPrimitive) {
42
- return {
43
- itemData: signal(rawItemData),
44
- index: index,
45
- value: signal(rawItemData.value),
46
- label: signal(rawItemData.value?.toString?.() ?? String(rawItemData.value)),
47
- selected: signal(false),
48
- highlighted: signal(false),
49
- };
50
- }
51
- //get value
52
- const valuePath = this._ardParentComp.valueFrom() ?? this._ardParentComp.labelFrom() ?? this._ardParentComp.DEFAULTS.suggValueFrom;
53
- const value = resolvePath(rawItemData, valuePath);
54
- //get label
55
- const labelPath = this._ardParentComp.labelFrom() ?? this._ardParentComp.valueFrom() ?? this._ardParentComp.DEFAULTS.suggLabelFrom;
56
- const label = resolvePath(rawItemData, labelPath) ?? value;
57
- //return
58
- return {
59
- itemData: signal(rawItemData),
60
- index: index,
61
- value: signal(value),
62
- label: signal(label?.toString?.() ?? String(label)),
63
- selected: signal(false),
64
- highlighted: signal(false),
65
- };
66
- }
67
- /**
68
- * Selects the given item.
69
- * @param items The item to select.
70
- * @returns The value of the selected item.
71
- */
72
- selectItem(item) {
73
- return item.value;
74
- }
75
- selectCurrent() {
76
- const hi = this._highlightedItem();
77
- if (!hi)
78
- return undefined;
79
- return this.selectItem(hi);
80
- }
81
- /**
82
- * Unhighlights all currently highlighted items.
83
- */
84
- unhighlightCurrent() {
85
- const hi = this._highlightedItem();
86
- if (hi) {
87
- hi.highlighted.set(false);
88
- }
89
- this._highlightedItem.set(null);
90
- }
91
- /**
92
- * Highlights a given item.
93
- * @param item The item to be highlighted.
94
- */
95
- highlightItem(item) {
96
- this.unhighlightCurrent();
97
- item.highlighted.set(true);
98
- this._highlightedItem.set(item);
99
- }
100
- /**
101
- * Unhighlights a given item.
102
- * @param item The item to be unhighlighted.
103
- */
104
- unhighlightItem(item) {
105
- item.highlighted.set(false);
106
- if (this._highlightedItem()?.index === item.index)
107
- this._highlightedItem.set(null);
108
- }
109
- /**
110
- * Highlights the first item out of all items.
111
- * @returns The highlighted item.
112
- */
113
- highlightFirstItem() {
114
- if (!this._items().length)
115
- return null;
116
- this.unhighlightCurrent();
117
- const itemToHighlight = this._items().first();
118
- this.highlightItem(itemToHighlight);
119
- return itemToHighlight;
120
- }
121
- /**
122
- * Highlights the last item out of all items.
123
- * @returns The highlighted item.
124
- */
125
- highlightLastItem() {
126
- if (!this._items().length)
127
- return null;
128
- this.unhighlightCurrent();
129
- const itemToHighlight = this._items().last();
130
- this.highlightItem(itemToHighlight);
131
- return itemToHighlight;
132
- }
133
- /**
134
- * Highlights the next non-disabled item defined by the offset amount.
135
- * @param offset The amount of items to offset the highlight by.
136
- * @returns The item highlighted.
137
- */
138
- highlightNextItem(offset) {
139
- const currentItem = this._highlightedItem();
140
- if (!currentItem) {
141
- return this.highlightFirstItem();
142
- }
143
- const items = this._items();
144
- const currentIndexInItems = items.findIndex(item => item.index === currentItem.index);
145
- let nextItemIndex = currentIndexInItems + offset;
146
- if (nextItemIndex >= items.length) {
147
- nextItemIndex -= items.length;
148
- }
149
- else if (nextItemIndex < 0) {
150
- nextItemIndex += items.length;
151
- }
152
- const itemToHighlight = items[nextItemIndex];
153
- this.highlightItem(itemToHighlight);
154
- return itemToHighlight;
155
- }
156
- }
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlc3QtaXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9faW50ZXJuYWwvaXRlbS1zdG9yYWdlcy9zaW1wbGVzdC1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWMxRCxNQUFNLE9BQU8sbUJBQW1CO0lBSTlCLFlBQTZCLGNBQXVDO1FBQXZDLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQUhuRCxXQUFNLEdBQUcsTUFBTSxDQUEyQixFQUFFLENBQUMsQ0FBQztRQUM5QyxxQkFBZ0IsR0FBRyxNQUFNLENBQW1DLElBQUksQ0FBQyxDQUFDO1FBSW5GOztXQUVHO1FBQ00sVUFBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxvQkFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5RDs7V0FFRztRQUNNLHlCQUFvQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBYlosQ0FBQztJQWV4RTs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEtBQVk7UUFDbkIsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9C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QWUsQ0FBQyxDQUFDO1FBRXBDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsTUFBYztRQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRGLElBQUksYUFBYSxHQUFHLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztRQUNqRCxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsYUFBYSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLGFBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVwQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIGNvbXB1dGVkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICdyZXNvbHZlLW9iamVjdC1wYXRoJztcclxuaW1wb3J0IHsgYW55LCBpc0RlZmluZWQsIGlzUHJpbWl0aXZlIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBBcmRTaW1wbGVzdFN0b3JhZ2VJdGVtIH0gZnJvbSAnLi4vLi4vdHlwZXMvaXRlbS1zdG9yYWdlLnR5cGVzJztcclxuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlcy91dGlsaXR5LnR5cGVzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlc3RJdGVtU3RvcmFnZUhvc3REZWZhdWx0cyB7XHJcbiAgc3VnZ1ZhbHVlRnJvbTogc3RyaW5nO1xyXG4gIHN1Z2dMYWJlbEZyb206IHN0cmluZztcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZXN0SXRlbVN0b3JhZ2VIb3N0IHtcclxuICByZWFkb25seSB2YWx1ZUZyb206IFNpZ25hbDxOdWxsYWJsZTxzdHJpbmc+PjtcclxuICByZWFkb25seSBsYWJlbEZyb206IFNpZ25hbDxOdWxsYWJsZTxzdHJpbmc+PjtcclxuICByZWFkb25seSBERUZBVUxUUzogU2ltcGxlc3RJdGVtU3RvcmFnZUhvc3REZWZhdWx0cztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZXN0SXRlbVN0b3JhZ2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2l0ZW1zID0gc2lnbmFsPEFyZFNpbXBsZXN0U3RvcmFnZUl0ZW1bXT4oW10pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hpZ2hsaWdodGVkSXRlbSA9IHNpZ25hbDxOdWxsYWJsZTxBcmRTaW1wbGVzdFN0b3JhZ2VJdGVtPj4obnVsbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2FyZFBhcmVudENvbXA6IFNpbXBsZXN0SXRlbVN0b3JhZ2VIb3N0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBpdGVtcy5cclxuICAgKi9cclxuICByZWFkb25seSBpdGVtcyA9IHRoaXMuX2l0ZW1zLmFzUmVhZG9ubHkoKTtcclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaGlnaGxpZ2h0ZWRJdGVtID0gdGhpcy5faGlnaGxpZ2h0ZWRJdGVtLmFzUmVhZG9ubHkoKTtcclxuICAvKipcclxuICAgKiBUcnVlIGlmIGF0IGxlYXN0IG9uZSBpdGVtIGlzIGhpZ2hsaWdodGVkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaXNBbnlJdGVtSGlnaGxpZ2h0ZWQgPSBjb21wdXRlZCgoKSA9PiBpc0RlZmluZWQodGhpcy5faGlnaGxpZ2h0ZWRJdGVtKCkpKTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgY29tcG9uZW50J3MgaXRlbXMuIFRha2VzIGludG8gYWNjb3VudCB0aGUgdmFsdWVzIGRlZmluZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnQgZm9yIGBzdWdnVmFsdWVGcm9tYCBhbmQgYHN1Z2dMYWJlbEZyb21gLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBpdGVtcyB0byBiZSBzZXQgYXMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBpdGVtcyBpcyBvZiBwcmltaXRpdmUgdHlwZSwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAqL1xyXG4gIHNldEl0ZW1zKGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgbGV0IGFyZUl0ZW1zUHJpbWl0aXZlID0gZmFsc2U7XHJcbiAgICBpZiAoYW55KGl0ZW1zLCBpc1ByaW1pdGl2ZSkpIHtcclxuICAgICAgaXRlbXMgPSBpdGVtcy5tYXAodGhpcy5fcHJpbWl0aXZlSXRlbXNNYXBGbik7XHJcbiAgICAgIGFyZUl0ZW1zUHJpbWl0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pdGVtcy5zZXQoXHJcbiAgICAgIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0SXRlbXNNYXBGbihpdGVtLCBpbmRleCwgYXJlSXRlbXNQcmltaXRpdmUpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcHJpbWl0aXZlSXRlbXNNYXBGbjxUPihpdGVtOiBUKTogeyB2YWx1ZTogVCB9IHtcclxuICAgIHJldHVybiB7IHZhbHVlOiBpdGVtIH07XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldEl0ZW1zTWFwRm4ocmF3SXRlbURhdGE6IGFueSwgaW5kZXg6IG51bWJlciwgYXJlSXRlbXNQcmltaXRpdmU6IGJvb2xlYW4pOiBBcmRTaW1wbGVzdFN0b3JhZ2VJdGVtIHtcclxuICAgIGlmIChhcmVJdGVtc1ByaW1pdGl2ZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGl0ZW1EYXRhOiBzaWduYWwocmF3SXRlbURhdGEpLFxyXG4gICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICB2YWx1ZTogc2lnbmFsKHJhd0l0ZW1EYXRhLnZhbHVlKSxcclxuICAgICAgICBsYWJlbDogc2lnbmFsKHJhd0l0ZW1EYXRhLnZhbHVlPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKHJhd0l0ZW1EYXRhLnZhbHVlKSksXHJcbiAgICAgICAgc2VsZWN0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgICAgaGlnaGxpZ2h0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvL2dldCB2YWx1ZVxyXG4gICAgY29uc3QgdmFsdWVQYXRoID1cclxuICAgICAgdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLmxhYmVsRnJvbSgpID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMuc3VnZ1ZhbHVlRnJvbTtcclxuICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHZhbHVlUGF0aCk7XHJcblxyXG4gICAgLy9nZXQgbGFiZWxcclxuICAgIGNvbnN0IGxhYmVsUGF0aCA9XHJcbiAgICAgIHRoaXMuX2FyZFBhcmVudENvbXAubGFiZWxGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKSA/PyB0aGlzLl9hcmRQYXJlbnRDb21wLkRFRkFVTFRTLnN1Z2dMYWJlbEZyb207XHJcbiAgICBjb25zdCBsYWJlbCA9IHJlc29sdmVQYXRoKHJhd0l0ZW1EYXRhLCBsYWJlbFBhdGgpID8/IHZhbHVlO1xyXG5cclxuICAgIC8vcmV0dXJuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtRGF0YTogc2lnbmFsKHJhd0l0ZW1EYXRhKSxcclxuICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICB2YWx1ZTogc2lnbmFsKHZhbHVlKSxcclxuICAgICAgbGFiZWw6IHNpZ25hbChsYWJlbD8udG9TdHJpbmc/LigpID8/IFN0cmluZyhsYWJlbCkpLFxyXG4gICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgaGlnaGxpZ2h0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaXRlbS5cclxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW0gdG8gc2VsZWN0LlxyXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgaXRlbS5cclxuICAgKi9cclxuICBzZWxlY3RJdGVtKGl0ZW06IEFyZFNpbXBsZXN0U3RvcmFnZUl0ZW0pOiBhbnkge1xyXG4gICAgcmV0dXJuIGl0ZW0udmFsdWU7XHJcbiAgfVxyXG4gIHNlbGVjdEN1cnJlbnQoKTogYW55IHtcclxuICAgIGNvbnN0IGhpID0gdGhpcy5faGlnaGxpZ2h0ZWRJdGVtKCk7XHJcbiAgICBpZiAoIWhpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0SXRlbShoaSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbmhpZ2hsaWdodHMgYWxsIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtcy5cclxuICAgKi9cclxuICB1bmhpZ2hsaWdodEN1cnJlbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBoaSA9IHRoaXMuX2hpZ2hsaWdodGVkSXRlbSgpO1xyXG4gICAgaWYgKGhpKSB7XHJcbiAgICAgIGhpLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZEl0ZW0uc2V0KG51bGwpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIGEgZ2l2ZW4gaXRlbS5cclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBiZSBoaWdobGlnaHRlZC5cclxuICAgKi9cclxuICBoaWdobGlnaHRJdGVtKGl0ZW06IEFyZFNpbXBsZXN0U3RvcmFnZUl0ZW0pOiB2b2lkIHtcclxuICAgIHRoaXMudW5oaWdobGlnaHRDdXJyZW50KCk7XHJcblxyXG4gICAgaXRlbS5oaWdobGlnaHRlZC5zZXQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtLnNldChpdGVtKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVW5oaWdobGlnaHRzIGEgZ2l2ZW4gaXRlbS5cclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBiZSB1bmhpZ2hsaWdodGVkLlxyXG4gICAqL1xyXG4gIHVuaGlnaGxpZ2h0SXRlbShpdGVtOiBBcmRTaW1wbGVzdFN0b3JhZ2VJdGVtKTogdm9pZCB7XHJcbiAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2hpZ2hsaWdodGVkSXRlbSgpPy5pbmRleCA9PT0gaXRlbS5pbmRleCkgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtLnNldChudWxsKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyB0aGUgZmlyc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodEZpcnN0SXRlbSgpOiBBcmRTaW1wbGVzdFN0b3JhZ2VJdGVtIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuX2l0ZW1zKCkubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB0aGlzLnVuaGlnaGxpZ2h0Q3VycmVudCgpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuX2l0ZW1zKCkuZmlyc3QoKTtcclxuICAgIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG5cclxuICAgIHJldHVybiBpdGVtVG9IaWdobGlnaHQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIGxhc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodExhc3RJdGVtKCk6IEFyZFNpbXBsZXN0U3RvcmFnZUl0ZW0gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5faXRlbXMoKS5sZW5ndGgpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMudW5oaWdobGlnaHRDdXJyZW50KCk7XHJcblxyXG4gICAgY29uc3QgaXRlbVRvSGlnaGxpZ2h0ID0gdGhpcy5faXRlbXMoKS5sYXN0KCk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbVRvSGlnaGxpZ2h0KTtcclxuXHJcbiAgICByZXR1cm4gaXRlbVRvSGlnaGxpZ2h0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIHRoZSBuZXh0IG5vbi1kaXNhYmxlZCBpdGVtIGRlZmluZWQgYnkgdGhlIG9mZnNldCBhbW91bnQuXHJcbiAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IG9mIGl0ZW1zIHRvIG9mZnNldCB0aGUgaGlnaGxpZ2h0IGJ5LlxyXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIGhpZ2hsaWdodGVkLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodE5leHRJdGVtKG9mZnNldDogbnVtYmVyKTogQXJkU2ltcGxlc3RTdG9yYWdlSXRlbSB8IG51bGwge1xyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLl9oaWdobGlnaHRlZEl0ZW0oKTtcclxuICAgIGlmICghY3VycmVudEl0ZW0pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0Rmlyc3RJdGVtKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zKCk7XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJbkl0ZW1zID0gaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pbmRleCA9PT0gY3VycmVudEl0ZW0uaW5kZXgpO1xyXG5cclxuICAgIGxldCBuZXh0SXRlbUluZGV4ID0gY3VycmVudEluZGV4SW5JdGVtcyArIG9mZnNldDtcclxuICAgIGlmIChuZXh0SXRlbUluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBuZXh0SXRlbUluZGV4IC09IGl0ZW1zLmxlbmd0aDtcclxuICAgIH0gZWxzZSBpZiAobmV4dEl0ZW1JbmRleCA8IDApIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCArPSBpdGVtcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSBpdGVtc1tuZXh0SXRlbUluZGV4XTtcclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbVRvSGlnaGxpZ2h0KTtcclxuXHJcbiAgICByZXR1cm4gaXRlbVRvSGlnaGxpZ2h0O1xyXG4gIH1cclxufVxyXG4iXX0=