@ethlete/cdk 2.4.0 → 2.5.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 (227) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +3 -3
  3. package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +3 -3
  4. package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +3 -3
  5. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +3 -3
  6. package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +3 -3
  7. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +3 -3
  8. package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +3 -3
  9. package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +3 -3
  10. package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +3 -3
  11. package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +3 -3
  12. package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +3 -3
  13. package/esm2022/lib/components/button/components/button/button.component.mjs +3 -3
  14. package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +3 -3
  15. package/esm2022/lib/components/button/directives/button/button.directive.mjs +3 -3
  16. package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +3 -3
  17. package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +3 -3
  18. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +3 -3
  19. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -3
  20. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +3 -3
  21. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +3 -3
  22. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +3 -3
  23. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +3 -3
  24. package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +3 -3
  25. package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -3
  26. package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +3 -3
  27. package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +3 -3
  28. package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +3 -3
  29. package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +3 -3
  30. package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +3 -3
  31. package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +3 -3
  32. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +3 -3
  33. package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +3 -3
  34. package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +3 -3
  35. package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +3 -3
  36. package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +3 -3
  37. package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +3 -3
  38. package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +3 -3
  39. package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +3 -3
  40. package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +3 -3
  41. package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +3 -3
  42. package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +3 -3
  43. package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +3 -3
  44. package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +3 -3
  45. package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +3 -3
  46. package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +3 -3
  47. package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +3 -3
  48. package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +3 -3
  49. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +4 -5
  50. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +3 -3
  51. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +3 -3
  52. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +3 -3
  53. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +3 -3
  54. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +3 -3
  55. package/esm2022/lib/components/forms/components/select/components/combobox/combobox.imports.mjs +12 -0
  56. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +556 -0
  57. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/public-api.mjs +2 -0
  58. package/esm2022/lib/components/forms/components/select/components/combobox/components/index.mjs +2 -0
  59. package/esm2022/lib/components/forms/components/select/components/combobox/components/public-api.mjs +2 -0
  60. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +26 -0
  61. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/public-api.mjs +2 -0
  62. package/esm2022/lib/components/forms/components/select/components/combobox/directives/public-api.mjs +2 -0
  63. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +49 -0
  64. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/public-api.mjs +2 -0
  65. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +64 -0
  66. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/index.mjs +2 -0
  67. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/public-api.mjs +2 -0
  68. package/esm2022/lib/components/forms/components/select/components/combobox/partials/index.mjs +2 -0
  69. package/esm2022/lib/components/forms/components/select/components/combobox/partials/public-api.mjs +3 -0
  70. package/esm2022/lib/components/forms/components/select/components/combobox/public-api.mjs +4 -0
  71. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +3 -3
  72. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +3 -3
  73. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +3 -3
  74. package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +3 -3
  75. package/esm2022/lib/components/forms/components/select/components/public-api.mjs +2 -1
  76. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +18 -31
  77. package/esm2022/lib/components/forms/components/select/components/select/directives/index.mjs +2 -0
  78. package/esm2022/lib/components/forms/components/select/components/select/directives/public-api.mjs +4 -0
  79. package/esm2022/lib/components/forms/components/select/components/select/directives/select/index.mjs +2 -0
  80. package/esm2022/lib/components/forms/components/select/components/select/directives/select/public-api.mjs +2 -0
  81. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +449 -0
  82. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/index.mjs +2 -0
  83. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/public-api.mjs +2 -0
  84. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +61 -0
  85. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/index.mjs +2 -0
  86. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/public-api.mjs +2 -0
  87. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +121 -0
  88. package/esm2022/lib/components/forms/components/select/components/select/partials/public-api.mjs +1 -2
  89. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +22 -7
  90. package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +14 -8
  91. package/esm2022/lib/components/forms/components/select/components/select/public-api.mjs +2 -1
  92. package/esm2022/lib/components/forms/components/select/components/select/select.imports.mjs +2 -3
  93. package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +3 -3
  94. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +3 -3
  95. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +3 -3
  96. package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +3 -3
  97. package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +3 -3
  98. package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +3 -3
  99. package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +3 -3
  100. package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +3 -3
  101. package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +3 -3
  102. package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +3 -3
  103. package/esm2022/lib/components/forms/directives/input/input.directive.mjs +47 -32
  104. package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +3 -3
  105. package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +3 -3
  106. package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +3 -3
  107. package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -3
  108. package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +3 -3
  109. package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +3 -3
  110. package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +3 -3
  111. package/esm2022/lib/components/forms/services/form-field-state.service.mjs +3 -3
  112. package/esm2022/lib/components/forms/services/form-group-state.service.mjs +3 -3
  113. package/esm2022/lib/components/forms/services/input-state.service.mjs +3 -3
  114. package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +3 -3
  115. package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +4 -4
  116. package/esm2022/lib/components/forms/utils/input.base.mjs +8 -8
  117. package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +3 -3
  118. package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +3 -3
  119. package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +3 -3
  120. package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +3 -3
  121. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +3 -3
  122. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +3 -3
  123. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +3 -3
  124. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +3 -3
  125. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +3 -3
  126. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +3 -3
  127. package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +3 -3
  128. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +3 -3
  129. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +3 -3
  130. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +3 -3
  131. package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +3 -3
  132. package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +3 -3
  133. package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +3 -3
  134. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +3 -3
  135. package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +3 -3
  136. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +3 -3
  137. package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +3 -3
  138. package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +3 -3
  139. package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +3 -3
  140. package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +3 -3
  141. package/esm2022/lib/components/picture/picture-data.directive.mjs +3 -3
  142. package/esm2022/lib/components/picture/picture.component.mjs +3 -3
  143. package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +3 -3
  144. package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +3 -3
  145. package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +3 -3
  146. package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +3 -3
  147. package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +3 -3
  148. package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +3 -3
  149. package/esm2022/lib/components/sort/services/sort-header-intl.mjs +3 -3
  150. package/esm2022/lib/components/table/components/table/table.component.mjs +3 -3
  151. package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +3 -3
  152. package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +3 -3
  153. package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +3 -3
  154. package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +3 -3
  155. package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +3 -3
  156. package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +3 -3
  157. package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +3 -3
  158. package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +3 -3
  159. package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +3 -3
  160. package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +3 -3
  161. package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +3 -3
  162. package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +3 -3
  163. package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +3 -3
  164. package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +3 -3
  165. package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +3 -3
  166. package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +3 -3
  167. package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +3 -3
  168. package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +3 -3
  169. package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +3 -3
  170. package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +3 -3
  171. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +3 -3
  172. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +3 -3
  173. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +3 -3
  174. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +3 -3
  175. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +3 -3
  176. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +3 -3
  177. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +3 -3
  178. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +3 -3
  179. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +3 -3
  180. package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +3 -3
  181. package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +3 -3
  182. package/esm2022/lib/services/swipe-handler.service.mjs +3 -3
  183. package/fesm2022/ethlete-cdk.mjs +1999 -729
  184. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  185. package/lib/components/forms/components/select/components/combobox/combobox.imports.d.ts +5 -0
  186. package/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.d.ts +84 -0
  187. package/lib/components/forms/components/select/components/combobox/components/combobox/public-api.d.ts +1 -0
  188. package/lib/components/forms/components/select/components/combobox/components/index.d.ts +1 -0
  189. package/lib/components/forms/components/select/components/combobox/components/public-api.d.ts +1 -0
  190. package/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.d.ts +7 -0
  191. package/lib/components/forms/components/select/components/combobox/directives/combobox/public-api.d.ts +1 -0
  192. package/lib/components/forms/components/select/components/combobox/directives/public-api.d.ts +1 -0
  193. package/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.d.ts +16 -0
  194. package/lib/components/forms/components/select/components/combobox/partials/combobox-body/public-api.d.ts +1 -0
  195. package/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.d.ts +16 -0
  196. package/lib/components/forms/components/select/components/combobox/partials/combobox-option/index.d.ts +1 -0
  197. package/lib/components/forms/components/select/components/combobox/partials/combobox-option/public-api.d.ts +1 -0
  198. package/lib/components/forms/components/select/components/combobox/partials/index.d.ts +1 -0
  199. package/lib/components/forms/components/select/components/combobox/partials/public-api.d.ts +2 -0
  200. package/lib/components/forms/components/select/components/combobox/public-api.d.ts +3 -0
  201. package/lib/components/forms/components/select/components/public-api.d.ts +1 -0
  202. package/lib/components/forms/components/select/components/select/components/select/select.component.d.ts +8 -11
  203. package/lib/components/forms/components/select/components/select/directives/index.d.ts +1 -0
  204. package/lib/components/forms/components/select/components/select/directives/public-api.d.ts +3 -0
  205. package/lib/components/forms/components/select/components/select/directives/select/index.d.ts +1 -0
  206. package/lib/components/forms/components/select/components/select/directives/select/public-api.d.ts +1 -0
  207. package/lib/components/forms/components/select/components/select/directives/select/select.directive.d.ts +95 -0
  208. package/lib/components/forms/components/select/components/select/directives/select-body/index.d.ts +1 -0
  209. package/lib/components/forms/components/select/components/select/directives/select-body/public-api.d.ts +1 -0
  210. package/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.d.ts +14 -0
  211. package/lib/components/forms/components/select/components/select/directives/select-option/index.d.ts +1 -0
  212. package/lib/components/forms/components/select/components/select/directives/select-option/public-api.d.ts +1 -0
  213. package/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.d.ts +29 -0
  214. package/lib/components/forms/components/select/components/select/partials/public-api.d.ts +0 -1
  215. package/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.d.ts +6 -1
  216. package/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.d.ts +4 -1
  217. package/lib/components/forms/components/select/components/select/public-api.d.ts +1 -0
  218. package/lib/components/forms/components/select/components/select/select.imports.d.ts +2 -2
  219. package/lib/components/forms/components/slider/components/slider/slider.component.d.ts +1 -1
  220. package/lib/components/forms/directives/input/input.directive.d.ts +3 -1
  221. package/lib/components/forms/utils/decorated-input.base.d.ts +1 -1
  222. package/lib/components/forms/utils/input.base.d.ts +2 -4
  223. package/package.json +5 -5
  224. package/esm2022/lib/components/forms/components/select/components/select/partials/tree-select-option/public-api.mjs +0 -2
  225. package/esm2022/lib/components/forms/components/select/components/select/partials/tree-select-option/tree-select-option.component.mjs +0 -23
  226. package/lib/components/forms/components/select/components/select/partials/tree-select-option/public-api.d.ts +0 -1
  227. package/lib/components/forms/components/select/components/select/partials/tree-select-option/tree-select-option.component.d.ts +0 -5
@@ -0,0 +1,556 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import { DOWN_ARROW, ENTER, ESCAPE, TAB, UP_ARROW } from '@angular/cdk/keycodes';
3
+ import { AsyncPipe, NgFor, NgIf } from '@angular/common';
4
+ import { ChangeDetectionStrategy, Component, EventEmitter, InjectionToken, Input, Output, ViewEncapsulation, inject, isDevMode, } from '@angular/core';
5
+ import { AnimatedOverlayDirective, LetDirective, clone } from '@ethlete/core';
6
+ import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, map, of, shareReplay, skip, takeUntil, tap, throwError, } from 'rxjs';
7
+ import { ChevronIconComponent } from '../../../../../../../icons';
8
+ import { INPUT_TOKEN, InputDirective, NativeInputRefDirective } from '../../../../../../directives';
9
+ import { DecoratedInputBase } from '../../../../../../utils';
10
+ import { ComboboxBodyComponent } from '../../partials';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../../../../../directives/input/input.directive";
13
+ import * as i2 from "@ethlete/core";
14
+ export class RuntimeError extends Error {
15
+ constructor(code, message, data = '__ET_NO_DATA__') {
16
+ super(formatRuntimeError(code, message));
17
+ this.code = code;
18
+ this.data = data;
19
+ if (data !== '__ET_NO_DATA__') {
20
+ try {
21
+ const _data = clone(data);
22
+ setTimeout(() => {
23
+ console.error(_data);
24
+ }, 1);
25
+ }
26
+ catch {
27
+ setTimeout(() => {
28
+ console.error(data);
29
+ }, 1);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ export function formatRuntimeError(code, message) {
35
+ // prefix code with zeros if it's less than 100
36
+ const codeWithZeros = code < 10 ? `00${code}` : code < 100 ? `0${code}` : code;
37
+ const fullCode = `ET${codeWithZeros}`;
38
+ return `${fullCode}${message ? ': ' + message : ''}`;
39
+ }
40
+ const COMBOBOX_ERRORS = {
41
+ 1: 'Expected options to be an array of objects. This is due to "bindLabel" and "bindValue" being set.',
42
+ 2: 'Expected options to be an array of primitives. This is due to "bindLabel" and "bindValue" not being set or "allowCustomValues" being set to true.',
43
+ };
44
+ const comboboxError = (code, data) => {
45
+ const message = `<et-combobox>: ${COMBOBOX_ERRORS[code]}`;
46
+ throw new RuntimeError(code, message, data);
47
+ };
48
+ const isPrimitiveArray = (value) => {
49
+ if (!Array.isArray(value))
50
+ return false;
51
+ const first = value[0];
52
+ const last = value[value.length - 1];
53
+ if (!first || !last)
54
+ return false;
55
+ return typeof first !== 'object' && typeof last !== 'object';
56
+ };
57
+ const isObjectArray = (value) => {
58
+ if (!Array.isArray(value))
59
+ return false;
60
+ const first = value[0];
61
+ const last = value[value.length - 1];
62
+ if (!first || !last)
63
+ return false;
64
+ return typeof first === 'object' && typeof last === 'object';
65
+ };
66
+ const isEmptyArray = (value) => {
67
+ return Array.isArray(value) && value.length === 0;
68
+ };
69
+ const isObject = (value) => {
70
+ return typeof value === 'object' && value !== null;
71
+ };
72
+ const ComboboxOptionType = {
73
+ Primitive: 'primitive',
74
+ Object: 'object',
75
+ };
76
+ const ComboboxInputValueType = {
77
+ Single: 'single',
78
+ Array: 'array',
79
+ };
80
+ const getObjectProperty = (obj, prop) => {
81
+ const hasDotNotation = prop.includes('.');
82
+ if (!hasDotNotation)
83
+ return obj[prop];
84
+ const props = prop.split('.');
85
+ let value = obj;
86
+ for (const prop of props) {
87
+ if (!isObject(value))
88
+ return undefined;
89
+ value = value[prop];
90
+ }
91
+ return value;
92
+ };
93
+ export const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_TOKEN');
94
+ class ComboboxComponent extends DecoratedInputBase {
95
+ //#endregion
96
+ //#region Inputs
97
+ get options() {
98
+ return this._options$.value;
99
+ }
100
+ set options(value) {
101
+ this._options$.next(value);
102
+ }
103
+ get initialValue() {
104
+ return this._initialValue$.value;
105
+ }
106
+ set initialValue(value) {
107
+ this._initialValue$.next(value);
108
+ this._updateSelectedOptionsViaInitialValue();
109
+ }
110
+ get loading() {
111
+ return this._loading$.value;
112
+ }
113
+ set loading(value) {
114
+ this._loading$.next(coerceBooleanProperty(value));
115
+ }
116
+ get error() {
117
+ return this._error$.value;
118
+ }
119
+ set error(value) {
120
+ this._error$.next(value);
121
+ }
122
+ get placeholder() {
123
+ return this._placeholder$.value;
124
+ }
125
+ set placeholder(value) {
126
+ this._placeholder$.next(value);
127
+ }
128
+ get multiple() {
129
+ return this._multiple$.value;
130
+ }
131
+ set multiple(value) {
132
+ this._multiple$.next(coerceBooleanProperty(value));
133
+ }
134
+ get bindLabel() {
135
+ return this._bindLabel$.value;
136
+ }
137
+ set bindLabel(value) {
138
+ this._bindLabel$.next(value);
139
+ }
140
+ get bindValue() {
141
+ return this._bindValue$.value;
142
+ }
143
+ set bindValue(value) {
144
+ this._bindValue$.next(value);
145
+ }
146
+ get allowCustomValues() {
147
+ return this._allowCustomValues$.value;
148
+ }
149
+ set allowCustomValues(value) {
150
+ this._allowCustomValues$.next(coerceBooleanProperty(value));
151
+ }
152
+ //#endregion
153
+ //#region Members
154
+ get _rawSelectedOptions() {
155
+ return this._rawSelectedOptions$.value;
156
+ }
157
+ get _currentFilter() {
158
+ return this._currentFilter$.value;
159
+ }
160
+ get _isOpen() {
161
+ return this._animatedOverlay.isMounted;
162
+ }
163
+ //#endregion
164
+ //#region Lifecycle
165
+ constructor() {
166
+ super();
167
+ //#region Injects
168
+ this._input = inject(INPUT_TOKEN);
169
+ this._animatedOverlay = inject(AnimatedOverlayDirective);
170
+ this._options$ = new BehaviorSubject([]);
171
+ this.options$ = this._options$.asObservable();
172
+ this._initialValue$ = new BehaviorSubject(null);
173
+ this._loading$ = new BehaviorSubject(false);
174
+ this.loading$ = this._loading$.asObservable();
175
+ this._error$ = new BehaviorSubject(null);
176
+ this._placeholder$ = new BehaviorSubject(null);
177
+ this._multiple$ = new BehaviorSubject(false);
178
+ this._bindLabel$ = new BehaviorSubject(null);
179
+ this._bindValue$ = new BehaviorSubject(null);
180
+ this._allowCustomValues$ = new BehaviorSubject(false);
181
+ //#endregion
182
+ //#region Outputs
183
+ this.filterChange = new EventEmitter();
184
+ this._rawSelectedOptions$ = new BehaviorSubject([]);
185
+ this._currentFilter$ = new BehaviorSubject('');
186
+ this._isOpen$ = this._animatedOverlay.isMounted$;
187
+ //#endregion
188
+ //#region Computes
189
+ this._allOptions$ = combineLatest([this._options$, this._rawSelectedOptions$]).pipe(map(([options, rawSelectedOptions]) => [...options, ...rawSelectedOptions]), shareReplay({ bufferSize: 1, refCount: true }));
190
+ this.expectedOptionType$ = combineLatest([
191
+ this._bindLabel$,
192
+ this._bindValue$,
193
+ this._allowCustomValues$,
194
+ ]).pipe(map(([bindLabel, bindValue, allowCustomValues]) => {
195
+ const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
196
+ if (shouldBeObjects) {
197
+ return ComboboxOptionType.Object;
198
+ }
199
+ return ComboboxOptionType.Primitive;
200
+ }));
201
+ this.expectedInputValueType$ = this._multiple$.pipe(map((multiple) => (multiple ? ComboboxInputValueType.Array : ComboboxInputValueType.Single)));
202
+ this.selectedOptions$ = combineLatest([
203
+ this._input.value$,
204
+ this.expectedInputValueType$,
205
+ this._allOptions$,
206
+ ]).pipe(map(([inputValue, expectedInputValueType, allOptions]) => {
207
+ if (expectedInputValueType === ComboboxInputValueType.Single) {
208
+ if (Array.isArray(inputValue)) {
209
+ return [];
210
+ }
211
+ const option = this._findOptionByValue(inputValue, allOptions);
212
+ return [option];
213
+ }
214
+ else if (expectedInputValueType === ComboboxInputValueType.Array) {
215
+ if (!Array.isArray(inputValue)) {
216
+ return [];
217
+ }
218
+ const options = inputValue.map((value) => this._findOptionByValue(value, allOptions)).filter((v) => !!v);
219
+ if (!options.length)
220
+ return [];
221
+ return options;
222
+ }
223
+ return [];
224
+ }), map((options) => options.filter((v) => !!v)));
225
+ this._bindings.push({
226
+ attribute: 'class.et-combobox--loading',
227
+ observable: this._loading$,
228
+ });
229
+ this._bindings.push({
230
+ attribute: 'class.et-combobox--error',
231
+ observable: this._error$.pipe(map((v) => !!v)),
232
+ });
233
+ this._bindings.push({
234
+ attribute: 'class.et-combobox--open',
235
+ observable: this._isOpen$,
236
+ });
237
+ }
238
+ ngOnInit() {
239
+ this._initDispatchFilterChanges();
240
+ this._initRepositionOnValueChanges();
241
+ if (isDevMode()) {
242
+ this._debugValidateComboboxConfig();
243
+ }
244
+ }
245
+ //#endregion
246
+ //#region Public Methods
247
+ getOptionLabel(option) {
248
+ if (!this.bindLabel || !isObject(option)) {
249
+ return of(option);
250
+ }
251
+ return this._bindLabel$.pipe(map((label) => {
252
+ if (!label)
253
+ return option;
254
+ return getObjectProperty(option, label) ?? option;
255
+ }));
256
+ }
257
+ getOptionValue(option) {
258
+ if (!this.bindValue || !isObject(option)) {
259
+ return of(option);
260
+ }
261
+ return this._bindValue$.pipe(map((value) => {
262
+ if (!value)
263
+ return option;
264
+ return getObjectProperty(option, value) ?? option;
265
+ }));
266
+ }
267
+ removeSelectedOption(option) {
268
+ this.input._markAsTouched();
269
+ const selectedOptions = this._rawSelectedOptions;
270
+ const optionValue = this._getOptionValueSync(option);
271
+ const index = selectedOptions.findIndex((v) => {
272
+ const val = this._getOptionValueSync(v);
273
+ return val === optionValue;
274
+ });
275
+ if (index === -1)
276
+ return;
277
+ selectedOptions.splice(index, 1);
278
+ this._rawSelectedOptions$.next(selectedOptions);
279
+ this._removeOrClearInputValue(optionValue);
280
+ }
281
+ open() {
282
+ // if (!this._selectBodyConfig) return;
283
+ if (this._isOpen || this.input.disabled)
284
+ return;
285
+ // this._setSelectedOptionActive();
286
+ const instance = this._animatedOverlay.mount({
287
+ component: ComboboxBodyComponent,
288
+ mirrorWidth: true,
289
+ // data: { _bodyTemplate: this._selectBodyConfig.template },
290
+ });
291
+ if (!instance)
292
+ return;
293
+ // this._selectBodyId$.next(instance.selectBody.id);
294
+ }
295
+ close() {
296
+ if (!this._isOpen)
297
+ return;
298
+ this._animatedOverlay.unmount();
299
+ // this._selectBodyId$.next(null);
300
+ }
301
+ writeValueFromOption(option) {
302
+ this.input._markAsTouched();
303
+ const optionValue = this._getOptionValueSync(option);
304
+ if (this._findOptionByValue(optionValue, this._rawSelectedOptions)) {
305
+ if (this.multiple) {
306
+ this.removeSelectedOption(option);
307
+ this._removeOrClearInputValue(optionValue);
308
+ }
309
+ return;
310
+ }
311
+ this._setOrAddToInputValue(optionValue);
312
+ this._addSelectedOption(option);
313
+ if (!this.multiple) {
314
+ this.close();
315
+ this._setFilterFromInputValue();
316
+ }
317
+ }
318
+ isOptionSelected(option) {
319
+ return combineLatest([this._rawSelectedOptions$, this.getOptionValue(option)]).pipe(map(([selectedOptions, value]) => !!this._findOptionByValue(value, selectedOptions)));
320
+ }
321
+ //#endregion
322
+ //#region Protected Methods
323
+ processKeydownEvent(event) {
324
+ const keyCode = event.keyCode;
325
+ const isOpen = this._isOpen;
326
+ const isMultiple = this.multiple;
327
+ const canAddCustomValue = this.allowCustomValues;
328
+ const value = event.target.value;
329
+ const hasValue = !!value;
330
+ // The user typed a custom value and pressed enter. Add it to the selected options.
331
+ if (keyCode === ENTER && canAddCustomValue && hasValue) {
332
+ // Don't add the value if it already exists.
333
+ if (!this._findOptionByValue(value, this._rawSelectedOptions)) {
334
+ this._addSelectedOption(value);
335
+ this._setOrAddToInputValue(value);
336
+ }
337
+ if (this.multiple) {
338
+ this._updateFilter('');
339
+ }
340
+ return;
341
+ }
342
+ if (keyCode === ESCAPE) {
343
+ if (isOpen) {
344
+ this.close();
345
+ }
346
+ else {
347
+ if (!isMultiple) {
348
+ this._removeOrClearInputValue(null);
349
+ this._updateFilter('');
350
+ return;
351
+ }
352
+ }
353
+ }
354
+ if (keyCode === TAB) {
355
+ this.close();
356
+ return;
357
+ }
358
+ if (!isOpen) {
359
+ this.open();
360
+ }
361
+ if (keyCode === DOWN_ARROW) {
362
+ // TODO: Implement
363
+ }
364
+ if (keyCode === UP_ARROW) {
365
+ // TODO: Implement
366
+ }
367
+ }
368
+ processInputEvent(event) {
369
+ const value = event.target.value;
370
+ this._updateFilter(value);
371
+ }
372
+ handleBlurEvent() {
373
+ this.input._markAsTouched();
374
+ this.input._setShouldDisplayError(true);
375
+ if (this.multiple)
376
+ return;
377
+ if (this._currentFilter === '') {
378
+ this._removeOrClearInputValue(null);
379
+ return;
380
+ }
381
+ this._setFilterFromInputValue();
382
+ }
383
+ //#endregion
384
+ //#region Private Methods
385
+ _initDispatchFilterChanges() {
386
+ this._currentFilter$
387
+ .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
388
+ .subscribe();
389
+ }
390
+ _initRepositionOnValueChanges() {
391
+ this.input.valueChange$
392
+ .pipe(takeUntil(this._destroy$), debounceTime(0), tap(() => this._animatedOverlay._reposition()))
393
+ .subscribe();
394
+ }
395
+ _updateSelectedOptionsViaInitialValue() {
396
+ if (this.initialValue !== null && this.initialValue !== undefined) {
397
+ if (Array.isArray(this.initialValue)) {
398
+ this._addSelectedOptions(this.initialValue);
399
+ }
400
+ else {
401
+ this._addSelectedOption(this.initialValue);
402
+ }
403
+ }
404
+ }
405
+ _addSelectedOption(option) {
406
+ if (this.multiple) {
407
+ this._rawSelectedOptions$.next([...this._rawSelectedOptions, option]);
408
+ }
409
+ else {
410
+ this._rawSelectedOptions$.next([option]);
411
+ }
412
+ }
413
+ _addSelectedOptions(options) {
414
+ if (!this.multiple) {
415
+ return;
416
+ }
417
+ this._rawSelectedOptions$.next([...this._rawSelectedOptions, ...options]);
418
+ }
419
+ _findOptionByValue(value, allOptions) {
420
+ const option = allOptions.find((option) => {
421
+ if (isObject(option) && this.bindValue) {
422
+ return getObjectProperty(option, this.bindValue) === value;
423
+ }
424
+ return option === value;
425
+ });
426
+ return option;
427
+ }
428
+ _setOrAddToInputValue(value) {
429
+ if (this.multiple) {
430
+ if (Array.isArray(this._input.value)) {
431
+ this._input._updateValue([...this._input.value, value]);
432
+ }
433
+ else {
434
+ this._input._updateValue([value]);
435
+ }
436
+ }
437
+ else {
438
+ this._input._updateValue(value);
439
+ }
440
+ }
441
+ _removeOrClearInputValue(value) {
442
+ if (this.multiple) {
443
+ if (Array.isArray(this._input.value)) {
444
+ this._input._updateValue(this._input.value.filter((v) => v !== value));
445
+ }
446
+ else {
447
+ this._input._updateValue([]);
448
+ }
449
+ }
450
+ else {
451
+ this._input._updateValue(null);
452
+ }
453
+ }
454
+ _updateFilter(value) {
455
+ if (this.input.nativeInputRef && this.input.nativeInputRef.element.nativeElement.value !== value) {
456
+ this.input.nativeInputRef.element.nativeElement.value = value;
457
+ }
458
+ if (this._currentFilter === value)
459
+ return;
460
+ this._currentFilter$.next(value);
461
+ }
462
+ _getOptionValueSync(option) {
463
+ if (!this.bindValue || !isObject(option)) {
464
+ return option;
465
+ }
466
+ return getObjectProperty(option, this.bindValue) ?? option;
467
+ }
468
+ _getOptionLabelSync(option) {
469
+ if (!this.bindLabel || !isObject(option)) {
470
+ return option;
471
+ }
472
+ return getObjectProperty(option, this.bindLabel) ?? option;
473
+ }
474
+ _setFilterFromInputValue() {
475
+ if (this.multiple)
476
+ return;
477
+ const value = this.input.value;
478
+ if (!value || Array.isArray(value)) {
479
+ this._updateFilter('');
480
+ return;
481
+ }
482
+ const option = this._findOptionByValue(value, this._rawSelectedOptions);
483
+ if (!option)
484
+ return;
485
+ const label = this._getOptionLabelSync(option);
486
+ if (typeof label !== 'string')
487
+ return;
488
+ this._updateFilter(label);
489
+ }
490
+ //#endregion
491
+ //#region Dev mode
492
+ _debugValidateComboboxConfig(isRetry = false) {
493
+ this.expectedOptionType$
494
+ .pipe(skip(isRetry ? 1 : 0), // Skip if retrying to avoid infinite loop
495
+ debounceTime(0), takeUntil(this._destroy$), tap((expectedOptionType) => {
496
+ if (isEmptyArray(this.options)) {
497
+ return;
498
+ }
499
+ if (expectedOptionType === ComboboxOptionType.Object) {
500
+ if (!isObjectArray(this.options)) {
501
+ throw comboboxError(1, this.options);
502
+ }
503
+ }
504
+ else if (expectedOptionType === ComboboxOptionType.Primitive) {
505
+ if (!isPrimitiveArray(this.options)) {
506
+ throw comboboxError(2, this.options);
507
+ }
508
+ }
509
+ }), catchError((e) => {
510
+ this._debugValidateComboboxConfig(true);
511
+ return throwError(() => e);
512
+ }))
513
+ .subscribe();
514
+ }
515
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", inputs: { options: "options", initialValue: "initialValue", loading: "loading", error: "error", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", allowCustomValues: "allowCustomValues" }, outputs: { filterChange: "filterChange" }, host: { classAttribute: "et-combobox" }, providers: [
517
+ {
518
+ provide: COMBOBOX_TOKEN,
519
+ useExisting: ComboboxComponent,
520
+ },
521
+ ], usesInheritance: true, hostDirectives: [{ directive: i1.InputDirective }, { directive: i2.AnimatedOverlayDirective }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
522
+ }
523
+ export { ComboboxComponent };
524
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, decorators: [{
525
+ type: Component,
526
+ args: [{ selector: 'et-combobox', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
527
+ class: 'et-combobox',
528
+ }, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor], hostDirectives: [{ directive: InputDirective }, AnimatedOverlayDirective], providers: [
529
+ {
530
+ provide: COMBOBOX_TOKEN,
531
+ useExisting: ComboboxComponent,
532
+ },
533
+ ], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
534
+ }], ctorParameters: function () { return []; }, propDecorators: { options: [{
535
+ type: Input,
536
+ args: [{ required: true }]
537
+ }], initialValue: [{
538
+ type: Input
539
+ }], loading: [{
540
+ type: Input
541
+ }], error: [{
542
+ type: Input
543
+ }], placeholder: [{
544
+ type: Input
545
+ }], multiple: [{
546
+ type: Input
547
+ }], bindLabel: [{
548
+ type: Input
549
+ }], bindValue: [{
550
+ type: Input
551
+ }], allowCustomValues: [{
552
+ type: Input
553
+ }], filterChange: [{
554
+ type: Output
555
+ }] } });
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxJQUFJLEVBQ0osU0FB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LDBYQVBqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1NBQ0YsaUpDeEpILHE3QkE2QkEsMDFDRG9IWSxJQUFJLDZGQUFFLHVCQUF1QiwrSUFBRSxTQUFTLDhDQUFFLG9CQUFvQiw0REFBZ0IsS0FBSzs7U0FTbEYsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBbkI3QixTQUFTOytCQUNFLGFBQWEsY0FHWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLGFBQWE7cUJBQ3JCLFdBQ1EsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQzlFLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEVBQUUsd0JBQXdCLENBQUMsYUFDOUQ7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLFdBQVcsbUJBQW1CO3lCQUMvQjtxQkFDRjswRUFhRyxPQUFPO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVdyQixZQUFZO3NCQURmLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQVdGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBVUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFNBQVM7c0JBRFosS0FBSztnQkFVRixTQUFTO3NCQURaLEtBQUs7Z0JBVUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNhLFlBQVk7c0JBRDlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBUQUIsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlLCBMZXREaXJlY3RpdmUsIGNsb25lIH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgb2YsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IElOUFVUX1RPS0VOLCBJbnB1dERpcmVjdGl2ZSwgTmF0aXZlSW5wdXRSZWZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IERlY29yYXRlZElucHV0QmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbWJvYm94Qm9keUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhcnRpYWxzJztcblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvZGU6IFQsIG1lc3NhZ2U6IG51bGwgfCBmYWxzZSB8IHN0cmluZywgcHVibGljIGRhdGE6IHVua25vd24gPSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgc3VwZXIoZm9ybWF0UnVudGltZUVycm9yPFQ+KGNvZGUsIG1lc3NhZ2UpKTtcblxuICAgIGlmIChkYXRhICE9PSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBfZGF0YSA9IGNsb25lKGRhdGEpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoX2RhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPihjb2RlOiBULCBtZXNzYWdlOiBudWxsIHwgZmFsc2UgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBwcmVmaXggY29kZSB3aXRoIHplcm9zIGlmIGl0J3MgbGVzcyB0aGFuIDEwMFxuICBjb25zdCBjb2RlV2l0aFplcm9zID0gY29kZSA8IDEwID8gYDAwJHtjb2RlfWAgOiBjb2RlIDwgMTAwID8gYDAke2NvZGV9YCA6IGNvZGU7XG5cbiAgY29uc3QgZnVsbENvZGUgPSBgRVQke2NvZGVXaXRoWmVyb3N9YDtcblxuICByZXR1cm4gYCR7ZnVsbENvZGV9JHttZXNzYWdlID8gJzogJyArIG1lc3NhZ2UgOiAnJ31gO1xufVxuXG5jb25zdCBDT01CT0JPWF9FUlJPUlMgPSB7XG4gIDE6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgYmVpbmcgc2V0LicsXG4gIDI6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgbm90IGJlaW5nIHNldCBvciBcImFsbG93Q3VzdG9tVmFsdWVzXCIgYmVpbmcgc2V0IHRvIHRydWUuJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNvbWJvYm94RXJyb3IgPSAoY29kZToga2V5b2YgdHlwZW9mIENPTUJPQk9YX0VSUk9SUywgZGF0YTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYDxldC1jb21ib2JveD46ICR7Q09NQk9CT1hfRVJST1JTW2NvZGVdfWA7XG5cbiAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKTtcbn07XG5cbmNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgIT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ICE9PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzT2JqZWN0QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuXG4gIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCc7XG59O1xuXG5jb25zdCBpc0VtcHR5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG59O1xuXG5jb25zdCBpc09iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59O1xuXG5jb25zdCBDb21ib2JveE9wdGlvblR5cGUgPSB7XG4gIFByaW1pdGl2ZTogJ3ByaW1pdGl2ZScsXG4gIE9iamVjdDogJ29iamVjdCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDb21ib2JveElucHV0VmFsdWVUeXBlID0ge1xuICBTaW5nbGU6ICdzaW5nbGUnLFxuICBBcnJheTogJ2FycmF5Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGdldE9iamVjdFByb3BlcnR5ID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByb3A6IHN0cmluZykgPT4ge1xuICBjb25zdCBoYXNEb3ROb3RhdGlvbiA9IHByb3AuaW5jbHVkZXMoJy4nKTtcblxuICBpZiAoIWhhc0RvdE5vdGF0aW9uKSByZXR1cm4gb2JqW3Byb3BdO1xuXG4gIGNvbnN0IHByb3BzID0gcHJvcC5zcGxpdCgnLicpO1xuXG4gIGxldCB2YWx1ZTogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHZhbHVlID0gdmFsdWVbcHJvcF07XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgQ09NQk9CT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hDb21wb25lbnQ+KCdFVF9DT01CT0JPWF9UT0tFTicpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1jb21ib2JveCcsXG4gIH0sXG4gIGltcG9ydHM6IFtOZ0lmLCBOYXRpdmVJbnB1dFJlZkRpcmVjdGl2ZSwgQXN5bmNQaXBlLCBDaGV2cm9uSWNvbkNvbXBvbmVudCwgTGV0RGlyZWN0aXZlLCBOZ0Zvcl0sXG4gIGhvc3REaXJlY3RpdmVzOiBbeyBkaXJlY3RpdmU6IElucHV0RGlyZWN0aXZlIH0sIEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENPTUJPQk9YX1RPS0VOLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvbWJvYm94Q29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGV4dGVuZHMgRGVjb3JhdGVkSW5wdXRCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8jcmVnaW9uIEluamVjdHNcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dCA9IGluamVjdChJTlBVVF9UT0tFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FuaW1hdGVkT3ZlcmxheSA9IGluamVjdDxBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmU8Q29tYm9ib3hCb2R5Q29tcG9uZW50Pj4oQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5wdXRzXG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMkLnZhbHVlO1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiB1bmtub3duW10pIHtcbiAgICB0aGlzLl9vcHRpb25zJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9vcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bltdPihbXSk7XG4gIHJlYWRvbmx5IG9wdGlvbnMkID0gdGhpcy5fb3B0aW9ucyQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGluaXRpYWxWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbFZhbHVlJC52YWx1ZTtcbiAgfVxuICBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5faW5pdGlhbFZhbHVlJC5uZXh0KHZhbHVlKTtcblxuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpO1xuICB9XG4gIHByaXZhdGUgX2luaXRpYWxWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC52YWx1ZTtcbiAgfVxuICBzZXQgbG9hZGluZyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbG9hZGluZyQubmV4dChjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9sb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3IkLnZhbHVlO1xuICB9XG4gIHNldCBlcnJvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2Vycm9yJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIkLnZhbHVlO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGUkLnZhbHVlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlwbGUkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfbXVsdGlwbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGJpbmRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC52YWx1ZTtcbiAgfVxuICBzZXQgYmluZExhYmVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fYmluZExhYmVsJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9iaW5kTGFiZWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoKVxuICBnZXQgYmluZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9iaW5kVmFsdWUkLnZhbHVlO1xuICB9XG4gIHNldCBiaW5kVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9iaW5kVmFsdWUkLm5leHQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2JpbmRWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhbGxvd0N1c3RvbVZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLnZhbHVlO1xuICB9XG4gIHNldCBhbGxvd0N1c3RvbVZhbHVlcyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWxsb3dDdXN0b21WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE91dHB1dHNcblxuICBAT3V0cHV0KClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZW1iZXJzXG5cbiAgcHJpdmF0ZSBnZXQgX3Jhd1NlbGVjdGVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9yYXdTZWxlY3RlZE9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx1bmtub3duW10+KFtdKTtcblxuICBwcml2YXRlIGdldCBfY3VycmVudEZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlciQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgZ2V0IF9pc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNPcGVuJCA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQkO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb21wdXRlc1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FsbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fb3B0aW9ucyQsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyRdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIHJhd1NlbGVjdGVkT3B0aW9uc10pID0+IFsuLi5vcHRpb25zLCAuLi5yYXdTZWxlY3RlZE9wdGlvbnNdKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBleHBlY3RlZE9wdGlvblR5cGUkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fYmluZExhYmVsJCxcbiAgICB0aGlzLl9iaW5kVmFsdWUkLFxuICAgIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5kTGFiZWwsIGJpbmRWYWx1ZSwgYWxsb3dDdXN0b21WYWx1ZXNdKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRCZU9iamVjdHMgPSBiaW5kTGFiZWwgJiYgYmluZFZhbHVlICYmICFhbGxvd0N1c3RvbVZhbHVlcztcblxuICAgICAgaWYgKHNob3VsZEJlT2JqZWN0cykge1xuICAgICAgICByZXR1cm4gQ29tYm9ib3hPcHRpb25UeXBlLk9iamVjdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmU7XG4gICAgfSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUkID0gdGhpcy5fbXVsdGlwbGUkLnBpcGUoXG4gICAgbWFwKChtdWx0aXBsZSkgPT4gKG11bHRpcGxlID8gQ29tYm9ib3hJbnB1dFZhbHVlVHlwZS5BcnJheSA6IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSQsXG4gICAgdGhpcy5leHBlY3RlZElucHV0VmFsdWVUeXBlJCxcbiAgICB0aGlzLl9hbGxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dFZhbHVlLCBleHBlY3RlZElucHV0VmFsdWVUeXBlLCBhbGxPcHRpb25zXSkgPT4ge1xuICAgICAgaWYgKGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUgPT09IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUoaW5wdXRWYWx1ZSwgYWxsT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIFtvcHRpb25dO1xuICAgICAgfSBlbHNlIGlmIChleHBlY3RlZElucHV0VmFsdWVUeXBlID09PSBDb21ib2JveElucHV0VmFsdWVUeXBlLkFycmF5KSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnB1dFZhbHVlLm1hcCgodmFsdWUpID0+IHRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBhbGxPcHRpb25zKSkuZmlsdGVyKCh2KSA9PiAhIXYpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pLFxuICAgIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5maWx0ZXIoKHYpID0+ICEhdikpLFxuICApO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYmluZGluZ3MucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tbG9hZGluZycsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9sb2FkaW5nJCxcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLWVycm9yJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2Vycm9yJC5waXBlKG1hcCgodikgPT4gISF2KSksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1vcGVuJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2lzT3BlbiQsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0RGlzcGF0Y2hGaWx0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5faW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpO1xuXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICBnZXRPcHRpb25MYWJlbChvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZExhYmVsIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb2Yob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC5waXBlKFxuICAgICAgbWFwKChsYWJlbCkgPT4ge1xuICAgICAgICBpZiAoIWxhYmVsKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIGxhYmVsKSA/PyBvcHRpb247XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRWYWx1ZSB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9mKG9wdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2JpbmRWYWx1ZSQucGlwZShcbiAgICAgIG1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB2YWx1ZSkgPz8gb3B0aW9uO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb24pO1xuXG4gICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZE9wdGlvbnMuZmluZEluZGV4KCh2KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRPcHRpb25WYWx1ZVN5bmModik7XG5cbiAgICAgIHJldHVybiB2YWwgPT09IG9wdGlvblZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgc2VsZWN0ZWRPcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICB0aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMkLm5leHQoc2VsZWN0ZWRPcHRpb25zKTtcblxuICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG9wdGlvblZhbHVlKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgLy8gaWYgKCF0aGlzLl9zZWxlY3RCb2R5Q29uZmlnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5faXNPcGVuIHx8IHRoaXMuaW5wdXQuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vIHRoaXMuX3NldFNlbGVjdGVkT3B0aW9uQWN0aXZlKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5tb3VudCh7XG4gICAgICBjb21wb25lbnQ6IENvbWJvYm94Qm9keUNvbXBvbmVudCxcbiAgICAgIG1pcnJvcldpZHRoOiB0cnVlLFxuICAgICAgLy8gZGF0YTogeyBfYm9keVRlbXBsYXRlOiB0aGlzLl9zZWxlY3RCb2R5Q29uZmlnLnRlbXBsYXRlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyB0aGlzLl9zZWxlY3RCb2R5SWQkLm5leHQoaW5zdGFuY2Uuc2VsZWN0Qm9keS5pZCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LnVubW91bnQoKTtcblxuICAgIC8vIHRoaXMuX3NlbGVjdEJvZHlJZCQubmV4dChudWxsKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWVGcm9tT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5fZ2V0T3B0aW9uVmFsdWVTeW5jKG9wdGlvbik7XG5cbiAgICBpZiAodGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUob3B0aW9uVmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0T3JBZGRUb0lucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJCwgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24pXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkT3B0aW9ucywgdmFsdWVdKSA9PiAhIXRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBzZWxlY3RlZE9wdGlvbnMpKSxcbiAgICApO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NLZXlkb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICBjb25zdCBpc09wZW4gPSB0aGlzLl9pc09wZW47XG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG4gICAgY29uc3QgY2FuQWRkQ3VzdG9tVmFsdWUgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBjb25zdCBoYXNWYWx1ZSA9ICEhdmFsdWU7XG5cbiAgICAvLyBUaGUgdXNlciB0eXBlZCBhIGN1c3RvbSB2YWx1ZSBhbmQgcHJlc3NlZCBlbnRlci4gQWRkIGl0IHRvIHRoZSBzZWxlY3RlZCBvcHRpb25zLlxuICAgIGlmIChrZXlDb2RlID09PSBFTlRFUiAmJiBjYW5BZGRDdXN0b21WYWx1ZSAmJiBoYXNWYWx1ZSkge1xuICAgICAgLy8gRG9uJ3QgYWRkIHRoZSB2YWx1ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgIGlmICghdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgICAgdGhpcy5fYWRkU2VsZWN0ZWRPcHRpb24odmFsdWUpO1xuICAgICAgICB0aGlzLl9zZXRPckFkZFRvSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaXNNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFRBQikge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnRcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0lucHV0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgdGhpcy5fdXBkYXRlRmlsdGVyKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVCbHVyRXZlbnQoKSB7XG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaW5wdXQuX3NldFNob3VsZERpc3BsYXlFcnJvcih0cnVlKTtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fY3VycmVudEZpbHRlciA9PT0gJycpIHtcbiAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJpdmF0ZSBNZXRob2RzXG5cbiAgcHJpdmF0ZSBfaW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHYpID0+IHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpIHtcbiAgICB0aGlzLmlucHV0LnZhbHVlQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5fcmVwb3NpdGlvbigpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUgIT09IG51bGwgJiYgdGhpcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbml0aWFsVmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9ucyh0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZGRTZWxlY3RlZE9wdGlvbih0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyQubmV4dChbLi4udGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zLCBvcHRpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFtvcHRpb25dKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hZGRTZWxlY3RlZE9wdGlvbnMob3B0aW9uczogdW5rbm93bltdKSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFsuLi50aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMsIC4uLm9wdGlvbnNdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duLCBhbGxPcHRpb25zOiB1bmtub3duW10pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhbGxPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbikgJiYgdGhpcy5iaW5kVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGdldE9iamVjdFByb3BlcnR5KG9wdGlvbiwgdGhpcy5iaW5kVmFsdWUpID09PSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbiA9PT0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3JBZGRUb0lucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZShbLi4udGhpcy5faW5wdXQudmFsdWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh0aGlzLl9pbnB1dC52YWx1ZS5maWx0ZXIoKHYpID0+IHYgIT09IHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pbnB1dC5uYXRpdmVJbnB1dFJlZiAmJiB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGaWx0ZXIgPT09IHZhbHVlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZFZhbHVlIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIHRoaXMuYmluZFZhbHVlKSA/PyBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRMYWJlbCB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB0aGlzLmJpbmRMYWJlbCkgPz8gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyk7XG5cbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uKTtcblxuICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIobGFiZWwpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIERldiBtb2RlXG5cbiAgcHJpdmF0ZSBfZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKGlzUmV0cnkgPSBmYWxzZSkge1xuICAgIHRoaXMuZXhwZWN0ZWRPcHRpb25UeXBlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXAoaXNSZXRyeSA/IDEgOiAwKSwgLy8gU2tpcCBpZiByZXRyeWluZyB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKChleHBlY3RlZE9wdGlvblR5cGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRPcHRpb25UeXBlID09PSBDb21ib2JveE9wdGlvblR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0QXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgICB0aHJvdyBjb21ib2JveEVycm9yKDEsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZE9wdGlvblR5cGUgPT09IENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGlmICghaXNQcmltaXRpdmVBcnJheSh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHRocm93IGNvbWJvYm94RXJyb3IoMiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKHRydWUpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0UHJlZml4XVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJldC1jb21ib2JveC13cmFwcGVyXCI+XG4gIDx1bCAqbmdJZj1cIm11bHRpcGxlXCIgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb25zXCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkT3B0aW9ucyQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uXCI+XG4gICAgICB7eyBnZXRPcHRpb25MYWJlbChpdGVtKSB8IGFzeW5jIH19XG4gICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRPcHRpb24oaXRlbSlcIiBjbGFzcz1cImV0LWNvbWJvYm94LXNlbGVjdGVkLW9wdGlvbi1yZW1vdmVcIiB0YWJpbmRleD1cIi0xXCI+IHggPC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGlucHV0XG4gICAgKGtleWRvd24pPVwicHJvY2Vzc0tleWRvd25FdmVudCgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwib3BlbigpXCJcbiAgICAoYmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoKVwiXG4gICAgKGlucHV0KT1cInByb2Nlc3NJbnB1dEV2ZW50KCRldmVudClcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBldE5hdGl2ZUlucHV0UmVmXG4gIC8+XG5cbiAgPGV0LWNoZXZyb24taWNvbiBjbGFzcz1cImV0LWNvbWJvYm94LWNoZXZyb25cIiAvPlxuPC9kaXY+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0U3VmZml4XVwiIC8+XG5cbjxuZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=