@energycap/components 0.31.5 → 0.32.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 (292) hide show
  1. package/energycap-components.min.css +2 -2
  2. package/energycap-email.min.css +1 -1
  3. package/esm2020/energycap-components.mjs +5 -0
  4. package/esm2020/lib/components.module.mjs +386 -0
  5. package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
  6. package/esm2020/lib/controls/button/button.component.mjs +106 -0
  7. package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
  8. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
  9. package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
  10. package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
  11. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
  12. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
  13. package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
  14. package/esm2020/lib/controls/form-control-base.mjs +143 -0
  15. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  16. package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
  17. package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
  18. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
  19. package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
  20. package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
  21. package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
  22. package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
  23. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  24. package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
  25. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
  26. package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
  27. package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
  28. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
  29. package/esm2020/lib/controls/select/select.component.mjs +87 -0
  30. package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
  31. package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
  32. package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
  33. package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
  34. package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
  35. package/esm2020/lib/core/error.service.mjs +57 -0
  36. package/esm2020/lib/core/scroll.service.mjs +89 -0
  37. package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
  38. package/esm2020/lib/core/telemetry.service.mjs +38 -0
  39. package/esm2020/lib/core/validation-message.service.mjs +181 -0
  40. package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
  41. package/esm2020/lib/core/window.service.mjs +182 -0
  42. package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
  43. package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
  44. package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
  45. package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
  46. package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
  47. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  48. package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
  49. package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
  50. package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
  51. package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
  52. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
  53. package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
  54. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
  55. package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
  56. package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
  57. package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
  58. package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
  59. package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
  60. package/esm2020/lib/display/splash/splash.component.mjs +42 -0
  61. package/esm2020/lib/display/splash/splash.service.mjs +35 -0
  62. package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
  63. package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
  64. package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
  65. package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
  66. package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
  67. package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
  68. package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
  69. package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
  70. package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
  71. package/esm2020/lib/display/table/table.component.mjs +244 -0
  72. package/esm2020/lib/display/tags/tag.mjs +15 -0
  73. package/esm2020/lib/display/tags/tags.component.mjs +77 -0
  74. package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
  75. package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
  76. package/esm2020/lib/display/toast/toast.service.mjs +35 -0
  77. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
  78. package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
  79. package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
  80. package/esm2020/lib/display/tree/tree.component.mjs +125 -0
  81. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  82. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  83. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  84. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
  85. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  86. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  87. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
  88. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  89. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  90. package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
  91. package/esm2020/lib/shared/form-group.helper.mjs +67 -0
  92. package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
  93. package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
  94. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
  95. package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
  96. package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
  97. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
  98. package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
  99. package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
  100. package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
  101. package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
  102. package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
  103. package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
  104. package/esm2020/lib/shared/user-preference.service.mjs +17 -0
  105. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  106. package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
  107. package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
  108. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  109. package/fesm2015/energycap-components.mjs +10090 -0
  110. package/fesm2015/energycap-components.mjs.map +1 -0
  111. package/fesm2020/energycap-components.mjs +9999 -0
  112. package/fesm2020/energycap-components.mjs.map +1 -0
  113. package/index.d.ts +5 -0
  114. package/lib/components.module.d.ts +72 -0
  115. package/lib/controls/banner/banner.component.d.ts +3 -0
  116. package/lib/controls/button/button.component.d.ts +3 -0
  117. package/lib/controls/button/copy-button.directive.d.ts +3 -0
  118. package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
  119. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
  120. package/lib/controls/combobox/combobox.component.d.ts +5 -2
  121. package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
  122. package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
  123. package/lib/controls/form-control/form-control.component.d.ts +3 -0
  124. package/lib/controls/form-control-base.d.ts +3 -0
  125. package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
  126. package/lib/controls/form-group/form-group.component.d.ts +6 -3
  127. package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
  128. package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
  129. package/lib/controls/link-button/link-button.component.d.ts +3 -0
  130. package/lib/controls/menu/menu.component.d.ts +3 -0
  131. package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
  132. package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
  133. package/lib/controls/popover/popover.component.d.ts +3 -0
  134. package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
  135. package/lib/controls/select/select.component.d.ts +3 -0
  136. package/lib/controls/tabs/tabs.component.d.ts +3 -0
  137. package/lib/controls/textbox/textbox.component.d.ts +3 -0
  138. package/lib/core/cache.service.d.ts +3 -0
  139. package/lib/core/error.service.d.ts +3 -0
  140. package/lib/core/scroll.service.d.ts +3 -0
  141. package/lib/core/telemetry-tracker.service.d.ts +3 -0
  142. package/lib/core/telemetry.service.d.ts +3 -0
  143. package/lib/core/validation-message.service.d.ts +3 -0
  144. package/lib/core/window.service.d.ts +3 -0
  145. package/lib/display/app-bar/app-bar.component.d.ts +3 -0
  146. package/lib/display/avatar/avatar.component.d.ts +3 -0
  147. package/lib/display/avatar/avatar.service.d.ts +3 -0
  148. package/lib/display/confirm/confirm.component.d.ts +5 -2
  149. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
  150. package/lib/display/dialog/dialog.component.d.ts +3 -0
  151. package/lib/display/dialog/dialog.service.d.ts +3 -0
  152. package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
  153. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
  154. package/lib/display/item-display/item-display.component.d.ts +3 -0
  155. package/lib/display/json-display/json-display.component.d.ts +5 -2
  156. package/lib/display/resizable/resizable-base.d.ts +3 -0
  157. package/lib/display/resizable/resizable.component.d.ts +3 -0
  158. package/lib/display/spinner/spinner.component.d.ts +3 -0
  159. package/lib/display/splash/splash.component.d.ts +3 -0
  160. package/lib/display/splash/splash.service.d.ts +3 -0
  161. package/lib/display/table/resizable-column.component.d.ts +3 -0
  162. package/lib/display/table/resizable-table.directive.d.ts +3 -0
  163. package/lib/display/table/searchable-table.component.d.ts +6 -3
  164. package/lib/display/table/table-detail-row.component.d.ts +3 -0
  165. package/lib/display/table/table-locked-column.component.d.ts +3 -0
  166. package/lib/display/table/table-master-header-row.component.d.ts +3 -0
  167. package/lib/display/table/table-master-row.component.d.ts +3 -0
  168. package/lib/display/table/table-pagination.component.d.ts +3 -0
  169. package/lib/display/table/table-selectable-row.component.d.ts +5 -2
  170. package/lib/display/table/table.component.d.ts +3 -0
  171. package/lib/display/tags/tags.component.d.ts +3 -0
  172. package/lib/display/toast/toast/toast.component.d.ts +3 -0
  173. package/lib/display/toast/toast.service.d.ts +3 -0
  174. package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
  175. package/lib/display/tooltip/tooltip.component.d.ts +3 -0
  176. package/lib/display/tooltip/tooltip.service.d.ts +3 -0
  177. package/lib/display/tree/tree.component.d.ts +3 -0
  178. package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
  179. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
  180. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
  181. package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
  182. package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
  183. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
  184. package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
  185. package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
  186. package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
  187. package/lib/shared/form-group.helper.d.ts +5 -2
  188. package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
  189. package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
  190. package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
  191. package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
  192. package/lib/shared/user-preference.service.d.ts +3 -0
  193. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
  194. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
  195. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
  196. package/package.json +27 -15
  197. package/src/styles/_functions.scss +6 -4
  198. package/src/styles/_icons.scss +1 -1
  199. package/src/styles/mixins/_control-base.scss +2 -2
  200. package/src/styles/mixins/_form-control-base.scss +3 -1
  201. package/src/styles/mixins/_spinner-base.scss +3 -1
  202. package/bundles/energycap-components.umd.js +0 -10646
  203. package/bundles/energycap-components.umd.js.map +0 -1
  204. package/bundles/energycap-components.umd.min.js +0 -17
  205. package/bundles/energycap-components.umd.min.js.map +0 -1
  206. package/energycap-components.d.ts +0 -7
  207. package/energycap-components.metadata.json +0 -1
  208. package/esm2015/energycap-components.js +0 -8
  209. package/esm2015/lib/components.module.js +0 -238
  210. package/esm2015/lib/controls/banner/banner.component.js +0 -94
  211. package/esm2015/lib/controls/button/button.component.js +0 -89
  212. package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
  213. package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
  214. package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
  215. package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
  216. package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
  217. package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
  218. package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
  219. package/esm2015/lib/controls/form-control-base.js +0 -140
  220. package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
  221. package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
  222. package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
  223. package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
  224. package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
  225. package/esm2015/lib/controls/menu/menu.component.js +0 -424
  226. package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
  227. package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
  228. package/esm2015/lib/controls/popover/popover.component.js +0 -85
  229. package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
  230. package/esm2015/lib/controls/select/select.component.js +0 -89
  231. package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
  232. package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
  233. package/esm2015/lib/core/error.service.js +0 -56
  234. package/esm2015/lib/core/scroll.service.js +0 -88
  235. package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
  236. package/esm2015/lib/core/telemetry.service.js +0 -40
  237. package/esm2015/lib/core/validation-message.service.js +0 -185
  238. package/esm2015/lib/core/window.service.js +0 -191
  239. package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
  240. package/esm2015/lib/display/avatar/avatar.component.js +0 -73
  241. package/esm2015/lib/display/confirm/confirm.component.js +0 -127
  242. package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
  243. package/esm2015/lib/display/dialog/dialog.component.js +0 -229
  244. package/esm2015/lib/display/dialog/dialog.service.js +0 -69
  245. package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
  246. package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
  247. package/esm2015/lib/display/item-display/item-display.component.js +0 -57
  248. package/esm2015/lib/display/json-display/json-display.component.js +0 -44
  249. package/esm2015/lib/display/resizable/resizable-base.js +0 -119
  250. package/esm2015/lib/display/resizable/resizable.component.js +0 -57
  251. package/esm2015/lib/display/spinner/spinner.component.js +0 -12
  252. package/esm2015/lib/display/splash/splash.component.js +0 -45
  253. package/esm2015/lib/display/splash/splash.service.js +0 -34
  254. package/esm2015/lib/display/table/resizable-column.component.js +0 -23
  255. package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
  256. package/esm2015/lib/display/table/searchable-table.component.js +0 -303
  257. package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
  258. package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
  259. package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
  260. package/esm2015/lib/display/table/table-master-row.component.js +0 -141
  261. package/esm2015/lib/display/table/table-pagination.component.js +0 -146
  262. package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
  263. package/esm2015/lib/display/table/table.component.js +0 -210
  264. package/esm2015/lib/display/tags/tag.js +0 -15
  265. package/esm2015/lib/display/tags/tags.component.js +0 -73
  266. package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
  267. package/esm2015/lib/display/toast/toast.service.js +0 -34
  268. package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
  269. package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
  270. package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
  271. package/esm2015/lib/display/tree/tree.component.js +0 -100
  272. package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
  273. package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
  274. package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
  275. package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
  276. package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
  277. package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
  278. package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
  279. package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
  280. package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
  281. package/esm2015/lib/shared/form-group.helper.js +0 -65
  282. package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
  283. package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
  284. package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
  285. package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
  286. package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
  287. package/esm2015/lib/shared/user-preference.service.js +0 -15
  288. package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
  289. package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
  290. package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
  291. package/fesm2015/energycap-components.js +0 -9638
  292. package/fesm2015/energycap-components.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { Directive, Input, Output, EventEmitter } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil, filter } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ export class NavItemActiveDirective {
8
+ constructor(router, el, renderer, route) {
9
+ this.router = router;
10
+ this.el = el;
11
+ this.renderer = renderer;
12
+ this.route = route;
13
+ this._exact = true;
14
+ /** Emits when the url becomes active */
15
+ this.routerLinkActivated = new EventEmitter();
16
+ /** Subject that emits when component is destroyed to unsubscribe from any subscriptions */
17
+ this.destroyed = new Subject();
18
+ }
19
+ /**
20
+ * Determines whether the directive will try to make an exact match on the url or not
21
+ * If false, the directive will add the active class if the first part of the url matches
22
+ * the active route.
23
+ * see: https://angular.io/api/router/Router#isactive
24
+ */
25
+ set exact(value) {
26
+ if (value === undefined) {
27
+ this._exact = true;
28
+ }
29
+ else {
30
+ this._exact = value;
31
+ }
32
+ this.update();
33
+ }
34
+ /**
35
+ * The url of the NavItem to check for activeness. Convert the item url into a
36
+ * UrlTree relative to the ActivatedRoute so router#isActive works even with relative urls.
37
+ * See Angular's [routerLink](https://github.com/angular/angular/blob/8282e15c2becbe42a49befa07d6407247e8243d8/packages/router/src/directives/router_link.ts#L249)
38
+ * and [routerLinkActive](https://github.com/angular/angular/blob/8282e15c2becbe42a49befa07d6407247e8243d8/packages/router/src/directives/router_link_active.ts#L139)
39
+ * for a similiar implementation.
40
+ */
41
+ set url(value) {
42
+ if (value !== null && value !== undefined) {
43
+ this._url = this.router.createUrlTree([value], { relativeTo: this.route, queryParams: this.queryParams });
44
+ this.update();
45
+ }
46
+ }
47
+ /** Check if url is active on NavigationEnd events */
48
+ ngOnInit() {
49
+ this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(() => {
50
+ this.update();
51
+ });
52
+ }
53
+ ngOnDestroy() {
54
+ this.destroyed.next();
55
+ this.destroyed.unsubscribe();
56
+ }
57
+ /** If url is active apply the defined class to the element, otherwise remove it */
58
+ update() {
59
+ if (this._url && this.classValue) {
60
+ if (this.router.isActive(this._url, { matrixParams: 'ignored', queryParams: this._exact ? 'exact' : 'subset', paths: this._exact ? 'exact' : 'subset', fragment: 'ignored' })) {
61
+ this.renderer.addClass(this.el.nativeElement, this.classValue);
62
+ this.routerLinkActivated.emit(new Event('routerLinkActivated'));
63
+ }
64
+ else {
65
+ this.renderer.removeClass(this.el.nativeElement, this.classValue);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ NavItemActiveDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: NavItemActiveDirective, deps: [{ token: i1.Router }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Directive });
71
+ NavItemActiveDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: { classValue: ["ecNavItemActive", "classValue"], exact: ["ecNavItemActiveExactMatch", "exact"], queryParams: ["ecNavItemActiveQueryParams", "queryParams"], url: ["ecNavItemActiveUrl", "url"] }, outputs: { routerLinkActivated: "routerLinkActivated" }, ngImport: i0 });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: NavItemActiveDirective, decorators: [{
73
+ type: Directive,
74
+ args: [{
75
+ selector: '[ecNavItemActive]'
76
+ }]
77
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ActivatedRoute }]; }, propDecorators: { classValue: [{
78
+ type: Input,
79
+ args: ['ecNavItemActive']
80
+ }], exact: [{
81
+ type: Input,
82
+ args: ['ecNavItemActiveExactMatch']
83
+ }], queryParams: [{
84
+ type: Input,
85
+ args: ['ecNavItemActiveQueryParams']
86
+ }], url: [{
87
+ type: Input,
88
+ args: ['ecNavItemActiveUrl']
89
+ }], routerLinkActivated: [{
90
+ type: Output
91
+ }] } });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LWl0ZW0tYWN0aXZlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9uYXZpZ2F0aW9uL25hdi1pdGVtLWFjdGl2ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFVLGFBQWEsRUFBbUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUtuRCxNQUFNLE9BQU8sc0JBQXNCO0lBK0NqQyxZQUFvQixNQUFjLEVBQVUsRUFBYyxFQUFVLFFBQW1CLEVBQVUsS0FBcUI7UUFBbEcsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUEzQjlHLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFxQi9CLHdDQUF3QztRQUM5Qix3QkFBbUIsR0FBd0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV4RSwyRkFBMkY7UUFDbkYsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRXdFLENBQUM7SUExQzFIOzs7OztPQUtHO0lBQ0gsSUFDSSxLQUFLLENBQUMsS0FBMEI7UUFDbEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBTUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxHQUFHLENBQUMsS0FBeUI7UUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQ3hHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQVdELHFEQUFxRDtJQUM5QyxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNyQixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksYUFBYSxDQUFDLENBQ3hDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsbUZBQW1GO0lBQzNFLE1BQU07UUFDWixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQzdLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25FO1NBQ0Y7SUFDSCxDQUFDOzttSEExRVUsc0JBQXNCO3VHQUF0QixzQkFBc0I7MkZBQXRCLHNCQUFzQjtrQkFIbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5QjsyS0FJMkIsVUFBVTtzQkFBbkMsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBU3BCLEtBQUs7c0JBRFIsS0FBSzt1QkFBQywyQkFBMkI7Z0JBWUcsV0FBVztzQkFBL0MsS0FBSzt1QkFBQyw0QkFBNEI7Z0JBVS9CLEdBQUc7c0JBRE4sS0FBSzt1QkFBQyxvQkFBb0I7Z0JBVWpCLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgT25Jbml0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCwgQWN0aXZhdGVkUm91dGUsIFVybFRyZWUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tlY05hdkl0ZW1BY3RpdmVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmF2SXRlbUFjdGl2ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGhvc3QgZWxlbWVudCB3aGVuIHRoZSB1cmwgaXMgYWN0aXZlICovXHJcbiAgQElucHV0KCdlY05hdkl0ZW1BY3RpdmUnKSBjbGFzc1ZhbHVlPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpcmVjdGl2ZSB3aWxsIHRyeSB0byBtYWtlIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSB1cmwgb3Igbm90XHJcbiAgICogSWYgZmFsc2UsIHRoZSBkaXJlY3RpdmUgd2lsbCBhZGQgdGhlIGFjdGl2ZSBjbGFzcyBpZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgdXJsIG1hdGNoZXNcclxuICAgKiB0aGUgYWN0aXZlIHJvdXRlLlxyXG4gICAqIHNlZTogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvUm91dGVyI2lzYWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCdlY05hdkl0ZW1BY3RpdmVFeGFjdE1hdGNoJylcclxuICBzZXQgZXhhY3QodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX2V4YWN0ID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2V4YWN0ID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuICBwcml2YXRlIF9leGFjdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBSb3V0ZXIgbGluayBxdWVyeSBwYXJhbXMgKi9cclxuICBASW5wdXQoJ2VjTmF2SXRlbUFjdGl2ZVF1ZXJ5UGFyYW1zJykgcXVlcnlQYXJhbXM/OiBQYXJhbXMgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdXJsIG9mIHRoZSBOYXZJdGVtIHRvIGNoZWNrIGZvciBhY3RpdmVuZXNzLiBDb252ZXJ0IHRoZSBpdGVtIHVybCBpbnRvIGFcclxuICAgKiBVcmxUcmVlIHJlbGF0aXZlIHRvIHRoZSBBY3RpdmF0ZWRSb3V0ZSBzbyByb3V0ZXIjaXNBY3RpdmUgd29ya3MgZXZlbiB3aXRoIHJlbGF0aXZlIHVybHMuXHJcbiAgICogU2VlIEFuZ3VsYXIncyBbcm91dGVyTGlua10oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzgyODJlMTVjMmJlY2JlNDJhNDliZWZhMDdkNjQwNzI0N2U4MjQzZDgvcGFja2FnZXMvcm91dGVyL3NyYy9kaXJlY3RpdmVzL3JvdXRlcl9saW5rLnRzI0wyNDkpXHJcbiAgICogYW5kIFtyb3V0ZXJMaW5rQWN0aXZlXShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvODI4MmUxNWMyYmVjYmU0MmE0OWJlZmEwN2Q2NDA3MjQ3ZTgyNDNkOC9wYWNrYWdlcy9yb3V0ZXIvc3JjL2RpcmVjdGl2ZXMvcm91dGVyX2xpbmtfYWN0aXZlLnRzI0wxMzkpXHJcbiAgICogZm9yIGEgc2ltaWxpYXIgaW1wbGVtZW50YXRpb24uXHJcbiAgICovXHJcbiAgQElucHV0KCdlY05hdkl0ZW1BY3RpdmVVcmwnKVxyXG4gIHNldCB1cmwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fdXJsID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbdmFsdWVdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHRoaXMucXVlcnlQYXJhbXN9KTtcclxuICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfdXJsPzogVXJsVHJlZTtcclxuXHJcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHVybCBiZWNvbWVzIGFjdGl2ZSAqL1xyXG4gIEBPdXRwdXQoKSByb3V0ZXJMaW5rQWN0aXZhdGVkOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZCB0byB1bnN1YnNjcmliZSBmcm9tIGFueSBzdWJzY3JpcHRpb25zICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7fVxyXG5cclxuICAvKiogQ2hlY2sgaWYgdXJsIGlzIGFjdGl2ZSBvbiBOYXZpZ2F0aW9uRW5kIGV2ZW50cyAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgICBmaWx0ZXIoZSA9PiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIElmIHVybCBpcyBhY3RpdmUgYXBwbHkgdGhlIGRlZmluZWQgY2xhc3MgdG8gdGhlIGVsZW1lbnQsIG90aGVyd2lzZSByZW1vdmUgaXQgKi9cclxuICBwcml2YXRlIHVwZGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl91cmwgJiYgdGhpcy5jbGFzc1ZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLnJvdXRlci5pc0FjdGl2ZSh0aGlzLl91cmwsIHsgbWF0cml4UGFyYW1zOiAnaWdub3JlZCcsIHF1ZXJ5UGFyYW1zOiB0aGlzLl9leGFjdCA/ICdleGFjdCcgOiAnc3Vic2V0JywgcGF0aHM6IHRoaXMuX2V4YWN0ID8gJ2V4YWN0JyA6ICdzdWJzZXQnLCBmcmFnbWVudDogJ2lnbm9yZWQnIH0pKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY2xhc3NWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJMaW5rQWN0aXZhdGVkLmVtaXQobmV3IEV2ZW50KCdyb3V0ZXJMaW5rQWN0aXZhdGVkJykpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmNsYXNzVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,371 @@
1
+ import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
+ import { UntypedFormControl, Validators } from "@angular/forms";
3
+ import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
4
+ import { getDecimalPattern, integerPattern } from '../../core/validation-patterns';
5
+ import { FormControlBase } from "../form-control-base";
6
+ import { TextboxComponent } from '../textbox/textbox.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../core/validation-message.service";
9
+ import * as i2 from "../../shared/form-group.helper";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "../textbox/textbox.component";
12
+ import * as i5 from "@ngx-translate/core";
13
+ /**
14
+ * Custom validator to check that min/max and pattern validation is met on the numericbox
15
+ * component
16
+ */
17
+ export const numericboxValidation = (min, max, decimals, maxPrecisionDigits) => {
18
+ return (control) => {
19
+ let hasError = false;
20
+ // If the control is empty we won't attempt to validate, if there is a required
21
+ // validator we will never get here until there is a value
22
+ if (control.value && control.value !== "") {
23
+ let numericPattern;
24
+ if (decimals && decimals > 0) {
25
+ numericPattern = getDecimalPattern(decimals);
26
+ }
27
+ else if (maxPrecisionDigits) {
28
+ // Still need to check for a valid number formatting when in max precision mode
29
+ numericPattern = getDecimalPattern(maxPrecisionDigits);
30
+ }
31
+ else {
32
+ // Allow an optional negative sign and any number of digits 0-9
33
+ numericPattern = integerPattern;
34
+ }
35
+ if (!numericPattern.test(control.value)) {
36
+ hasError = true;
37
+ }
38
+ else if (maxPrecisionDigits) {
39
+ // Converting to a number then back to string removes trailing zeros, and the regex replace removes
40
+ // any negative signs, leading zeros or decimal points from the number.
41
+ const val = Number(control.value).toString().replace(/^-?/, '').replace(/(^0\.)|(\.)/, '');
42
+ hasError = val.length > maxPrecisionDigits;
43
+ }
44
+ // We now know we have a valid number, so we can cast these to numbers
45
+ // for proper range validation
46
+ if (min !== undefined && Number(control.value) < min) {
47
+ hasError = true;
48
+ }
49
+ if (max !== undefined && Number(control.value) > max) {
50
+ hasError = true;
51
+ }
52
+ }
53
+ if (hasError) {
54
+ return {
55
+ numericbox: {
56
+ valid: false,
57
+ min: min,
58
+ max: max,
59
+ decimals: decimals,
60
+ maxPrecisionDigits: maxPrecisionDigits
61
+ }
62
+ };
63
+ }
64
+ else {
65
+ return null;
66
+ }
67
+ };
68
+ };
69
+ export class NumericboxComponent extends FormControlBase {
70
+ constructor(validationMessageService, formGroupHelper, renderer) {
71
+ super(validationMessageService, formGroupHelper);
72
+ this.validationMessageService = validationMessageService;
73
+ this.formGroupHelper = formGroupHelper;
74
+ this.renderer = renderer;
75
+ /**
76
+ * Show trailing zeros after the decimal point.
77
+ * Do not use with maxPrecisionDigits.
78
+ */
79
+ this.showPrecision = false;
80
+ /**
81
+ * If set to true this will update the form model after a debounce as the user
82
+ * interacts with the component
83
+ */
84
+ this.autoUpdateFormModel = false;
85
+ /** Flag to tell the page we finally computed a greater than zero
86
+ * width for units (if applicable)
87
+ */
88
+ this.unitsWidthCalculated = false;
89
+ /** Flag used to filter the form models value changes subscription
90
+ * to prevent the textbox model from being formatted as the form model is updated
91
+ * programmatically when the textbox model updates
92
+ */
93
+ this.autoUpdatingFormModel = false;
94
+ }
95
+ /**
96
+ * Angular AfterViewInit life-cycle hook
97
+ * Subscribe to textbox model value changes if the hosting
98
+ * page has opted in for this component
99
+ */
100
+ ngAfterViewInit() {
101
+ if (this.autoUpdateFormModel) {
102
+ this.textboxFormModel.valueChanges
103
+ .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.componentDestroyed)).subscribe(() => {
104
+ this.updateFormModelValue();
105
+ });
106
+ }
107
+ }
108
+ /**
109
+ * Angular onChanges life-cycle hook
110
+ * @see {@link https://angular.io/guide/lifecycle-hooks | Life-cycle hooks}
111
+ */
112
+ ngOnChanges(changes) {
113
+ // If either units change after we've calculated,
114
+ // reset the flag so we can react and redraw
115
+ if (changes.rightUnits || changes.leftUnits) {
116
+ this.unitsWidthCalculated = false;
117
+ }
118
+ super.ngOnChanges(changes);
119
+ }
120
+ /**
121
+ * Angular onInit lifecycle hook
122
+ * If units is defined, set the position and listen for status changes so we
123
+ * can update the positioning of the units element
124
+ */
125
+ ngOnInit() {
126
+ super.ngOnInit();
127
+ // Initialize the textbox form model with the value of the form model and synchronize
128
+ // disabled state
129
+ this.textboxFormModel = new UntypedFormControl({ value: this.formModel.value, disabled: this.formModel.disabled });
130
+ // Update the form model's errors when the textbox form model status changes
131
+ this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
132
+ if (this.formModel.enabled) {
133
+ this.formModel.setErrors(this.textboxFormModel.errors);
134
+ }
135
+ });
136
+ // Synchronize disabled state between form model and internal textbox form model
137
+ this.formModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
138
+ if (this.formModel.disabled) {
139
+ this.textboxFormModel.disable();
140
+ }
141
+ else {
142
+ if (this.textboxFormModel.disabled) {
143
+ this.textboxFormModel.enable();
144
+ }
145
+ }
146
+ });
147
+ // Set textbox validators
148
+ this.textboxFormModel.setValidators(this.getValidators());
149
+ // Now that the textbox is set up we will set it's value to whatever the
150
+ // form model had when we initialized
151
+ this.textboxFormModel.setValue(this.formatDisplayNumber(this.formModel.value));
152
+ // If the form model's value changes programmatically we need to update the
153
+ // textbox form model
154
+ this.formModel.valueChanges.pipe(
155
+ // We need to filter out when we are updating it programmatically if the
156
+ // hosting page has opted into the auto updating input
157
+ filter(() => !this.autoUpdatingFormModel), takeUntil(this.componentDestroyed)).subscribe(value => {
158
+ this.textboxFormModel.setValue(this.formatDisplayNumber(value));
159
+ });
160
+ // If the textbox status changes we need to update the left units position because
161
+ // we want to make room for the invalid icon
162
+ if (this.leftUnits) {
163
+ this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
164
+ this.positionLeftUnits();
165
+ });
166
+ }
167
+ }
168
+ /**
169
+ * Angular afterViewChecked lifecycle hook
170
+ * Show the units element if units is defined. Runs after every ngOnChanges
171
+ */
172
+ ngAfterViewChecked() {
173
+ if ((this.leftUnits || this.rightUnits) && !this.unitsWidthCalculated) {
174
+ this.showUnits();
175
+ }
176
+ }
177
+ /**
178
+ * Function that builds and returns a ValidatorFn array to set on the form control
179
+ */
180
+ getValidators() {
181
+ let validators = [];
182
+ if (this.required) {
183
+ validators.push(Validators.required);
184
+ }
185
+ validators.push(numericboxValidation(this.min, this.max, this.decimals, this.maxPrecisionDigits));
186
+ return validators;
187
+ }
188
+ /**
189
+ * Focus out event handler for the Textbox component
190
+ */
191
+ onFocusOut() {
192
+ this.updateFormModelValue(true);
193
+ }
194
+ /**
195
+ * Function to set focus on an input programatically after the page
196
+ * had been rendered. The highlight text flag will select the text
197
+ * within the input if passed in and true
198
+ */
199
+ setFocus(highlightText) {
200
+ this.textboxInput.setFocus(highlightText);
201
+ }
202
+ /**
203
+ * When the textbox model updates we need to add some display formatting for
204
+ * display in the textbox and cast the textbox model to a number. Avoid updating
205
+ * the form model when the value doesn't change because listeners will fire for no reason
206
+ */
207
+ updateFormModelValue(isFocusOut) {
208
+ if (this.autoUpdateFormModel) {
209
+ // Make it so value changes on the form model do not get triggered
210
+ // as we change it programmatically. We do not want the textbox
211
+ // model to be updated while the user is in the input
212
+ this.autoUpdatingFormModel = true;
213
+ }
214
+ try {
215
+ if (this.textboxFormModel.valid || this.textboxFormModel.value === "") {
216
+ // Start out with null for the number, if the textbox value is not a number
217
+ // we will clear it out on focus out
218
+ let number = null;
219
+ // Make sure the textbox model is a number before trying to update the
220
+ // form model value with it
221
+ if (this.textboxFormModel.value && !isNaN(this.textboxFormModel.value)) {
222
+ // Our value is a legit number, on focus out we will format it if needed
223
+ number = Number(this.textboxFormModel.value);
224
+ // Checking if the value has actually changed, if not don't set the
225
+ // value to avoid extra listener calls
226
+ if (this.formModel.value !== number) {
227
+ this.formModel.setValue(number);
228
+ }
229
+ // The textbox model is not a number, check to see if our form model has a value
230
+ // and if so clear it out
231
+ }
232
+ else if (this.formModel.value !== null) {
233
+ this.formModel.setValue(null);
234
+ }
235
+ // We only will update the textbox form model with formatting if needed
236
+ // on Focus out. This works well for the user whether the auto update
237
+ // is opted in or not
238
+ if (isFocusOut) {
239
+ this.textboxFormModel.setValue(this.formatDisplayNumber(number));
240
+ }
241
+ }
242
+ this.formModel.markAsTouched();
243
+ }
244
+ catch (error) {
245
+ // Nothing to display, just ensuring we reset our flag that filters
246
+ // the form model value changes
247
+ }
248
+ finally {
249
+ this.autoUpdatingFormModel = false;
250
+ }
251
+ }
252
+ /**
253
+ * Convert a number value to the formmated display string. If there is no value
254
+ * return null
255
+ */
256
+ formatDisplayNumber(value) {
257
+ if (value || value === 0) {
258
+ // Guard against calling toFixed if the value isn't a number. This is possible
259
+ // if patching a value from outside of the component as you don't have
260
+ // type checking there
261
+ if (this.showPrecision && this.decimals && !isNaN(value)) {
262
+ return value.toFixed(this.decimals);
263
+ }
264
+ else {
265
+ return value.toString();
266
+ }
267
+ }
268
+ else {
269
+ return null;
270
+ }
271
+ }
272
+ /**
273
+ * Position the units element and set the padding in the textbox input based
274
+ * on the width of the units element
275
+ */
276
+ positionRightUnits() {
277
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
278
+ let inputEl = this.textboxEl.nativeElement.querySelector('input');
279
+ if (unitsEl && inputEl) {
280
+ let unitsWidth = unitsEl.offsetWidth;
281
+ if (unitsWidth > 0) {
282
+ this.unitsWidthCalculated = true;
283
+ }
284
+ let padding = unitsWidth;
285
+ this.renderer.setStyle(inputEl, 'padding-right', padding + 'px');
286
+ }
287
+ }
288
+ positionLeftUnits() {
289
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
290
+ let inputEl = this.textboxEl.nativeElement.querySelector('input');
291
+ if (unitsEl && inputEl) {
292
+ let unitsWidth = unitsEl.offsetWidth;
293
+ if (unitsWidth > 0) {
294
+ this.unitsWidthCalculated = true;
295
+ }
296
+ let padding = unitsWidth;
297
+ let leftPosition = getComputedStyle(unitsEl).left;
298
+ if (leftPosition) {
299
+ padding += parseInt(leftPosition.replace('px', ''), 0);
300
+ }
301
+ this.renderer.setStyle(inputEl, 'padding-left', padding + 'px');
302
+ }
303
+ }
304
+ /**
305
+ * Create and append the units element to the textbox element
306
+ */
307
+ showUnits() {
308
+ let inputWrapper = this.textboxEl.nativeElement.querySelector('.input-wrapper');
309
+ if (inputWrapper) {
310
+ if (this.leftUnits) {
311
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
312
+ if (unitsEl) {
313
+ this.renderer.setProperty(unitsEl, 'innerHTML', this.leftUnits);
314
+ }
315
+ else {
316
+ this.renderer.appendChild(inputWrapper, this.makeUnitElement('left', this.leftUnits));
317
+ }
318
+ this.positionLeftUnits();
319
+ }
320
+ if (this.rightUnits) {
321
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
322
+ if (unitsEl) {
323
+ this.renderer.setProperty(unitsEl, 'innerHTML', this.rightUnits);
324
+ }
325
+ else {
326
+ this.renderer.appendChild(inputWrapper, this.makeUnitElement('right', this.rightUnits));
327
+ }
328
+ this.positionRightUnits();
329
+ }
330
+ }
331
+ }
332
+ makeUnitElement(side, text) {
333
+ let unitsEl = this.renderer.createElement('span');
334
+ this.renderer.setAttribute(unitsEl, 'class', `units units-${side}`);
335
+ this.renderer.setAttribute(unitsEl, 'id', `${this.id}_units`);
336
+ this.renderer.setAttribute(unitsEl, 'style', 'pointer-events: none');
337
+ this.renderer.setProperty(unitsEl, 'innerHTML', text);
338
+ return unitsEl;
339
+ }
340
+ }
341
+ NumericboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: NumericboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
342
+ NumericboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: NumericboxComponent, selector: "ec-numericbox", inputs: { placeholder: "placeholder", decimals: "decimals", showPrecision: "showPrecision", maxPrecisionDigits: "maxPrecisionDigits", max: "max", min: "min", leftUnits: "leftUnits", rightUnits: "rightUnits", autoUpdateFormModel: "autoUpdateFormModel" }, viewQueries: [{ propertyName: "textboxEl", first: true, predicate: TextboxComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "textboxInput", first: true, predicate: ["textbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n <label *ngIf=\"label\"\r\n ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">{{validationErrors | translate}}</span>\r\n </label>\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>\r\n", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select{border-color:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-color-secondary-dark);display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-color-secondary-dark);opacity:.65}ec-textbox ::ng-deep .units{height:2rem;line-height:1.25;color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);display:block;position:absolute;top:1px;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid:not(:focus),.control.invalid ec-textbox ::ng-deep input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: NumericboxComponent, decorators: [{
344
+ type: Component,
345
+ args: [{ selector: 'ec-numericbox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n <label *ngIf=\"label\"\r\n ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">{{validationErrors | translate}}</span>\r\n </label>\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>\r\n", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select{border-color:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-color-secondary-dark);display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-color-secondary-dark);opacity:.65}ec-textbox ::ng-deep .units{height:2rem;line-height:1.25;color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);display:block;position:absolute;top:1px;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid:not(:focus),.control.invalid ec-textbox ::ng-deep input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}\n"] }]
346
+ }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i0.Renderer2 }]; }, propDecorators: { placeholder: [{
347
+ type: Input
348
+ }], decimals: [{
349
+ type: Input
350
+ }], showPrecision: [{
351
+ type: Input
352
+ }], maxPrecisionDigits: [{
353
+ type: Input
354
+ }], max: [{
355
+ type: Input
356
+ }], min: [{
357
+ type: Input
358
+ }], leftUnits: [{
359
+ type: Input
360
+ }], rightUnits: [{
361
+ type: Input
362
+ }], autoUpdateFormModel: [{
363
+ type: Input
364
+ }], textboxEl: [{
365
+ type: ViewChild,
366
+ args: [TextboxComponent, { read: ElementRef, static: true }]
367
+ }], textboxInput: [{
368
+ type: ViewChild,
369
+ args: ['textbox', { static: true }]
370
+ }] } });
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9udW1lcmljYm94L251bWVyaWNib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBMEQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sRUFBbUIsa0JBQWtCLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7OztBQUdoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxRQUE0QixFQUFFLGtCQUFzQyxFQUFlLEVBQUU7SUFDeEssT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNoQyxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFFOUIsK0VBQStFO1FBQy9FLDBEQUEwRDtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFFdkMsSUFBSSxjQUFz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LFdBQVc7c0JBQTFCLEtBQUs7Z0JBTVUsUUFBUTtzQkFBdkIsS0FBSztnQkFPVSxhQUFhO3NCQUE1QixLQUFLO2dCQVNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFVVSxHQUFHO3NCQUFsQixLQUFLO2dCQVVVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBTVUsU0FBUztzQkFBeEIsS0FBSztnQkFNVSxVQUFVO3NCQUF6QixLQUFLO2dCQU1VLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFLbUUsU0FBUztzQkFBakYsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFzQmYsWUFBWTtzQkFBM0QsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRpb24tbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZ2V0RGVjaW1hbFBhdHRlcm4sIGludGVnZXJQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLXBhdHRlcm5zJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSBcIi4uL2Zvcm0tY29udHJvbC1iYXNlXCI7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuXHJcblxyXG4vKipcclxuICogQ3VzdG9tIHZhbGlkYXRvciB0byBjaGVjayB0aGF0IG1pbi9tYXggYW5kIHBhdHRlcm4gdmFsaWRhdGlvbiBpcyBtZXQgb24gdGhlIG51bWVyaWNib3hcclxuICogY29tcG9uZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbnVtZXJpY2JveFZhbGlkYXRpb24gPSAobWluOiBudW1iZXIgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWNpbWFsczogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhQcmVjaXNpb25EaWdpdHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IFZhbGlkYXRvckZuID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgbGV0IGhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIGVtcHR5IHdlIHdvbid0IGF0dGVtcHQgdG8gdmFsaWRhdGUsIGlmIHRoZXJlIGlzIGEgcmVxdWlyZWRcclxuICAgICAgICAvLyB2YWxpZGF0b3Igd2Ugd2lsbCBuZXZlciBnZXQgaGVyZSB1bnRpbCB0aGVyZSBpcyBhIHZhbHVlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZSAhPT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgbGV0IG51bWVyaWNQYXR0ZXJuOiBSZWdFeHA7XHJcbiAgICAgICAgICAgIGlmIChkZWNpbWFscyAmJiBkZWNpbWFscyA+IDApIHtcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4oZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1heFByZWNpc2lvbkRpZ2l0cykge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpbGwgbmVlZCB0byBjaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgZm9ybWF0dGluZyB3aGVuIGluIG1heCBwcmVjaXNpb24gbW9kZVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBnZXREZWNpbWFsUGF0dGVybihtYXhQcmVjaXNpb25EaWdpdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgYW4gb3B0aW9uYWwgbmVnYXRpdmUgc2lnbiBhbmQgYW55IG51bWJlciBvZiBkaWdpdHMgMC05XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGludGVnZXJQYXR0ZXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIW51bWVyaWNQYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgdG8gYSBudW1iZXIgdGhlbiBiYWNrIHRvIHN0cmluZyByZW1vdmVzIHRyYWlsaW5nIHplcm9zLCBhbmQgdGhlIHJlZ2V4IHJlcGxhY2UgcmVtb3Zlc1xyXG4gICAgICAgICAgICAgICAgLy8gYW55IG5lZ2F0aXZlIHNpZ25zLCBsZWFkaW5nIHplcm9zIG9yIGRlY2ltYWwgcG9pbnRzIGZyb20gdGhlIG51bWJlci5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IE51bWJlcihjb250cm9sLnZhbHVlKS50b1N0cmluZygpLnJlcGxhY2UoL14tPy8sICcnKS5yZXBsYWNlKC8oXjBcXC4pfChcXC4pLywgJycpO1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB2YWwubGVuZ3RoID4gbWF4UHJlY2lzaW9uRGlnaXRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBub3cga25vdyB3ZSBoYXZlIGEgdmFsaWQgbnVtYmVyLCBzbyB3ZSBjYW4gY2FzdCB0aGVzZSB0byBudW1iZXJzXHJcbiAgICAgICAgICAgIC8vIGZvciBwcm9wZXIgcmFuZ2UgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpIDwgbWluKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBOdW1iZXIoY29udHJvbC52YWx1ZSkgPiBtYXgpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljYm94OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbjogbWluLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzOiBkZWNpbWFscyxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQcmVjaXNpb25EaWdpdHM6IG1heFByZWNpc2lvbkRpZ2l0c1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZWMtbnVtZXJpY2JveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbnVtZXJpY2JveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9udW1lcmljYm94LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljYm94Q29tcG9uZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0ZXh0Ym94IGlucHV0J3MgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBkZWNpbWFscyBhbGxvd2VkLiAgSWYgbm90IHN1cHBsaWVkIHRoZSBpbnB1dCB2YWx1ZSB3aWxsIGJlIHZhbGlkYXRlZCBhcyBhXHJcbiAgICAgKiB3aG9sZSBudW1iZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEbyBub3QgdXNlIHdpdGggbWF4UHJlY2lzaW9uRGlnaXRzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ByZWNpc2lvbj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSB0b3RhbCBkaWdpdHMgYSBudW1iZXIgY2FuIGhhdmUgbGVmdCBvciByaWdodCBvZiB0aGUgZGVjaW1hbCBwb2ludC5cclxuICAgICAqIER1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGhvdyBKUyBoYW5kbGVzIG51bWJlcnMsIHRoZSBtYXggdmFsdWUgZm9yIHRoaXMgaXMgMTUuXHJcbiAgICAgKiBOdW1iZXJzIGxvbmdlciB0aGFuIDE1IGRpZ2l0cyBtYXkgY2F1c2Ugcm91bmRpbmcgZXJyb3JzLlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIHNob3dQcmVjaXNpb24gPSB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhQcmVjaXNpb25EaWdpdHM/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWF4IHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXg/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWluIHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW4/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGlucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWZ0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmlnaHRVbml0cz86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHNldCB0byB0cnVlIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGZvcm0gbW9kZWwgYWZ0ZXIgYSBkZWJvdW5jZSBhcyB0aGUgdXNlclxyXG4gICAgICogaW50ZXJhY3RzIHdpdGggdGhlIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b1VwZGF0ZUZvcm1Nb2RlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRleHRib3ggZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFRleHRib3hDb21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdGV4dGJveEVsITogRWxlbWVudFJlZjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW50ZXJuYWwgZm9ybSBtb2RlbCB3ZSB1c2UgdG8gZGlzcGxheSB0aGUgdmFsdWUgd2l0aCBmb3JtYXR0aW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsITogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgIC8qKiBGbGFnIHRvIHRlbGwgdGhlIHBhZ2Ugd2UgZmluYWxseSBjb21wdXRlZCBhIGdyZWF0ZXIgdGhhbiB6ZXJvXHJcbiAgICAgKiAgd2lkdGggZm9yIHVuaXRzIChpZiBhcHBsaWNhYmxlKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVuaXRzV2lkdGhDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEZsYWcgdXNlZCB0byBmaWx0ZXIgdGhlIGZvcm0gbW9kZWxzIHZhbHVlIGNoYW5nZXMgc3Vic2NyaXB0aW9uXHJcbiAgICAgKiAgdG8gcHJldmVudCB0aGUgdGV4dGJveCBtb2RlbCBmcm9tIGJlaW5nIGZvcm1hdHRlZCBhcyB0aGUgZm9ybSBtb2RlbCBpcyB1cGRhdGVkXHJcbiAgICAgKiAgcHJvZ3JhbW1hdGljYWxseSB3aGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhdXRvVXBkYXRpbmdGb3JtTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRleHRib3ggaW5wdXQgY29udHJvbFxyXG4gICAqL1xyXG4gICAgQFZpZXdDaGlsZCgndGV4dGJveCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdGV4dGJveElucHV0ITogVGV4dGJveENvbXBvbmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIGZvcm1Hcm91cEhlbHBlcjogRm9ybUdyb3VwSGVscGVyLFxyXG4gICAgICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcih2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsIGZvcm1Hcm91cEhlbHBlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIEFmdGVyVmlld0luaXQgbGlmZS1jeWNsZSBob29rXHJcbiAgICAgKiBTdWJzY3JpYmUgdG8gdGV4dGJveCBtb2RlbCB2YWx1ZSBjaGFuZ2VzIGlmIHRoZSBob3N0aW5nXHJcbiAgICAgKiBwYWdlIGhhcyBvcHRlZCBpbiBmb3IgdGhpcyBjb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlRm9ybU1vZGVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSxcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIG9uQ2hhbmdlcyBsaWZlLWN5Y2xlIGhvb2tcclxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3MgfCBMaWZlLWN5Y2xlIGhvb2tzfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIC8vIElmIGVpdGhlciB1bml0cyBjaGFuZ2UgYWZ0ZXIgd2UndmUgY2FsY3VsYXRlZCxcclxuICAgICAgICAvLyByZXNldCB0aGUgZmxhZyBzbyB3ZSBjYW4gcmVhY3QgYW5kIHJlZHJhd1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnJpZ2h0VW5pdHMgfHwgY2hhbmdlcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBvbkluaXQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIElmIHVuaXRzIGlzIGRlZmluZWQsIHNldCB0aGUgcG9zaXRpb24gYW5kIGxpc3RlbiBmb3Igc3RhdHVzIGNoYW5nZXMgc28gd2VcclxuICAgICAqIGNhbiB1cGRhdGUgdGhlIHBvc2l0aW9uaW5nIG9mIHRoZSB1bml0cyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gbW9kZWwgYW5kIHN5bmNocm9uaXplXHJcbiAgICAgICAgLy8gZGlzYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuZm9ybU1vZGVsLnZhbHVlLCBkaXNhYmxlZDogdGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQgfSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCdzIGVycm9ycyB3aGVuIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgc3RhdHVzIGNoYW5nZXNcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Nb2RlbC5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnModGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVycm9ycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBTeW5jaHJvbml6ZSBkaXNhYmxlZCBzdGF0ZSBiZXR3ZWVuIGZvcm0gbW9kZWwgYW5kIGludGVybmFsIHRleHRib3ggZm9ybSBtb2RlbFxyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0ZXh0Ym94IHZhbGlkYXRvcnNcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh0aGlzLmdldFZhbGlkYXRvcnMoKSk7XHJcblxyXG4gICAgICAgIC8vIE5vdyB0aGF0IHRoZSB0ZXh0Ym94IGlzIHNldCB1cCB3ZSB3aWxsIHNldCBpdCdzIHZhbHVlIHRvIHdoYXRldmVyIHRoZVxyXG4gICAgICAgIC8vIGZvcm0gbW9kZWwgaGFkIHdoZW4gd2UgaW5pdGlhbGl6ZWRcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKHRoaXMuZm9ybU1vZGVsLnZhbHVlKSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBmb3JtIG1vZGVsJ3MgdmFsdWUgY2hhbmdlcyBwcm9ncmFtbWF0aWNhbGx5IHdlIG5lZWQgdG8gdXBkYXRlIHRoZVxyXG4gICAgICAgIC8vIHRleHRib3ggZm9ybSBtb2RlbFxyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlciBvdXQgd2hlbiB3ZSBhcmUgdXBkYXRpbmcgaXQgcHJvZ3JhbW1hdGljYWxseSBpZiB0aGVcclxuICAgICAgICAgICAgLy8gaG9zdGluZyBwYWdlIGhhcyBvcHRlZCBpbnRvIHRoZSBhdXRvIHVwZGF0aW5nIGlucHV0XHJcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwpLFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHRleHRib3ggc3RhdHVzIGNoYW5nZXMgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxlZnQgdW5pdHMgcG9zaXRpb24gYmVjYXVzZVxyXG4gICAgICAgIC8vIHdlIHdhbnQgdG8gbWFrZSByb29tIGZvciB0aGUgaW52YWxpZCBpY29uXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdFVuaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25MZWZ0VW5pdHMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgYWZ0ZXJWaWV3Q2hlY2tlZCBsaWZlY3ljbGUgaG9va1xyXG4gICAgICogU2hvdyB0aGUgdW5pdHMgZWxlbWVudCBpZiB1bml0cyBpcyBkZWZpbmVkLiBSdW5zIGFmdGVyIGV2ZXJ5IG5nT25DaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCh0aGlzLmxlZnRVbml0cyB8fCB0aGlzLnJpZ2h0VW5pdHMpICYmICF0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1VuaXRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gdGhhdCBidWlsZHMgYW5kIHJldHVybnMgYSBWYWxpZGF0b3JGbiBhcnJheSB0byBzZXQgb24gdGhlIGZvcm0gY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XHJcbiAgICAgICAgbGV0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG51bWVyaWNib3hWYWxpZGF0aW9uKHRoaXMubWluLCB0aGlzLm1heCwgdGhpcy5kZWNpbWFscywgdGhpcy5tYXhQcmVjaXNpb25EaWdpdHMpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1cyBvdXQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIFRleHRib3ggY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkZvY3VzT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsVmFsdWUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZ1bmN0aW9uIHRvIHNldCBmb2N1cyBvbiBhbiBpbnB1dCBwcm9ncmFtYXRpY2FsbHkgYWZ0ZXIgdGhlIHBhZ2VcclxuICAgICogaGFkIGJlZW4gcmVuZGVyZWQuICBUaGUgaGlnaGxpZ2h0IHRleHQgZmxhZyB3aWxsIHNlbGVjdCB0aGUgdGV4dFxyXG4gICAgKiB3aXRoaW4gdGhlIGlucHV0IGlmIHBhc3NlZCBpbiBhbmQgdHJ1ZVxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzZXRGb2N1cyhoaWdobGlnaHRUZXh0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGV4dGJveElucHV0LnNldEZvY3VzKGhpZ2hsaWdodFRleHQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdGhlIHRleHRib3ggbW9kZWwgdXBkYXRlcyB3ZSBuZWVkIHRvIGFkZCBzb21lIGRpc3BsYXkgZm9ybWF0dGluZyBmb3JcclxuICAgICAqIGRpc3BsYXkgaW4gdGhlIHRleHRib3ggYW5kIGNhc3QgdGhlIHRleHRib3ggbW9kZWwgdG8gYSBudW1iZXIuIEF2b2lkIHVwZGF0aW5nXHJcbiAgICAgKiB0aGUgZm9ybSBtb2RlbCB3aGVuIHRoZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZWNhdXNlIGxpc3RlbmVycyB3aWxsIGZpcmUgZm9yIG5vIHJlYXNvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1Nb2RlbFZhbHVlKGlzRm9jdXNPdXQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZUZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICAvLyBNYWtlIGl0IHNvIHZhbHVlIGNoYW5nZXMgb24gdGhlIGZvcm0gbW9kZWwgZG8gbm90IGdldCB0cmlnZ2VyZWRcclxuICAgICAgICAgICAgLy8gYXMgd2UgY2hhbmdlIGl0IHByb2dyYW1tYXRpY2FsbHkuICBXZSBkbyBub3Qgd2FudCB0aGUgdGV4dGJveFxyXG4gICAgICAgICAgICAvLyBtb2RlbCB0byBiZSB1cGRhdGVkIHdoaWxlIHRoZSB1c2VyIGlzIGluIHRoZSBpbnB1dFxyXG4gICAgICAgICAgICB0aGlzLmF1dG9VcGRhdGluZ0Zvcm1Nb2RlbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbGlkIHx8IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb3V0IHdpdGggbnVsbCBmb3IgdGhlIG51bWJlciwgaWYgdGhlIHRleHRib3ggdmFsdWUgaXMgbm90IGEgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGNsZWFyIGl0IG91dCBvbiBmb2N1cyBvdXRcclxuICAgICAgICAgICAgICAgIGxldCBudW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGV4dGJveCBtb2RlbCBpcyBhIG51bWJlciBiZWZvcmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAgICAgICAgIC8vIGZvcm0gbW9kZWwgdmFsdWUgd2l0aCBpdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSAmJiAhaXNOYU4odGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE91ciB2YWx1ZSBpcyBhIGxlZ2l0IG51bWJlciwgb24gZm9jdXMgb3V0IHdlIHdpbGwgZm9ybWF0IGl0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IE51bWJlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGlmIG5vdCBkb24ndCBzZXQgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXIgY2FsbHNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgIT09IG51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShudW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGV4dGJveCBtb2RlbCBpcyBub3QgYSBudW1iZXIsIGNoZWNrIHRvIHNlZSBpZiBvdXIgZm9ybSBtb2RlbCBoYXMgYSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpZiBzbyBjbGVhciBpdCBvdXRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdpbGwgdXBkYXRlIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgd2l0aCBmb3JtYXR0aW5nIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgICAgLy8gb24gRm9jdXMgb3V0LiAgVGhpcyB3b3JrcyB3ZWxsIGZvciB0aGUgdXNlciB3aGV0aGVyIHRoZSBhdXRvIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgLy8gaXMgb3B0ZWQgaW4gb3Igbm90XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c091dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIobnVtYmVyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRpc3BsYXksIGp1c3QgZW5zdXJpbmcgd2UgcmVzZXQgb3VyIGZsYWcgdGhhdCBmaWx0ZXJzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmb3JtIG1vZGVsIHZhbHVlIGNoYW5nZXNcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9VcGRhdGluZ0Zvcm1Nb2RlbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYSBudW1iZXIgdmFsdWUgdG8gdGhlIGZvcm1tYXRlZCBkaXNwbGF5IHN0cmluZy4gSWYgdGhlcmUgaXMgbm8gdmFsdWVcclxuICAgICAqIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9ybWF0RGlzcGxheU51bWJlcih2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGNhbGxpbmcgdG9GaXhlZCBpZiB0aGUgdmFsdWUgaXNuJ3QgYSBudW1iZXIuICBUaGlzIGlzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgIC8vIGlmIHBhdGNoaW5nIGEgdmFsdWUgZnJvbSBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQgYXMgeW91IGRvbid0IGhhdmVcclxuICAgICAgICAgICAgLy8gdHlwZSBjaGVja2luZyB0aGVyZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93UHJlY2lzaW9uICYmIHRoaXMuZGVjaW1hbHMgJiYgIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQodGhpcy5kZWNpbWFscyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBvc2l0aW9uIHRoZSB1bml0cyBlbGVtZW50IGFuZCBzZXQgdGhlIHBhZGRpbmcgaW4gdGhlIHRleHRib3ggaW5wdXQgYmFzZWRcclxuICAgICAqIG9uIHRoZSB3aWR0aCBvZiB0aGUgdW5pdHMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uUmlnaHRVbml0cygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgdW5pdHNFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVuaXRzLXJpZ2h0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGlucHV0RWwsICdwYWRkaW5nLXJpZ2h0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkxlZnRVbml0cygpIHtcclxuICAgICAgICBsZXQgdW5pdHNFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVuaXRzLWxlZnQnKTtcclxuICAgICAgICBsZXQgaW5wdXRFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuXHJcbiAgICAgICAgaWYgKHVuaXRzRWwgJiYgaW5wdXRFbCkge1xyXG4gICAgICAgICAgICBsZXQgdW5pdHNXaWR0aCA9IHVuaXRzRWwub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAodW5pdHNXaWR0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudW5pdHNXaWR0aENhbGN1bGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcGFkZGluZyA9IHVuaXRzV2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKHVuaXRzRWwpLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmcgKz0gcGFyc2VJbnQobGVmdFBvc2l0aW9uLnJlcGxhY2UoJ3B4JywgJycpLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGlucHV0RWwsICdwYWRkaW5nLWxlZnQnLCBwYWRkaW5nICsgJ3B4Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuaXRzIGVsZW1lbnQgdG8gdGhlIHRleHRib3ggZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNob3dVbml0cygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgaW5wdXRXcmFwcGVyID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtd3JhcHBlcicpO1xyXG5cclxuICAgICAgICBpZiAoaW5wdXRXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pdHNFbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRoaXMubGVmdFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdsZWZ0JywgdGhpcy5sZWZ0VW5pdHMpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25MZWZ0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHRVbml0cykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLnJpZ2h0VW5pdHMpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGlucHV0V3JhcHBlciwgdGhpcy5tYWtlVW5pdEVsZW1lbnQoJ3JpZ2h0JywgdGhpcy5yaWdodFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uUmlnaHRVbml0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFrZVVuaXRFbGVtZW50KHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcsIHRleHQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnY2xhc3MnLCBgdW5pdHMgdW5pdHMtJHtzaWRlfWApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdpZCcsIGAke3RoaXMuaWR9X3VuaXRzYCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ3N0eWxlJywgJ3BvaW50ZXItZXZlbnRzOiBub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiB1bml0c0VsO1xyXG4gICAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW2NsYXNzLmludmFsaWRdPVwiZm9ybU1vZGVsPy5pbnZhbGlkICYmIChmb3JtTW9kZWw/LnRvdWNoZWQpXCI+XHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIlxyXG4gICAgICAgICBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCAmJiBmb3JtTW9kZWw/LnRvdWNoZWQgJiYgZm9ybU1vZGVsPy5pbnZhbGlkXCI+e3t2YWxpZGF0aW9uRXJyb3JzIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgPC9sYWJlbD5cclxuICA8IS0tIFNldHRpbmcgdGhlIG1heGxlbmd0aCB0byAxMyB0byBjb21iYXQgdGhlIHVzZXIgZnJvbSBlbnRlcmluZyB0b28gbGFyZ2Ugb2YgYSBudW1iZXJcclxuICAgICAgICAgZm9yIGphdmFzY3JpcHQgdG8gc3VwcG9ydC4gIElmIHRoZSB1c2VyIGVudGVycyBhbGwgMTMgY2hhcmFjdGVycyBhcyBudW1iZXJzIGFuZCB3ZSBoYXZlIHNob3dQcmVjaXNpb24gc2V0LCBhZGRpbmcgdGhlXHJcbiAgICAgICAgIGRlY2ltYWwgYW5kIHRoZSBlbXB0eSB6ZXJvIGNoYXJhY3RlcnMgd2lsbCBnZXQgdGhlbSBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0byBlZGl0IGl0IHRoZXkgbXVzdCByZW1vdmUgY2hhcmFjdGVyc1xyXG4gICAgICAgICBhcyB3ZSB3b3VsZCBwdXNoIHRoZW0gcGFzdCB0aGUgbGltaXQgLS0+XHJcbiAgPGVjLXRleHRib3ggW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICAjdGV4dGJveFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1pbnB1dCBtYi0wXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWF4UHJlY2lzaW9uRGlnaXRzID8gbWF4UHJlY2lzaW9uRGlnaXRzICsgMyA6IDEzXCJcclxuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCJ0b29sdGlwXCJcclxuICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+XHJcbiAgPC9lYy10ZXh0Ym94PlxyXG48L2Rpdj5cclxuIl19