@tetacom/ng-components 1.4.22 → 1.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 (324) hide show
  1. package/.eslintrc.json +3 -5
  2. package/component/dropdown/dropdown-base.d.ts +1 -1
  3. package/directive/dynamic-content-base.directive.d.ts +1 -1
  4. package/fesm2022/tetacom-ng-components.mjs +515 -489
  5. package/fesm2022/tetacom-ng-components.mjs.map +1 -1
  6. package/package.json +3 -5
  7. package/pipe/prepend-zero/prepend-zero.pipe.d.ts +7 -0
  8. package/pipe/prepend-zero/public-api.d.ts +1 -0
  9. package/pipe/public-api.d.ts +1 -0
  10. package/style/badge.scss +6 -4
  11. package/style/checkbox.scss +3 -1
  12. package/style/chips.scss +3 -1
  13. package/style/icon.scss +3 -1
  14. package/style/message.scss +3 -1
  15. package/style/navigation.scss +3 -1
  16. package/style/presets/view-types.scss +3 -1
  17. package/style/toggle.scss +3 -1
  18. package/style/toolbar.scss +3 -1
  19. package/esm2022/common/contract/auto-close-ignore-case.mjs +0 -2
  20. package/esm2022/common/contract/constructor-type.mjs +0 -2
  21. package/esm2022/common/contract/dynamic-data.mjs +0 -10
  22. package/esm2022/common/contract/i-dictionary.mjs +0 -2
  23. package/esm2022/common/contract/i-id-name.mjs +0 -2
  24. package/esm2022/common/contract/i-id.mjs +0 -2
  25. package/esm2022/common/contract/i-rect.mjs +0 -2
  26. package/esm2022/common/contract/i-tree-data.mjs +0 -2
  27. package/esm2022/common/contract/public-api.mjs +0 -10
  28. package/esm2022/common/contract/teta-content-ref.mjs +0 -8
  29. package/esm2022/common/enum/align.enum.mjs +0 -13
  30. package/esm2022/common/enum/public-api.mjs +0 -4
  31. package/esm2022/common/enum/teta-size.enum.mjs +0 -9
  32. package/esm2022/common/enum/vertical-align.enum.mjs +0 -11
  33. package/esm2022/common/model/public-api.mjs +0 -2
  34. package/esm2022/common/model/view-type.model.mjs +0 -2
  35. package/esm2022/common/public-api.mjs +0 -6
  36. package/esm2022/common/service/click.service.mjs +0 -23
  37. package/esm2022/common/service/dynamic-component.service.mjs +0 -93
  38. package/esm2022/common/service/overlay-container.service.mjs +0 -41
  39. package/esm2022/common/service/public-api.mjs +0 -4
  40. package/esm2022/common/util/array-util.mjs +0 -121
  41. package/esm2022/common/util/dom-util.mjs +0 -19
  42. package/esm2022/common/util/position-util.mjs +0 -136
  43. package/esm2022/common/util/public-api.mjs +0 -4
  44. package/esm2022/component/accordion/accordion/accordion.component.mjs +0 -17
  45. package/esm2022/component/accordion/accordion-content.directive.mjs +0 -17
  46. package/esm2022/component/accordion/accordion-head/accordion-head.component.mjs +0 -51
  47. package/esm2022/component/accordion/accordion-item/accordion-item.component.mjs +0 -62
  48. package/esm2022/component/accordion/public-api.mjs +0 -5
  49. package/esm2022/component/autocomplete/autocomplete/autocomplete.component.mjs +0 -13
  50. package/esm2022/component/autocomplete/public-api.mjs +0 -2
  51. package/esm2022/component/avatar/avatar/avatar.component.mjs +0 -55
  52. package/esm2022/component/avatar/model/avatar-color.enum.mjs +0 -22
  53. package/esm2022/component/avatar/public-api.mjs +0 -2
  54. package/esm2022/component/button/button/button.component.mjs +0 -67
  55. package/esm2022/component/button/public-api.mjs +0 -2
  56. package/esm2022/component/chart-3d/chart3d/chart3d.component.mjs +0 -241
  57. package/esm2022/component/chart-3d/model/base-3d-point.mjs +0 -2
  58. package/esm2022/component/chart-3d/model/chart-3d-options.mjs +0 -7
  59. package/esm2022/component/chart-3d/model/public-api.mjs +0 -3
  60. package/esm2022/component/chart-3d/model/series-3d.mjs +0 -7
  61. package/esm2022/component/chart-3d/public-api.mjs +0 -3
  62. package/esm2022/component/checkbox/checkbox/checkbox.component.mjs +0 -137
  63. package/esm2022/component/checkbox/public-api.mjs +0 -2
  64. package/esm2022/component/date-picker/base-calendar.mjs +0 -121
  65. package/esm2022/component/date-picker/base-picker.mjs +0 -109
  66. package/esm2022/component/date-picker/date-picker/date-calendar/date-calendar.component.mjs +0 -50
  67. package/esm2022/component/date-picker/date-picker/date-picker.component.mjs +0 -228
  68. package/esm2022/component/date-picker/date-range/date-range.component.mjs +0 -233
  69. package/esm2022/component/date-picker/date-range/range-calendar/range-calendar.component.mjs +0 -118
  70. package/esm2022/component/date-picker/day-picker/day-item/day-item.component.mjs +0 -15
  71. package/esm2022/component/date-picker/day-picker/day-picker.component.mjs +0 -118
  72. package/esm2022/component/date-picker/model/date-period.mjs +0 -7
  73. package/esm2022/component/date-picker/model/date-picker-mode.enum.mjs +0 -7
  74. package/esm2022/component/date-picker/model/day-model.mjs +0 -13
  75. package/esm2022/component/date-picker/model/from-to.model.mjs +0 -2
  76. package/esm2022/component/date-picker/model/min-max-date.model.mjs +0 -2
  77. package/esm2022/component/date-picker/model/public-api.mjs +0 -6
  78. package/esm2022/component/date-picker/month-picker/month-picker.component.mjs +0 -47
  79. package/esm2022/component/date-picker/public-api.mjs +0 -6
  80. package/esm2022/component/date-picker/year-picker/scroll-to-selected-year.directive.mjs +0 -27
  81. package/esm2022/component/date-picker/year-picker/year-picker.component.mjs +0 -48
  82. package/esm2022/component/delimiter/delimiter/delimiter.component.mjs +0 -63
  83. package/esm2022/component/delimiter/public-api.mjs +0 -2
  84. package/esm2022/component/divider/divider/divider.component.mjs +0 -18
  85. package/esm2022/component/divider/public-api.mjs +0 -2
  86. package/esm2022/component/dropdown/dropdown/dropdown.component.mjs +0 -30
  87. package/esm2022/component/dropdown/dropdown-base.mjs +0 -224
  88. package/esm2022/component/dropdown/dropdown-content.directive.mjs +0 -18
  89. package/esm2022/component/dropdown/dropdown-head.directive.mjs +0 -19
  90. package/esm2022/component/dropdown/dropdown.directive.mjs +0 -38
  91. package/esm2022/component/dropdown/public-api.mjs +0 -5
  92. package/esm2022/component/dynamic-component/popup-content/popup-content.component.mjs +0 -53
  93. package/esm2022/component/dynamic-component/public-api.mjs +0 -2
  94. package/esm2022/component/expand-card/expand-card/expand-card.component.mjs +0 -34
  95. package/esm2022/component/expand-card/expand-item/expand-item.component.mjs +0 -25
  96. package/esm2022/component/expand-card/public-api.mjs +0 -3
  97. package/esm2022/component/expand-panel/expand-panel/expand-panel.component.mjs +0 -65
  98. package/esm2022/component/expand-panel/expand-panel-content.directive.mjs +0 -17
  99. package/esm2022/component/expand-panel/expand-panel-head.directive.mjs +0 -17
  100. package/esm2022/component/expand-panel/public-api.mjs +0 -4
  101. package/esm2022/component/file-upload/file-item/file-item.component.mjs +0 -13
  102. package/esm2022/component/file-upload/file-upload-area/file-upload-area.component.mjs +0 -87
  103. package/esm2022/component/file-upload/public-api.mjs +0 -3
  104. package/esm2022/component/filter/base/filter-base.mjs +0 -10
  105. package/esm2022/component/filter/base/filter-component-base.mjs +0 -3
  106. package/esm2022/component/filter/boolean-filter/boolean-filter.component.mjs +0 -63
  107. package/esm2022/component/filter/contarct/boolean-filter.mjs +0 -8
  108. package/esm2022/component/filter/contarct/date-filter-value.mjs +0 -9
  109. package/esm2022/component/filter/contarct/date-filter.mjs +0 -11
  110. package/esm2022/component/filter/contarct/filter-component-map.mjs +0 -15
  111. package/esm2022/component/filter/contarct/filter-item.mjs +0 -34
  112. package/esm2022/component/filter/contarct/filter-state.mjs +0 -145
  113. package/esm2022/component/filter/contarct/i-filter.mjs +0 -2
  114. package/esm2022/component/filter/contarct/list-filter.mjs +0 -12
  115. package/esm2022/component/filter/contarct/numeric-filter-value.mjs +0 -10
  116. package/esm2022/component/filter/contarct/numeric-filter.mjs +0 -9
  117. package/esm2022/component/filter/contarct/sort-param.mjs +0 -14
  118. package/esm2022/component/filter/contarct/string-filter.mjs +0 -12
  119. package/esm2022/component/filter/date-filter/date-filter.component.mjs +0 -64
  120. package/esm2022/component/filter/enum/filter-type.enum.mjs +0 -10
  121. package/esm2022/component/filter/enum/list-filter-type.enum.mjs +0 -6
  122. package/esm2022/component/filter/enum/string-filter-type.enum.mjs +0 -20
  123. package/esm2022/component/filter/filter-host/filter-host.component.mjs +0 -79
  124. package/esm2022/component/filter/list-filter/list-filter.component.mjs +0 -96
  125. package/esm2022/component/filter/numeric-filter/numeric-filter.component.mjs +0 -64
  126. package/esm2022/component/filter/public-api.mjs +0 -23
  127. package/esm2022/component/filter/string-filter/string-filter.component.mjs +0 -64
  128. package/esm2022/component/icon/icon/icon.component.mjs +0 -54
  129. package/esm2022/component/icon/icon-file/icon-file.component.mjs +0 -27
  130. package/esm2022/component/icon/icon-sprite.directive.mjs +0 -34
  131. package/esm2022/component/icon/icon.service.mjs +0 -58
  132. package/esm2022/component/icon/public-api.mjs +0 -5
  133. package/esm2022/component/input/color-input/color-input.component.mjs +0 -71
  134. package/esm2022/component/input/form-group-title/form-group-title.component.mjs +0 -18
  135. package/esm2022/component/input/input/input.component.mjs +0 -38
  136. package/esm2022/component/input/public-api.mjs +0 -6
  137. package/esm2022/component/input/text-field/text-field.component.mjs +0 -94
  138. package/esm2022/component/message/message/message.component.mjs +0 -76
  139. package/esm2022/component/message/message-host/message-host.component.mjs +0 -84
  140. package/esm2022/component/message/message.service.mjs +0 -35
  141. package/esm2022/component/message/model/message.mjs +0 -23
  142. package/esm2022/component/message/public-api.mjs +0 -5
  143. package/esm2022/component/modal/dialog/dialog.component.mjs +0 -46
  144. package/esm2022/component/modal/dialog.service.mjs +0 -40
  145. package/esm2022/component/modal/modal-container/modal-container.component.mjs +0 -77
  146. package/esm2022/component/modal/modal.module.mjs +0 -32
  147. package/esm2022/component/modal/modal.service.mjs +0 -122
  148. package/esm2022/component/modal/model/current-modal.mjs +0 -3
  149. package/esm2022/component/modal/model/i-modal-config.mjs +0 -2
  150. package/esm2022/component/modal/model/i-modal-result.mjs +0 -2
  151. package/esm2022/component/modal/model/modal-close-reason.enum.mjs +0 -8
  152. package/esm2022/component/modal/model/modal-instance.mjs +0 -34
  153. package/esm2022/component/modal/public-api.mjs +0 -11
  154. package/esm2022/component/pager/model/pager-state.mjs +0 -51
  155. package/esm2022/component/pager/pager/pager.component.mjs +0 -13
  156. package/esm2022/component/pager/public-api.mjs +0 -4
  157. package/esm2022/component/pager/util/pager-util.mjs +0 -6
  158. package/esm2022/component/panel/panel/panel.component.mjs +0 -45
  159. package/esm2022/component/panel/public-api.mjs +0 -2
  160. package/esm2022/component/progress-bar/progress-bar/progress-bar.component.mjs +0 -130
  161. package/esm2022/component/progress-bar/public-api.mjs +0 -2
  162. package/esm2022/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +0 -24
  163. package/esm2022/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +0 -133
  164. package/esm2022/component/property-grid/property-grid/property-grid-item-description.directive.mjs +0 -20
  165. package/esm2022/component/property-grid/property-grid/property-grid.component.mjs +0 -97
  166. package/esm2022/component/property-grid/public-api.mjs +0 -4
  167. package/esm2022/component/public-api.mjs +0 -72
  168. package/esm2022/component/radio/public-api.mjs +0 -3
  169. package/esm2022/component/radio/radio/radio.component.mjs +0 -240
  170. package/esm2022/component/radio/radio-button/radio-button.component.mjs +0 -63
  171. package/esm2022/component/resize-panel/public-api.mjs +0 -2
  172. package/esm2022/component/resize-panel/resize-panel/resize-panel.component.mjs +0 -166
  173. package/esm2022/component/select/public-api.mjs +0 -4
  174. package/esm2022/component/select/select/select.component.mjs +0 -272
  175. package/esm2022/component/select/select-option.directive.mjs +0 -17
  176. package/esm2022/component/select/select-value.directive.mjs +0 -17
  177. package/esm2022/component/sidebar/public-api.mjs +0 -3
  178. package/esm2022/component/sidebar/sidebar/sidebar.component.mjs +0 -48
  179. package/esm2022/component/sidebar/sidebar-position.enum.mjs +0 -8
  180. package/esm2022/component/stepper/public-api.mjs +0 -2
  181. package/esm2022/component/stepper/stepper/stepper.component.mjs +0 -16
  182. package/esm2022/component/switch/public-api.mjs +0 -3
  183. package/esm2022/component/switch/switch/switch.component.mjs +0 -61
  184. package/esm2022/component/switch/switch-button/switch-button.component.mjs +0 -47
  185. package/esm2022/component/switch/switch.service.mjs +0 -21
  186. package/esm2022/component/table/base/cell-component-base.mjs +0 -158
  187. package/esm2022/component/table/base/detail-component-base.mjs +0 -3
  188. package/esm2022/component/table/base/head-cell-component-base.mjs +0 -18
  189. package/esm2022/component/table/cell/cell.component.mjs +0 -28
  190. package/esm2022/component/table/cell-host/cell-host.component.mjs +0 -56
  191. package/esm2022/component/table/contract/cell-components-map.mjs +0 -15
  192. package/esm2022/component/table/contract/column-reorder-event.mjs +0 -7
  193. package/esm2022/component/table/contract/column-resize-event.mjs +0 -7
  194. package/esm2022/component/table/contract/head-dropdown-tab.mjs +0 -2
  195. package/esm2022/component/table/contract/i-cell-coordinates.mjs +0 -2
  196. package/esm2022/component/table/contract/i-cell-event.mjs +0 -2
  197. package/esm2022/component/table/contract/i-cell-instance.mjs +0 -2
  198. package/esm2022/component/table/contract/i-cell-value.mjs +0 -2
  199. package/esm2022/component/table/contract/public-api.mjs +0 -13
  200. package/esm2022/component/table/contract/sort-event.mjs +0 -7
  201. package/esm2022/component/table/contract/table-column-store.mjs +0 -12
  202. package/esm2022/component/table/contract/table-column.mjs +0 -44
  203. package/esm2022/component/table/contract/table-row.mjs +0 -7
  204. package/esm2022/component/table/default/boolean-cell/boolean-cell.component.mjs +0 -39
  205. package/esm2022/component/table/default/date-cell/date-cell.component.mjs +0 -40
  206. package/esm2022/component/table/default/date-time-cell/date-time-cell.component.mjs +0 -40
  207. package/esm2022/component/table/default/default-head-cell/default-head-cell.component.mjs +0 -49
  208. package/esm2022/component/table/default/list-cell/list-cell.component.mjs +0 -60
  209. package/esm2022/component/table/default/numeric-cell/numeric-cell.component.mjs +0 -39
  210. package/esm2022/component/table/default/string-cell/string-cell.component.mjs +0 -40
  211. package/esm2022/component/table/enum/aggregation-type.enum.mjs +0 -9
  212. package/esm2022/component/table/enum/edit-event.enum.mjs +0 -7
  213. package/esm2022/component/table/enum/edit-type.enum.mjs +0 -7
  214. package/esm2022/component/table/enum/public-api.mjs +0 -5
  215. package/esm2022/component/table/enum/select-type.enum.mjs +0 -7
  216. package/esm2022/component/table/head-cell/head-cell.component.mjs +0 -204
  217. package/esm2022/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +0 -50
  218. package/esm2022/component/table/head-cell-host/head-cell-host.component.mjs +0 -60
  219. package/esm2022/component/table/public-api.mjs +0 -42
  220. package/esm2022/component/table/selection-cell/selection-cell.component.mjs +0 -46
  221. package/esm2022/component/table/selection-head-cell/selection-head-cell.component.mjs +0 -45
  222. package/esm2022/component/table/service/table.service.mjs +0 -650
  223. package/esm2022/component/table/table/table.component.mjs +0 -470
  224. package/esm2022/component/table/table-body/table-body.component.mjs +0 -210
  225. package/esm2022/component/table/table-head/filter-dropdown-tab/filter-dropdown-tab.component.mjs +0 -57
  226. package/esm2022/component/table/table-head/main-dropdown-tab/main-dropdown-tab.component.mjs +0 -89
  227. package/esm2022/component/table/table-head/table-head.component.mjs +0 -76
  228. package/esm2022/component/table/table-head/visibility-dropdown-tab/visibility-dropdown-tab.component.mjs +0 -154
  229. package/esm2022/component/table/table-head-group/table-head-group.component.mjs +0 -72
  230. package/esm2022/component/table/table-row/table-row.component.mjs +0 -42
  231. package/esm2022/component/table/util/public-api.mjs +0 -3
  232. package/esm2022/component/table/util/state-util.mjs +0 -146
  233. package/esm2022/component/table/util/table-util.mjs +0 -133
  234. package/esm2022/component/tabs/public-api.mjs +0 -11
  235. package/esm2022/component/tabs/tab/tab.component.mjs +0 -42
  236. package/esm2022/component/tabs/tab-content.directive.mjs +0 -17
  237. package/esm2022/component/tabs/tab-title.directive.mjs +0 -17
  238. package/esm2022/component/tabs/tabs/tabs.component.mjs +0 -82
  239. package/esm2022/component/theme-switch/public-api.mjs +0 -3
  240. package/esm2022/component/theme-switch/theme-switch/theme-switch.component.mjs +0 -30
  241. package/esm2022/component/theme-switch/theme-switch.service.mjs +0 -34
  242. package/esm2022/component/toggle/public-api.mjs +0 -2
  243. package/esm2022/component/toggle/toggle/toggle.component.mjs +0 -79
  244. package/esm2022/component/toolbar/public-api.mjs +0 -5
  245. package/esm2022/component/toolbar/toolbar/toolbar.component.mjs +0 -26
  246. package/esm2022/component/tree/public-api.mjs +0 -4
  247. package/esm2022/component/tree/tree/tree.component.mjs +0 -143
  248. package/esm2022/component/tree/tree-item/tree-item.component.mjs +0 -75
  249. package/esm2022/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +0 -28
  250. package/esm2022/component/tree/tree.service.mjs +0 -40
  251. package/esm2022/directive/auto-position/auto-position.directive.mjs +0 -71
  252. package/esm2022/directive/auto-position/public-api.mjs +0 -2
  253. package/esm2022/directive/click-outside/click-outside.directive.mjs +0 -66
  254. package/esm2022/directive/click-outside/public-api.mjs +0 -2
  255. package/esm2022/directive/context-menu/context-menu.directive.mjs +0 -119
  256. package/esm2022/directive/context-menu/public-api.mjs +0 -2
  257. package/esm2022/directive/disable-control/disable-control.directive.mjs +0 -35
  258. package/esm2022/directive/disable-control/public-api.mjs +0 -2
  259. package/esm2022/directive/drag-drop/drag-container.directive.mjs +0 -92
  260. package/esm2022/directive/drag-drop/drag-drop.service.mjs +0 -145
  261. package/esm2022/directive/drag-drop/drag-placeholder.directive.mjs +0 -15
  262. package/esm2022/directive/drag-drop/drag-preview.directive.mjs +0 -17
  263. package/esm2022/directive/drag-drop/drag.directive.mjs +0 -138
  264. package/esm2022/directive/drag-drop/model/drag-container-instance.mjs +0 -8
  265. package/esm2022/directive/drag-drop/model/drag-instance.mjs +0 -7
  266. package/esm2022/directive/drag-drop/model/drag-process.mjs +0 -2
  267. package/esm2022/directive/drag-drop/model/drag-selection.mjs +0 -2
  268. package/esm2022/directive/drag-drop/model/drop-event.mjs +0 -2
  269. package/esm2022/directive/drag-drop/model/drop-target.mjs +0 -2
  270. package/esm2022/directive/drag-drop/model/point.mjs +0 -2
  271. package/esm2022/directive/drag-drop/model/public-api.mjs +0 -8
  272. package/esm2022/directive/drag-drop/public-api.mjs +0 -7
  273. package/esm2022/directive/drag-sort/drag-sort-container.directive.mjs +0 -65
  274. package/esm2022/directive/drag-sort/drag-sort-event.mjs +0 -2
  275. package/esm2022/directive/drag-sort/drag-sort-item.directive.mjs +0 -111
  276. package/esm2022/directive/drag-sort/public-api.mjs +0 -4
  277. package/esm2022/directive/dynamic-content-base.directive.mjs +0 -80
  278. package/esm2022/directive/highlight/highlight.directive.mjs +0 -72
  279. package/esm2022/directive/highlight/public-api.mjs +0 -2
  280. package/esm2022/directive/hint/hint.directive.mjs +0 -102
  281. package/esm2022/directive/hint/public-api.mjs +0 -2
  282. package/esm2022/directive/let/let.directive.mjs +0 -39
  283. package/esm2022/directive/let/public-api.mjs +0 -2
  284. package/esm2022/directive/loader/loader.directive.mjs +0 -85
  285. package/esm2022/directive/loader/public-api.mjs +0 -2
  286. package/esm2022/directive/no-autofill/no-autofill.directive.mjs +0 -31
  287. package/esm2022/directive/no-autofill/public-api.mjs +0 -2
  288. package/esm2022/directive/only-number/only-number.directive.mjs +0 -184
  289. package/esm2022/directive/only-number/public-api.mjs +0 -2
  290. package/esm2022/directive/public-api.mjs +0 -19
  291. package/esm2022/directive/resize-drag/public-api.mjs +0 -2
  292. package/esm2022/directive/resize-drag/resize-drag.directive.mjs +0 -72
  293. package/esm2022/directive/scroll-into-view/public-api.mjs +0 -2
  294. package/esm2022/directive/scroll-into-view/scroll-into-view.directive.mjs +0 -41
  295. package/esm2022/directive/scrollable/public-api.mjs +0 -3
  296. package/esm2022/directive/scrollable/scrollable/scrollable.component.mjs +0 -98
  297. package/esm2022/directive/scrollable/scrollable.directive.mjs +0 -20
  298. package/esm2022/directive/teta-template/public-api.mjs +0 -2
  299. package/esm2022/directive/teta-template/teta-template.directive.mjs +0 -23
  300. package/esm2022/directive/tooltip/public-api.mjs +0 -2
  301. package/esm2022/directive/tooltip/tooltip.directive.mjs +0 -81
  302. package/esm2022/index.mjs +0 -22
  303. package/esm2022/locale/en.mjs +0 -50
  304. package/esm2022/locale/public-api.mjs +0 -5
  305. package/esm2022/locale/ru.mjs +0 -50
  306. package/esm2022/locale/teta-config.service.mjs +0 -28
  307. package/esm2022/locale/teta-localisation.mjs +0 -2
  308. package/esm2022/observable/animation-frame.mjs +0 -30
  309. package/esm2022/observable/public-api.mjs +0 -3
  310. package/esm2022/observable/zone-observable.mjs +0 -15
  311. package/esm2022/pipe/date-pipe/public-api.mjs +0 -2
  312. package/esm2022/pipe/date-pipe/teta-date.pipe.mjs +0 -43
  313. package/esm2022/pipe/number-pipe/number.pipe.mjs +0 -28
  314. package/esm2022/pipe/number-pipe/public-api.mjs +0 -2
  315. package/esm2022/pipe/public-api.mjs +0 -4
  316. package/esm2022/pipe/util/number-helper.mjs +0 -25
  317. package/esm2022/tetacom-ng-components.mjs +0 -5
  318. package/esm2022/util/bool-or-func.mjs +0 -13
  319. package/esm2022/util/date-util.mjs +0 -231
  320. package/esm2022/util/export-dom-image.mjs +0 -22
  321. package/esm2022/util/forms-util.mjs +0 -85
  322. package/esm2022/util/is-function.mjs +0 -4
  323. package/esm2022/util/public-api.mjs +0 -7
  324. package/esm2022/util/string-util.mjs +0 -9
@@ -1,650 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import objectHash from 'object-hash';
3
- import { BehaviorSubject, Subject } from 'rxjs';
4
- import { ArrayUtil } from '../../../common/util/array-util';
5
- import { boolOrFuncCallback } from '../../../util/bool-or-func';
6
- import { DateUtil } from '../../../util/date-util';
7
- import { DateFilter } from '../../filter/contarct/date-filter';
8
- import { DateFilterValue } from '../../filter/contarct/date-filter-value';
9
- import { FilterState } from '../../filter/contarct/filter-state';
10
- import { ListFilter } from '../../filter/contarct/list-filter';
11
- import { NumericFilter } from '../../filter/contarct/numeric-filter';
12
- import { NumericFilterValue } from '../../filter/contarct/numeric-filter-value';
13
- import { StringFilter } from '../../filter/contarct/string-filter';
14
- import { FilterType } from '../../filter/enum/filter-type.enum';
15
- import { ListFilterType } from '../../filter/enum/list-filter-type.enum';
16
- import { ColumnReorderEvent } from '../contract/column-reorder-event';
17
- import { TableColumn } from '../contract/table-column';
18
- import { TableColumnStore } from '../contract/table-column-store';
19
- import { TableRow } from '../contract/table-row';
20
- import { EditEvent } from '../enum/edit-event.enum';
21
- import { EditType } from '../enum/edit-type.enum';
22
- import { SelectType } from '../enum/select-type.enum';
23
- import { StateUtil } from '../util/state-util';
24
- import * as i0 from "@angular/core";
25
- export class TableService {
26
- get dragSource() {
27
- return this._dragSource;
28
- }
29
- get currentEditCell() {
30
- return this._currentEditCell;
31
- }
32
- constructor() {
33
- this.selectType = SelectType.mouse;
34
- this.editType = EditType.cell;
35
- this.editEvent = EditEvent.doubleClick;
36
- this.trackRow = (index, row) => {
37
- const rowId = row['id'];
38
- if (rowId) {
39
- return rowId;
40
- }
41
- return index;
42
- };
43
- this.initialColumnsHash = '';
44
- this.initialColumns = [];
45
- this.displayColumns = [];
46
- this._columns = new BehaviorSubject([]);
47
- this._hiddenColumns = new BehaviorSubject([]);
48
- this._displayData = new BehaviorSubject([]);
49
- this._dict = new BehaviorSubject({});
50
- this._filterOptions = new BehaviorSubject({});
51
- this._state = new BehaviorSubject(new FilterState());
52
- this._editRowStart = new Subject();
53
- this._editRowStop = new Subject();
54
- this._editCellStart = new Subject();
55
- this._editCellStop = new Subject();
56
- this._valueChanged = new Subject();
57
- this._valueSet = new Subject();
58
- this._stateChanged = new Subject();
59
- this._filterClear = new Subject();
60
- this._selectedRows = new BehaviorSubject([]);
61
- this._activeRow = new BehaviorSubject(null);
62
- this._scrollIndex = new Subject();
63
- this.columns = this._columns.asObservable();
64
- this.displayData = this._displayData.asObservable();
65
- this.dict = this._dict.asObservable();
66
- this.filterOptions = this._filterOptions.asObservable();
67
- this.state = this._state.asObservable();
68
- this.editRowStart = this._editRowStart.asObservable();
69
- this.editRowStop = this._editRowStop.asObservable();
70
- this.editCellStart = this._editCellStart.asObservable();
71
- this.editCellStop = this._editCellStop.asObservable();
72
- this.valueChanged = this._valueChanged.asObservable();
73
- this.valueSet = this._valueSet.asObservable();
74
- this.stateChanged = this._stateChanged.asObservable();
75
- this.filterClear = this._filterClear.asObservable();
76
- this.selectedRows = this._selectedRows.asObservable();
77
- this.activeRow = this._activeRow.asObservable();
78
- this.hiddenColumns = this._hiddenColumns.asObservable();
79
- this.scrollIndex = this._scrollIndex.asObservable();
80
- }
81
- setData(data) {
82
- this._displayData.next(data?.map((item) => new TableRow({
83
- data: item,
84
- })) ?? []);
85
- }
86
- setDict(dict) {
87
- this._dict.next(dict);
88
- }
89
- setFilterOptions(filterOptions) {
90
- this._filterOptions.next(filterOptions);
91
- }
92
- setColumns(columns) {
93
- this.initialColumns = columns ? columns.map((_) => new TableColumn(_)) : [];
94
- const excludeKeys = ['editable', 'cellComponent', 'headCellComponent', 'headDropdownConfig'];
95
- this.initialColumnsHash = objectHash(this.initialColumns, {
96
- algorithm: 'sha1',
97
- ignoreUnknown: true,
98
- excludeKeys: (key) => {
99
- return excludeKeys.indexOf(key) >= 0;
100
- },
101
- });
102
- const restored = this.restoreColumns();
103
- if (restored) {
104
- this.setDisplayColumns(restored);
105
- }
106
- else {
107
- this.setDisplayColumns(this.initialColumns);
108
- }
109
- }
110
- restoreDefaultColumns() {
111
- this.setDisplayColumns(this.initialColumns);
112
- this.clearColumnsState();
113
- }
114
- updateColumns(columns) {
115
- this.setDisplayColumns(columns);
116
- this.saveColumnsState();
117
- }
118
- saveColumnsState() {
119
- if (this._columnsCookieName) {
120
- localStorage.setItem(this._columnsCookieName, JSON.stringify({
121
- hash: this.initialColumnsHash,
122
- columns: this.displayColumns.map((_) => new TableColumnStore(_)),
123
- }));
124
- }
125
- }
126
- clearColumnsState() {
127
- if (this._columnsCookieName) {
128
- localStorage.removeItem(this._columnsCookieName);
129
- }
130
- }
131
- setDisplayColumns(columns) {
132
- this.displayColumns = columns ? columns.map((_) => new TableColumn(_)) : [];
133
- this._columns.next(this.displayColumns);
134
- }
135
- restoreColumns() {
136
- if (this._columnsCookieName) {
137
- const savedColumns = JSON.parse(localStorage.getItem(this._columnsCookieName));
138
- if (savedColumns && savedColumns.hash === this.initialColumnsHash) {
139
- return this.restoreColumnsState(savedColumns.columns);
140
- }
141
- }
142
- return null;
143
- }
144
- restoreColumnsState(columns) {
145
- return columns.map((column) => {
146
- const found = ArrayUtil.findRecursive(this.initialColumns, (item) => item.name === column.name, 'columns');
147
- const resultColumn = new TableColumn(found);
148
- resultColumn.width = column.width;
149
- resultColumn.flex = column.flex;
150
- resultColumn.locked = column.locked;
151
- if (column.columns?.length > 0) {
152
- resultColumn.columns = this.restoreColumnsState(column.columns);
153
- }
154
- return resultColumn;
155
- });
156
- }
157
- setState(state) {
158
- if (this._cookieName) {
159
- state.save(this._cookieName);
160
- }
161
- this._state.next(state);
162
- }
163
- setCookieName(name) {
164
- this._cookieName = name;
165
- this._hiddenCookieName = `${this._cookieName}_hidden_columns`;
166
- this._columnsCookieName = `${this._cookieName}_columns`;
167
- }
168
- restoreState() {
169
- let state;
170
- if (this._cookieName && this._cookieName?.length > 0 && FilterState.restore(this._cookieName)) {
171
- let newState = Object.assign(this._state.value, FilterState.restore(this._cookieName));
172
- newState = DateUtil.convertDateStringsToDates(newState);
173
- state = new FilterState(newState);
174
- }
175
- else {
176
- state = new FilterState();
177
- }
178
- this.setState(state);
179
- }
180
- saveHiddenColumns(hiddenColumns) {
181
- if (this._hiddenCookieName) {
182
- localStorage.setItem(this._hiddenCookieName, JSON.stringify(hiddenColumns));
183
- }
184
- }
185
- restoreHiddenColumns() {
186
- const hiddenColumns = localStorage.getItem(this._hiddenCookieName ?? '') || '[]';
187
- this._hiddenColumns.next(JSON.parse(hiddenColumns));
188
- }
189
- sortAsc(sortEvent) {
190
- if (sortEvent.column.sortable) {
191
- this.setState(StateUtil.sortAsc(sortEvent, this._state.value));
192
- }
193
- }
194
- sortDesc(sortEvent) {
195
- if (sortEvent.column.sortable) {
196
- this.setState(StateUtil.sortDesc(sortEvent, this._state.value));
197
- }
198
- }
199
- clearSort(column) {
200
- this.setState(StateUtil.clearSort(column, this._state.value));
201
- }
202
- clearAllSort() {
203
- this.setState(StateUtil.clearAllSort(this._state.value));
204
- }
205
- clearFilter(column) {
206
- const state = this._state.value;
207
- if (column !== null && column !== undefined && column.filterable) {
208
- switch (column.filterType) {
209
- case FilterType.date:
210
- state.addDateFilter(new DateFilter({
211
- name: column.name,
212
- field: column.filterField,
213
- value: new DateFilterValue(),
214
- }));
215
- break;
216
- case FilterType.string:
217
- state.addStringFilter(new StringFilter({
218
- name: column.name,
219
- field: column.filterField,
220
- value: '',
221
- }));
222
- break;
223
- case FilterType.number:
224
- state.addNumericFilter(new NumericFilter({
225
- name: column.name,
226
- field: column.filterField,
227
- value: new NumericFilterValue(),
228
- }));
229
- break;
230
- case FilterType.list:
231
- state.addListFilter(new ListFilter({
232
- name: column.name,
233
- field: column.filterField,
234
- value: [],
235
- type: ListFilterType.None,
236
- }));
237
- break;
238
- }
239
- this.setState(new FilterState(state));
240
- }
241
- }
242
- clearAllFilters() {
243
- const state = this._state.value;
244
- state.stringFilters = [];
245
- state.listFilters = [];
246
- state.numericFilters = [];
247
- state.dateFilters = [];
248
- this.setState(new FilterState(state));
249
- }
250
- pinColumn(column) {
251
- this.displayColumns.forEach((col) => {
252
- if (col.name === column.name) {
253
- col.locked = !col.locked;
254
- }
255
- });
256
- this.updateColumns(this.displayColumns);
257
- }
258
- dragStart(column) {
259
- this._dragSource = column;
260
- }
261
- lockPreviousColumns(column, element) {
262
- const flat = ArrayUtil.flatten(this.displayColumns, 'columns', true).sort((a, b) => Number(b.locked) - Number(a.locked));
263
- const index = flat.indexOf(column);
264
- const previous = flat.slice(0, index).filter((_) => _.flex > 0);
265
- if (previous?.length > 0) {
266
- const tableElement = this.getTableElement(element);
267
- previous.forEach((item) => {
268
- const itemCol = tableElement?.querySelector(`teta-head-cell[data-column="${item.name}"]`);
269
- if (itemCol) {
270
- item.flex = 0;
271
- item.width = itemCol.clientWidth;
272
- }
273
- });
274
- }
275
- }
276
- resizeColumn(event) {
277
- if (event.column !== null && event.column !== undefined) {
278
- event.column.width = event.newWidth < 50 ? 50 : event.newWidth;
279
- event.column.flex = 0;
280
- }
281
- this._columns.next(this.displayColumns);
282
- this.saveColumnsState();
283
- }
284
- autosizeColumn(column, target) {
285
- const tableElement = this.getTableElement(target);
286
- this.setColumnAutoWidth(column, tableElement);
287
- this._columns.next(this.displayColumns);
288
- this.saveColumnsState();
289
- }
290
- autosizeAllColumns(target) {
291
- const tableElement = this.getTableElement(target);
292
- const flat = ArrayUtil.flatten(this.displayColumns, 'columns', true);
293
- flat.forEach((col) => this.setColumnAutoWidth(col, tableElement));
294
- this._columns.next(this.displayColumns);
295
- this.saveColumnsState();
296
- }
297
- reorderColumn(column, insertBefore) {
298
- if (!this._dragSource) {
299
- return;
300
- }
301
- const event = new ColumnReorderEvent(this._dragSource, column);
302
- if (event.source !== event.target) {
303
- const sourceParent = this.findParent(event.source, this.displayColumns);
304
- const targetParent = this.findParent(event.target, this.displayColumns);
305
- if (sourceParent && targetParent) {
306
- const sourceIndex = sourceParent.indexOf(event.source);
307
- sourceParent.splice(sourceIndex, 1);
308
- let targetIndex = targetParent.indexOf(event.target);
309
- if (!insertBefore) {
310
- targetIndex = targetIndex + 1;
311
- }
312
- targetParent.splice(targetIndex, 0, event.source);
313
- event.source.locked = event.target.locked;
314
- this.updateColumns(this.displayColumns);
315
- }
316
- }
317
- }
318
- getColumnParent(column) {
319
- return this.findParentColumn(column, this.displayColumns);
320
- }
321
- startEditRow(cellEvent) {
322
- if (this._currentEditCell?.row !== cellEvent?.row) {
323
- if (this._currentEditCell != null) {
324
- this._editRowStop.next(this._currentEditCell);
325
- }
326
- if (cellEvent === null) {
327
- this._editRowStart.next(cellEvent);
328
- this._currentEditCell = cellEvent;
329
- }
330
- else {
331
- if (boolOrFuncCallback(this.rowEditable)(this.getRowByIndex(cellEvent?.row)?.data)) {
332
- this._editRowStart.next(cellEvent);
333
- this._currentEditCell = cellEvent;
334
- }
335
- }
336
- }
337
- }
338
- startEditCell(cellEvent) {
339
- if (this._currentEditCell?.column !== cellEvent?.column || this._currentEditCell?.row !== cellEvent?.row) {
340
- if (this._currentEditCell != null) {
341
- this._editCellStop.next(this._currentEditCell);
342
- }
343
- const column = this.getColumnByName(cellEvent?.column);
344
- if (boolOrFuncCallback(this.rowEditable)(this.getRowByIndex(cellEvent?.row)?.data) &&
345
- boolOrFuncCallback(column?.editable)({
346
- row: this.getRowByIndex(cellEvent?.row)?.data,
347
- column: column,
348
- })) {
349
- this._editCellStart.next(cellEvent);
350
- this._currentEditCell = cellEvent;
351
- const key = cellEvent?.event?.key;
352
- if (key && (key.length === 1 || (key === 'Delete' && !column.required))) {
353
- this.clearValue(cellEvent);
354
- }
355
- }
356
- }
357
- }
358
- setActiveRow(row) {
359
- this._activeRow.next(row);
360
- }
361
- selectRows(rows) {
362
- this._selectedRows.next(rows);
363
- }
364
- selectOrDeselectRow(row) {
365
- if (this._selectedRows.value.indexOf(row) >= 0) {
366
- this._selectedRows.next(this._selectedRows.value.filter((_) => _ !== row));
367
- }
368
- else {
369
- this._selectedRows.next([...this._selectedRows.value, row]);
370
- }
371
- }
372
- selectRange(row) {
373
- const index = this._displayData.value.findIndex((_) => _.data === row);
374
- let minIndex = this._selectedRows.value.reduce((prev, curr) => {
375
- const newIndex = this._displayData.value.findIndex((_) => _.data === curr);
376
- if (newIndex < prev) {
377
- return newIndex;
378
- }
379
- return prev;
380
- }, this._displayData.value.length);
381
- let maxIndex = this._selectedRows.value.reduce((prev, curr) => {
382
- const newIndex = this._displayData.value.findIndex((_) => _.data === curr);
383
- if (newIndex > prev) {
384
- return newIndex;
385
- }
386
- return prev;
387
- }, 0);
388
- if (index > maxIndex) {
389
- maxIndex = index;
390
- }
391
- if (index < minIndex) {
392
- minIndex = index;
393
- }
394
- if (minIndex < index && index < maxIndex) {
395
- maxIndex = index;
396
- }
397
- this._selectedRows.next([...this._displayData.value.slice(minIndex, maxIndex + 1).map((_) => _.data)]);
398
- }
399
- selectRow(row) {
400
- if (this.selectType === SelectType.none) {
401
- return;
402
- }
403
- this._selectedRows.next([...this._selectedRows.value, row]);
404
- }
405
- deselectRow(row) {
406
- if (this.selectType === SelectType.none) {
407
- return;
408
- }
409
- this._selectedRows.next(this._selectedRows.value.filter((_) => _ !== row));
410
- }
411
- selectAll() {
412
- this._selectedRows.next(this._displayData.value.map((_) => _.data));
413
- }
414
- deselectAll() {
415
- this._selectedRows.next([]);
416
- }
417
- allRowsSelected() {
418
- if (this._displayData.value?.length &&
419
- this._selectedRows.value?.length &&
420
- this._displayData.value.every((_) => this._selectedRows.value.findIndex((selected) => selected === _.data) >= 0)) {
421
- return true;
422
- }
423
- else if (this._selectedRows.value == null || this._selectedRows.value.length === 0) {
424
- return false;
425
- }
426
- return null;
427
- }
428
- setHiddenColumns(value) {
429
- this.saveHiddenColumns(value);
430
- this._hiddenColumns.next(value);
431
- }
432
- columnIsHidden(column) {
433
- return this._hiddenColumns.value.indexOf(column.name) >= 0;
434
- }
435
- changeValue(coordinates) {
436
- this._valueChanged.next(coordinates);
437
- }
438
- setValue(cellValue) {
439
- let value;
440
- if (typeof cellValue.row === 'object' && typeof cellValue.column === 'object') {
441
- value = {
442
- row: this.getRowIndex(cellValue.row.data),
443
- column: cellValue.column.name,
444
- value: cellValue.value,
445
- };
446
- }
447
- else {
448
- value = cellValue;
449
- }
450
- this._valueSet.next(value);
451
- }
452
- getRowByIndex(rowIndex) {
453
- if (rowIndex !== null && rowIndex !== undefined) {
454
- return this._displayData?.value[rowIndex];
455
- }
456
- return undefined;
457
- }
458
- getRowIndex(row) {
459
- return this._displayData.value.findIndex((_) => _.data === row);
460
- }
461
- getEventCell(event) {
462
- return event.composedPath().find((target) => {
463
- return target.tagName?.toLowerCase() === 'teta-cell';
464
- });
465
- }
466
- getEventRow(event) {
467
- return event.composedPath().find((target) => {
468
- return target?.getAttribute && target?.getAttribute('data-row');
469
- });
470
- }
471
- getNextEditableCell(coords) {
472
- const nextCell = this.getNextCell(coords);
473
- if (!nextCell) {
474
- return null;
475
- }
476
- const column = this.getColumnByName(nextCell?.column);
477
- if (boolOrFuncCallback(column.editable)({
478
- row: this.getRowByIndex(nextCell.row),
479
- column,
480
- })) {
481
- return nextCell;
482
- }
483
- return this.getNextEditableCell(nextCell);
484
- }
485
- getPreviousEditableCell(coords) {
486
- const prevCell = this.getPreviousCell(coords);
487
- if (!prevCell) {
488
- return null;
489
- }
490
- const column = this.getColumnByName(prevCell?.column);
491
- if (boolOrFuncCallback(column.editable)({
492
- row: this.getRowByIndex(prevCell.row),
493
- column,
494
- })) {
495
- return prevCell;
496
- }
497
- return this.getPreviousEditableCell(prevCell);
498
- }
499
- getNextCell(coords) {
500
- const columns = this.getFlatColumns();
501
- let colIndex = columns.findIndex((col) => col.name === coords?.column);
502
- let rowIndex = coords?.row;
503
- if (colIndex >= 0 && rowIndex >= 0) {
504
- if (colIndex === columns.length - 1) {
505
- colIndex = 0;
506
- rowIndex = rowIndex + 1;
507
- }
508
- else {
509
- colIndex = colIndex + 1;
510
- }
511
- return {
512
- column: columns[colIndex]?.name,
513
- row: rowIndex,
514
- };
515
- }
516
- return null;
517
- }
518
- getPreviousCell(coords) {
519
- const columns = this.getFlatColumns();
520
- let colIndex = columns.findIndex((col) => col.name === coords?.column);
521
- let rowIndex = coords?.row;
522
- if (colIndex >= 0 && rowIndex >= 0) {
523
- if (colIndex === 0) {
524
- colIndex = columns.length - 1;
525
- rowIndex = rowIndex - 1;
526
- }
527
- else {
528
- colIndex = colIndex - 1;
529
- }
530
- return {
531
- column: columns[colIndex]?.name,
532
- row: rowIndex,
533
- };
534
- }
535
- return null;
536
- }
537
- getNextRowCell(coords) {
538
- const columns = this.getFlatColumns();
539
- const colIndex = columns.findIndex((col) => col.name === coords?.column);
540
- const rowIndex = coords?.row;
541
- if (colIndex >= 0 && rowIndex >= 0 && rowIndex < this._displayData.value.length - 1) {
542
- return {
543
- column: columns[colIndex]?.name,
544
- row: rowIndex + 1,
545
- };
546
- }
547
- return null;
548
- }
549
- getPreviousRowCell(coords) {
550
- const columns = this.getFlatColumns();
551
- const colIndex = columns.findIndex((col) => col.name === coords?.column);
552
- const rowIndex = coords?.row;
553
- if (colIndex >= 0 && rowIndex > 1) {
554
- return {
555
- column: columns[colIndex]?.name,
556
- row: rowIndex - 1,
557
- };
558
- }
559
- return null;
560
- }
561
- getColumnByName(columnName) {
562
- return ArrayUtil.findRecursive(this.displayColumns, (iterableNode) => columnName === iterableNode.name, 'columns');
563
- }
564
- scrollToIndex(index) {
565
- this._scrollIndex.next(null);
566
- this._scrollIndex.next(index);
567
- }
568
- getVisibleColumns() {
569
- const visible = ArrayUtil.flatten(this._columns.value, 'columns', true).filter((_) => this._hiddenColumns.value.indexOf(_.name) < 0);
570
- return visible.sort((a, b) => Number(b.locked) - Number(a.locked));
571
- }
572
- getCellInstance(coords) {
573
- return coords
574
- ? {
575
- row: this.getRowByIndex(coords.row),
576
- column: this.getColumnByName(coords.column),
577
- }
578
- : null;
579
- }
580
- getFlatColumns() {
581
- return ArrayUtil.flatten(this.displayColumns, 'columns', true).sort((a, b) => Number(b.locked) - Number(a.locked));
582
- }
583
- findParent(column, columns) {
584
- const found = columns.find((x) => x.name === column.name);
585
- if (found !== null && found !== undefined) {
586
- return columns;
587
- }
588
- for (let i = 0, l = columns.length; i < l; i++) {
589
- const col = columns[i];
590
- if (col.columns && col.columns.length) {
591
- const result = this.findParent(column, col.columns);
592
- if (result !== null && result !== undefined) {
593
- return result;
594
- }
595
- }
596
- }
597
- return null;
598
- }
599
- findParentColumn(column, columns) {
600
- const found = columns.find((x) => x.columns.indexOf(column) >= 0);
601
- if (found !== null && found !== undefined) {
602
- return found;
603
- }
604
- for (let i = 0, l = columns.length; i < l; i++) {
605
- const col = columns[i];
606
- if (col.columns && col.columns.length) {
607
- const result = this.findParentColumn(column, col.columns);
608
- if (result !== null && result !== undefined) {
609
- return result;
610
- }
611
- }
612
- }
613
- return null;
614
- }
615
- getTableElement(element) {
616
- return element.closest('teta-table');
617
- }
618
- setColumnAutoWidth(column, table) {
619
- const cells = table.querySelectorAll(`teta-cell[data-column="${column.name}"] .cell-text`);
620
- let maxWidth = 0;
621
- cells.forEach((cell) => {
622
- if (cell.scrollWidth > maxWidth) {
623
- maxWidth = cell.scrollWidth;
624
- }
625
- });
626
- const aggCells = table.querySelectorAll(`.aggregate-cell[data-column="${column.name}"] .cell-text`);
627
- aggCells?.forEach((cell) => {
628
- if (cell.scrollWidth > maxWidth) {
629
- maxWidth = cell.scrollWidth;
630
- }
631
- });
632
- column.flex = 0;
633
- column.width = maxWidth + 20;
634
- }
635
- clearValue(event) {
636
- this.setValue({
637
- ...event,
638
- value: null,
639
- });
640
- }
641
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
642
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, providedIn: 'root' }); }
643
- }
644
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: TableService, decorators: [{
645
- type: Injectable,
646
- args: [{
647
- providedIn: 'root',
648
- }]
649
- }], ctorParameters: () => [] });
650
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnQvdGFibGUvc2VydmljZS90YWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU90RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdC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QUFnQixDQUFDLGdDQUFnQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQztRQUNwRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFpQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osR0FBRyxLQUFLO1lBQ1IsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQWh1QlUsWUFBWTtrSEFBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgb2JqZWN0SGFzaCBmcm9tICdvYmplY3QtaGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSURpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1kaWN0aW9uYXJ5JztcbmltcG9ydCB7IElJZE5hbWUgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1pZC1uYW1lJztcbmltcG9ydCB7IEFycmF5VXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlsL2FycmF5LXV0aWwnO1xuaW1wb3J0IHsgYm9vbE9yRnVuY0NhbGxiYWNrIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9ib29sLW9yLWZ1bmMnO1xuaW1wb3J0IHsgRGF0ZVV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlsL2RhdGUtdXRpbCc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2NvbnRhcmN0L2RhdGUtZmlsdGVyJztcbmltcG9ydCB7IERhdGVGaWx0ZXJWYWx1ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9kYXRlLWZpbHRlci12YWx1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJTdGF0ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9maWx0ZXItc3RhdGUnO1xuaW1wb3J0IHsgTGlzdEZpbHRlciB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9saXN0LWZpbHRlcic7XG5pbXBvcnQgeyBOdW1lcmljRmlsdGVyIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2NvbnRhcmN0L251bWVyaWMtZmlsdGVyJztcbmltcG9ydCB7IE51bWVyaWNGaWx0ZXJWYWx1ZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9jb250YXJjdC9udW1lcmljLWZpbHRlci12YWx1ZSc7XG5pbXBvcnQgeyBTdHJpbmdGaWx0ZXIgfSBmcm9tICcuLi8uLi9maWx0ZXIvY29udGFyY3Qvc3RyaW5nLWZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vZmlsdGVyL2VudW0vZmlsdGVyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBMaXN0RmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uL2ZpbHRlci9lbnVtL2xpc3QtZmlsdGVyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBDb2x1bW5SZW9yZGVyRXZlbnQgfSBmcm9tICcuLi9jb250cmFjdC9jb2x1bW4tcmVvcmRlci1ldmVudCc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVFdmVudCB9IGZyb20gJy4uL2NvbnRyYWN0L2NvbHVtbi1yZXNpemUtZXZlbnQnO1xuaW1wb3J0IHsgSUNlbGxDb29yZGluYXRlcyB9IGZyb20gJy4uL2NvbnRyYWN0L2ktY2VsbC1jb29yZGluYXRlcyc7XG5pbXBvcnQgeyBJQ2VsbEV2ZW50IH0gZnJvbSAnLi4vY29udHJhY3QvaS1jZWxsLWV2ZW50JztcbmltcG9ydCB7IElDZWxsSW5zdGFuY2UsIElDZWxsSW5zdGFuY2VWYWx1ZSwgSUNvbHVtblJvdyB9IGZyb20gJy4uL2NvbnRyYWN0L2ktY2VsbC1pbnN0YW5jZSc7XG5pbXBvcnQgeyBJQ2VsbFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3QvaS1jZWxsLXZhbHVlJztcbmltcG9ydCB7IFNvcnRFdmVudCB9IGZyb20gJy4uL2NvbnRyYWN0L3NvcnQtZXZlbnQnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi9jb250cmFjdC90YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5TdG9yZSB9IGZyb20gJy4uL2NvbnRyYWN0L3RhYmxlLWNvbHVtbi1zdG9yZSc7XG5pbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJy4uL2NvbnRyYWN0L3RhYmxlLXJvdyc7XG5pbXBvcnQgeyBFZGl0RXZlbnQgfSBmcm9tICcuLi9lbnVtL2VkaXQtZXZlbnQuZW51bSc7XG5pbXBvcnQgeyBFZGl0VHlwZSB9IGZyb20gJy4uL2VudW0vZWRpdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgU2VsZWN0VHlwZSB9IGZyb20gJy4uL2VudW0vc2VsZWN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBTdGF0ZVV0aWwgfSBmcm9tICcuLi91dGlsL3N0YXRlLXV0aWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVTZXJ2aWNlPFQ+IHtcbiAgY29sdW1uczogT2JzZXJ2YWJsZTxUYWJsZUNvbHVtbltdPjtcbiAgZGlzcGxheURhdGE6IE9ic2VydmFibGU8VGFibGVSb3c8VD5bXT47XG4gIGRpY3Q6IE9ic2VydmFibGU8SURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+PjtcbiAgZmlsdGVyT3B0aW9uczogT2JzZXJ2YWJsZTxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+O1xuICBzdGF0ZTogT2JzZXJ2YWJsZTxGaWx0ZXJTdGF0ZT47XG4gIHNlbGVjdFR5cGU6IFNlbGVjdFR5cGUgPSBTZWxlY3RUeXBlLm1vdXNlO1xuICBlZGl0Um93U3RhcnQ6IE9ic2VydmFibGU8SUNlbGxFdmVudCB8IG51bGw+O1xuICBlZGl0Um93U3RvcDogT2JzZXJ2YWJsZTxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD47XG4gIGVkaXRDZWxsU3RhcnQ6IE9ic2VydmFibGU8SUNlbGxFdmVudCB8IG51bGw+O1xuICBlZGl0Q2VsbFN0b3A6IE9ic2VydmFibGU8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+O1xuICB2YWx1ZUNoYW5nZWQ6IE9ic2VydmFibGU8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+O1xuICB2YWx1ZVNldDogT2JzZXJ2YWJsZTxJQ2VsbFZhbHVlPjtcbiAgc3RhdGVDaGFuZ2VkOiBPYnNlcnZhYmxlPEZpbHRlclN0YXRlPjtcbiAgZmlsdGVyQ2xlYXI6IE9ic2VydmFibGU8VGFibGVDb2x1bW4+O1xuICBzZWxlY3RlZFJvd3M6IE9ic2VydmFibGU8VFtdPjtcbiAgYWN0aXZlUm93OiBPYnNlcnZhYmxlPFQgfCBudWxsPjtcbiAgaGlkZGVuQ29sdW1uczogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHNjcm9sbEluZGV4OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgZWRpdFR5cGU6IEVkaXRUeXBlID0gRWRpdFR5cGUuY2VsbDtcbiAgZWRpdEV2ZW50OiBFZGl0RXZlbnQgPSBFZGl0RXZlbnQuZG91YmxlQ2xpY2s7XG4gIHJvd0VkaXRhYmxlPzogYm9vbGVhbiB8ICgocm93OiBUKSA9PiBib29sZWFuKTtcbiAgdHJhY2tSb3c6IChpbmRleDogbnVtYmVyLCByb3c6IFQpID0+IGFueSA9IChpbmRleDogbnVtYmVyLCByb3c6IFQpID0+IHtcbiAgICBjb25zdCByb3dJZCA9IChyb3cgYXMgYW55KVsnaWQnXTtcbiAgICBpZiAocm93SWQpIHtcbiAgICAgIHJldHVybiByb3dJZDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIGdldCBkcmFnU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9kcmFnU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsQ29sdW1uc0hhc2ggPSAnJztcbiAgcHJpdmF0ZSBpbml0aWFsQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xuICBwcml2YXRlIGRpc3BsYXlDb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XG4gIHByaXZhdGUgX2NvbHVtbnM6IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVDb2x1bW5bXT4oW10pO1xuICBwcml2YXRlIF9oaWRkZW5Db2x1bW5zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICBwcml2YXRlIF9kaXNwbGF5RGF0YTogQmVoYXZpb3JTdWJqZWN0PFRhYmxlUm93PFQ+W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvdzxUPltdPihbXSk7XG4gIHByaXZhdGUgX2RpY3Q6IEJlaGF2aW9yU3ViamVjdDxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT4+KHt9KTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9uczogQmVoYXZpb3JTdWJqZWN0PElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPlxuICA+KHt9KTtcbiAgcHJpdmF0ZSBfc3RhdGU6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJTdGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlclN0YXRlPihuZXcgRmlsdGVyU3RhdGUoKSk7XG4gIHByaXZhdGUgX2Nvb2tpZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2hpZGRlbkNvb2tpZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbHVtbnNDb29raWVOYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIF9lZGl0Um93U3RhcnQgPSBuZXcgU3ViamVjdDxJQ2VsbEV2ZW50IHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfZWRpdFJvd1N0b3AgPSBuZXcgU3ViamVjdDxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfZWRpdENlbGxTdGFydCA9IG5ldyBTdWJqZWN0PElDZWxsRXZlbnQgfCBudWxsPigpO1xuICBwcml2YXRlIF9lZGl0Q2VsbFN0b3AgPSBuZXcgU3ViamVjdDxJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8SUNlbGxDb29yZGluYXRlcyB8IG51bGw+KCk7XG4gIHByaXZhdGUgX3ZhbHVlU2V0ID0gbmV3IFN1YmplY3Q8SUNlbGxWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8RmlsdGVyU3RhdGU+KCk7XG4gIHByaXZhdGUgX2ZpbHRlckNsZWFyID0gbmV3IFN1YmplY3Q8VGFibGVDb2x1bW4+KCk7XG4gIHByaXZhdGUgX2RyYWdTb3VyY2U/OiBUYWJsZUNvbHVtbjtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcbiAgcHJpdmF0ZSBfYWN0aXZlUm93ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3Njcm9sbEluZGV4ID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIF9jdXJyZW50RWRpdENlbGw/OiBJQ2VsbENvb3JkaW5hdGVzO1xuXG4gIGdldCBjdXJyZW50RWRpdENlbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRFZGl0Q2VsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5kaXNwbGF5RGF0YSA9IHRoaXMuX2Rpc3BsYXlEYXRhLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZGljdCA9IHRoaXMuX2RpY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zID0gdGhpcy5fZmlsdGVyT3B0aW9ucy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5fc3RhdGUuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Um93U3RhcnQgPSB0aGlzLl9lZGl0Um93U3RhcnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Um93U3RvcCA9IHRoaXMuX2VkaXRSb3dTdG9wLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZWRpdENlbGxTdGFydCA9IHRoaXMuX2VkaXRDZWxsU3RhcnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5lZGl0Q2VsbFN0b3AgPSB0aGlzLl9lZGl0Q2VsbFN0b3AuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB0aGlzLl92YWx1ZUNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy52YWx1ZVNldCA9IHRoaXMuX3ZhbHVlU2V0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdGhpcy5fc3RhdGVDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZmlsdGVyQ2xlYXIgPSB0aGlzLl9maWx0ZXJDbGVhci5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuX3NlbGVjdGVkUm93cy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZVJvdyA9IHRoaXMuX2FjdGl2ZVJvdy5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSB0aGlzLl9oaWRkZW5Db2x1bW5zLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuc2Nyb2xsSW5kZXggPSB0aGlzLl9zY3JvbGxJbmRleC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldERhdGEoZGF0YTogVFtdKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzcGxheURhdGEubmV4dChcbiAgICAgIGRhdGE/Lm1hcChcbiAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgbmV3IFRhYmxlUm93PFQ+KHtcbiAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgfSksXG4gICAgICApID8/IFtdLFxuICAgICk7XG4gIH1cblxuICBzZXREaWN0KGRpY3Q6IElEaWN0aW9uYXJ5PElJZE5hbWU8YW55PltdPik6IHZvaWQge1xuICAgIHRoaXMuX2RpY3QubmV4dChkaWN0KTtcbiAgfVxuXG4gIHNldEZpbHRlck9wdGlvbnMoZmlsdGVyT3B0aW9uczogSURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+KTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyT3B0aW9ucy5uZXh0KGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgc2V0Q29sdW1ucyhjb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsQ29sdW1ucyA9IGNvbHVtbnMgPyBjb2x1bW5zLm1hcCgoXykgPT4gbmV3IFRhYmxlQ29sdW1uKF8pKSA6IFtdO1xuICAgIGNvbnN0IGV4Y2x1ZGVLZXlzID0gWydlZGl0YWJsZScsICdjZWxsQ29tcG9uZW50JywgJ2hlYWRDZWxsQ29tcG9uZW50JywgJ2hlYWREcm9wZG93bkNvbmZpZyddO1xuICAgIHRoaXMuaW5pdGlhbENvbHVtbnNIYXNoID0gb2JqZWN0SGFzaCh0aGlzLmluaXRpYWxDb2x1bW5zLCB7XG4gICAgICBhbGdvcml0aG06ICdzaGExJyxcbiAgICAgIGlnbm9yZVVua25vd246IHRydWUsXG4gICAgICBleGNsdWRlS2V5czogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBleGNsdWRlS2V5cy5pbmRleE9mKGtleSkgPj0gMDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSB0aGlzLnJlc3RvcmVDb2x1bW5zKCk7XG5cbiAgICBpZiAocmVzdG9yZWQpIHtcbiAgICAgIHRoaXMuc2V0RGlzcGxheUNvbHVtbnMocmVzdG9yZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERpc3BsYXlDb2x1bW5zKHRoaXMuaW5pdGlhbENvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVEZWZhdWx0Q29sdW1ucygpIHtcbiAgICB0aGlzLnNldERpc3BsYXlDb2x1bW5zKHRoaXMuaW5pdGlhbENvbHVtbnMpO1xuICAgIHRoaXMuY2xlYXJDb2x1bW5zU3RhdGUoKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGlzcGxheUNvbHVtbnMoY29sdW1ucyk7XG4gICAgdGhpcy5zYXZlQ29sdW1uc1N0YXRlKCk7XG4gIH1cblxuICBzYXZlQ29sdW1uc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLl9jb2x1bW5zQ29va2llTmFtZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIHRoaXMuX2NvbHVtbnNDb29raWVOYW1lLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGFzaDogdGhpcy5pbml0aWFsQ29sdW1uc0hhc2gsXG4gICAgICAgICAgY29sdW1uczogdGhpcy5kaXNwbGF5Q29sdW1ucy5tYXAoKF8pID0+IG5ldyBUYWJsZUNvbHVtblN0b3JlKF8pKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29sdW1uc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLl9jb2x1bW5zQ29va2llTmFtZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fY29sdW1uc0Nvb2tpZU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc3BsYXlDb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zID0gY29sdW1ucyA/IGNvbHVtbnMubWFwKChfKSA9PiBuZXcgVGFibGVDb2x1bW4oXykpIDogW107XG4gICAgdGhpcy5fY29sdW1ucy5uZXh0KHRoaXMuZGlzcGxheUNvbHVtbnMpO1xuICB9XG5cbiAgcmVzdG9yZUNvbHVtbnMoKSB7XG4gICAgaWYgKHRoaXMuX2NvbHVtbnNDb29raWVOYW1lKSB7XG4gICAgICBjb25zdCBzYXZlZENvbHVtbnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX2NvbHVtbnNDb29raWVOYW1lKSk7XG4gICAgICBpZiAoc2F2ZWRDb2x1bW5zICYmIHNhdmVkQ29sdW1ucy5oYXNoID09PSB0aGlzLmluaXRpYWxDb2x1bW5zSGFzaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0b3JlQ29sdW1uc1N0YXRlKHNhdmVkQ29sdW1ucy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXN0b3JlQ29sdW1uc1N0YXRlKGNvbHVtbnM6IFRhYmxlQ29sdW1uU3RvcmVbXSkge1xuICAgIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uOiBUYWJsZUNvbHVtblN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZCA9IEFycmF5VXRpbC5maW5kUmVjdXJzaXZlKHRoaXMuaW5pdGlhbENvbHVtbnMsIChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGNvbHVtbi5uYW1lLCAnY29sdW1ucycpO1xuICAgICAgY29uc3QgcmVzdWx0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZvdW5kKTtcbiAgICAgIHJlc3VsdENvbHVtbi53aWR0aCA9IGNvbHVtbi53aWR0aDtcbiAgICAgIHJlc3VsdENvbHVtbi5mbGV4ID0gY29sdW1uLmZsZXg7XG4gICAgICByZXN1bHRDb2x1bW4ubG9ja2VkID0gY29sdW1uLmxvY2tlZDtcbiAgICAgIGlmIChjb2x1bW4uY29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRDb2x1bW4uY29sdW1ucyA9IHRoaXMucmVzdG9yZUNvbHVtbnNTdGF0ZShjb2x1bW4uY29sdW1ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0Q29sdW1uO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3RhdGUoc3RhdGU6IEZpbHRlclN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Nvb2tpZU5hbWUpIHtcbiAgICAgIHN0YXRlLnNhdmUodGhpcy5fY29va2llTmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlLm5leHQoc3RhdGUpO1xuICB9XG5cbiAgc2V0Q29va2llTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb29raWVOYW1lID0gbmFtZTtcbiAgICB0aGlzLl9oaWRkZW5Db29raWVOYW1lID0gYCR7dGhpcy5fY29va2llTmFtZX1faGlkZGVuX2NvbHVtbnNgO1xuICAgIHRoaXMuX2NvbHVtbnNDb29raWVOYW1lID0gYCR7dGhpcy5fY29va2llTmFtZX1fY29sdW1uc2A7XG4gIH1cblxuICByZXN0b3JlU3RhdGUoKTogdm9pZCB7XG4gICAgbGV0IHN0YXRlOiBGaWx0ZXJTdGF0ZTtcbiAgICBpZiAodGhpcy5fY29va2llTmFtZSAmJiB0aGlzLl9jb29raWVOYW1lPy5sZW5ndGggPiAwICYmIEZpbHRlclN0YXRlLnJlc3RvcmUodGhpcy5fY29va2llTmFtZSkpIHtcbiAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fc3RhdGUudmFsdWUsIEZpbHRlclN0YXRlLnJlc3RvcmUodGhpcy5fY29va2llTmFtZSkpO1xuICAgICAgbmV3U3RhdGUgPSBEYXRlVXRpbC5jb252ZXJ0RGF0ZVN0cmluZ3NUb0RhdGVzKG5ld1N0YXRlKTtcbiAgICAgIHN0YXRlID0gbmV3IEZpbHRlclN0YXRlKG5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUgPSBuZXcgRmlsdGVyU3RhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gIH1cblxuICBzYXZlSGlkZGVuQ29sdW1ucyhoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oaWRkZW5Db29raWVOYW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9oaWRkZW5Db29raWVOYW1lLCBKU09OLnN0cmluZ2lmeShoaWRkZW5Db2x1bW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZUhpZGRlbkNvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX2hpZGRlbkNvb2tpZU5hbWUgPz8gJycpIHx8ICdbXSc7XG4gICAgdGhpcy5faGlkZGVuQ29sdW1ucy5uZXh0KEpTT04ucGFyc2UoaGlkZGVuQ29sdW1ucykpO1xuICB9XG5cbiAgc29ydEFzYyhzb3J0RXZlbnQ6IFNvcnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzb3J0RXZlbnQuY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5zb3J0QXNjKHNvcnRFdmVudCwgdGhpcy5fc3RhdGUudmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBzb3J0RGVzYyhzb3J0RXZlbnQ6IFNvcnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzb3J0RXZlbnQuY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5zb3J0RGVzYyhzb3J0RXZlbnQsIHRoaXMuX3N0YXRlLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTb3J0KGNvbHVtbjogVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKFN0YXRlVXRpbC5jbGVhclNvcnQoY29sdW1uLCB0aGlzLl9zdGF0ZS52YWx1ZSkpO1xuICB9XG5cbiAgY2xlYXJBbGxTb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhdGUoU3RhdGVVdGlsLmNsZWFyQWxsU29ydCh0aGlzLl9zdGF0ZS52YWx1ZSkpO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXIoY29sdW1uOiBUYWJsZUNvbHVtbikge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGUudmFsdWU7XG4gICAgaWYgKGNvbHVtbiAhPT0gbnVsbCAmJiBjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZmlsdGVyYWJsZSkge1xuICAgICAgc3dpdGNoIChjb2x1bW4uZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuZGF0ZTpcbiAgICAgICAgICBzdGF0ZS5hZGREYXRlRmlsdGVyKFxuICAgICAgICAgICAgbmV3IERhdGVGaWx0ZXIoe1xuICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5maWx0ZXJGaWVsZCxcbiAgICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlRmlsdGVyVmFsdWUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5zdHJpbmc6XG4gICAgICAgICAgc3RhdGUuYWRkU3RyaW5nRmlsdGVyKFxuICAgICAgICAgICAgbmV3IFN0cmluZ0ZpbHRlcih7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmZpbHRlckZpZWxkLFxuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUubnVtYmVyOlxuICAgICAgICAgIHN0YXRlLmFkZE51bWVyaWNGaWx0ZXIoXG4gICAgICAgICAgICBuZXcgTnVtZXJpY0ZpbHRlcih7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmZpbHRlckZpZWxkLFxuICAgICAgICAgICAgICB2YWx1ZTogbmV3IE51bWVyaWNGaWx0ZXJWYWx1ZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLmxpc3Q6XG4gICAgICAgICAgc3RhdGUuYWRkTGlzdEZpbHRlcihcbiAgICAgICAgICAgIG5ldyBMaXN0RmlsdGVyKHtcbiAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZmlsdGVyRmllbGQsXG4gICAgICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICAgICAgdHlwZTogTGlzdEZpbHRlclR5cGUuTm9uZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKG5ldyBGaWx0ZXJTdGF0ZShzdGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlLnZhbHVlO1xuICAgIHN0YXRlLnN0cmluZ0ZpbHRlcnMgPSBbXTtcbiAgICBzdGF0ZS5saXN0RmlsdGVycyA9IFtdO1xuICAgIHN0YXRlLm51bWVyaWNGaWx0ZXJzID0gW107XG4gICAgc3RhdGUuZGF0ZUZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLnNldFN0YXRlKG5ldyBGaWx0ZXJTdGF0ZShzdGF0ZSkpO1xuICB9XG5cbiAgcGluQ29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zLmZvckVhY2goKGNvbDogVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gY29sdW1uLm5hbWUpIHtcbiAgICAgICAgY29sLmxvY2tlZCA9ICFjb2wubG9ja2VkO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQ29sdW1ucyh0aGlzLmRpc3BsYXlDb2x1bW5zKTtcbiAgfVxuXG4gIGRyYWdTdGFydChjb2x1bW46IFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ1NvdXJjZSA9IGNvbHVtbjtcbiAgfVxuXG4gIGxvY2tQcmV2aW91c0NvbHVtbnMoY29sdW1uOiBUYWJsZUNvbHVtbiwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBmbGF0ID0gQXJyYXlVdGlsLmZsYXR0ZW4odGhpcy5kaXNwbGF5Q29sdW1ucywgJ2NvbHVtbnMnLCB0cnVlKS5zb3J0KFxuICAgICAgKGEsIGIpID0+IE51bWJlcihiLmxvY2tlZCkgLSBOdW1iZXIoYS5sb2NrZWQpLFxuICAgICk7XG4gICAgY29uc3QgaW5kZXggPSBmbGF0LmluZGV4T2YoY29sdW1uKTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGZsYXQuc2xpY2UoMCwgaW5kZXgpLmZpbHRlcigoXykgPT4gXy5mbGV4ID4gMCk7XG4gICAgaWYgKHByZXZpb3VzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFRhYmxlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIHByZXZpb3VzLmZvckVhY2goKGl0ZW06IFRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1Db2wgPSB0YWJsZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoYHRldGEtaGVhZC1jZWxsW2RhdGEtY29sdW1uPVwiJHtpdGVtLm5hbWV9XCJdYCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChpdGVtQ29sKSB7XG4gICAgICAgICAgaXRlbS5mbGV4ID0gMDtcbiAgICAgICAgICBpdGVtLndpZHRoID0gaXRlbUNvbC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzaXplQ29sdW1uKGV2ZW50OiBDb2x1bW5SZXNpemVFdmVudCkge1xuICAgIGlmIChldmVudC5jb2x1bW4gIT09IG51bGwgJiYgZXZlbnQuY29sdW1uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50LmNvbHVtbi53aWR0aCA9IGV2ZW50Lm5ld1dpZHRoIDwgNTAgPyA1MCA6IGV2ZW50Lm5ld1dpZHRoO1xuICAgICAgZXZlbnQuY29sdW1uLmZsZXggPSAwO1xuICAgIH1cbiAgICB0aGlzLl9jb2x1bW5zLm5leHQodGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgdGhpcy5zYXZlQ29sdW1uc1N0YXRlKCk7XG4gIH1cblxuICBhdXRvc2l6ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uLCB0YXJnZXQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgdGFibGVFbGVtZW50ID0gdGhpcy5nZXRUYWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICB0aGlzLnNldENvbHVtbkF1dG9XaWR0aChjb2x1bW4sIHRhYmxlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fY29sdW1ucy5uZXh0KHRoaXMuZGlzcGxheUNvbHVtbnMpO1xuICAgIHRoaXMuc2F2ZUNvbHVtbnNTdGF0ZSgpO1xuICB9XG5cbiAgYXV0b3NpemVBbGxDb2x1bW5zKHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0aGlzLmdldFRhYmxlRWxlbWVudCh0YXJnZXQpO1xuICAgIGNvbnN0IGZsYXQgPSBBcnJheVV0aWwuZmxhdHRlbih0aGlzLmRpc3BsYXlDb2x1bW5zLCAnY29sdW1ucycsIHRydWUpO1xuICAgIGZsYXQuZm9yRWFjaCgoY29sKSA9PiB0aGlzLnNldENvbHVtbkF1dG9XaWR0aChjb2wsIHRhYmxlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkpO1xuICAgIHRoaXMuX2NvbHVtbnMubmV4dCh0aGlzLmRpc3BsYXlDb2x1bW5zKTtcbiAgICB0aGlzLnNhdmVDb2x1bW5zU3RhdGUoKTtcbiAgfVxuXG4gIHJlb3JkZXJDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtbiwgaW5zZXJ0QmVmb3JlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kcmFnU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IENvbHVtblJlb3JkZXJFdmVudCh0aGlzLl9kcmFnU291cmNlLCBjb2x1bW4pO1xuICAgIGlmIChldmVudC5zb3VyY2UgIT09IGV2ZW50LnRhcmdldCkge1xuICAgICAgY29uc3Qgc291cmNlUGFyZW50ID0gdGhpcy5maW5kUGFyZW50KGV2ZW50LnNvdXJjZSwgdGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgICBjb25zdCB0YXJnZXRQYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnQoZXZlbnQudGFyZ2V0LCB0aGlzLmRpc3BsYXlDb2x1bW5zKTtcblxuICAgICAgaWYgKHNvdXJjZVBhcmVudCAmJiB0YXJnZXRQYXJlbnQpIHtcbiAgICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2VQYXJlbnQuaW5kZXhPZihldmVudC5zb3VyY2UpO1xuICAgICAgICBzb3VyY2VQYXJlbnQuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gdGFyZ2V0UGFyZW50LmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFpbnNlcnRCZWZvcmUpIHtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IHRhcmdldEluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRQYXJlbnQuc3BsaWNlKHRhcmdldEluZGV4LCAwLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBldmVudC5zb3VyY2UubG9ja2VkID0gZXZlbnQudGFyZ2V0LmxvY2tlZDtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uUGFyZW50KGNvbHVtbjogVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyZW50Q29sdW1uKGNvbHVtbiwgdGhpcy5kaXNwbGF5Q29sdW1ucyk7XG4gIH1cblxuICBzdGFydEVkaXRSb3coY2VsbEV2ZW50OiBJQ2VsbEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbD8ucm93ICE9PSBjZWxsRXZlbnQ/LnJvdykge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRSb3dTdG9wLm5leHQodGhpcy5fY3VycmVudEVkaXRDZWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjZWxsRXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZWRpdFJvd1N0YXJ0Lm5leHQoY2VsbEV2ZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJvb2xPckZ1bmNDYWxsYmFjazxUPih0aGlzLnJvd0VkaXRhYmxlKSh0aGlzLmdldFJvd0J5SW5kZXgoY2VsbEV2ZW50Py5yb3cpPy5kYXRhKSkge1xuICAgICAgICAgIHRoaXMuX2VkaXRSb3dTdGFydC5uZXh0KGNlbGxFdmVudCk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhcnRFZGl0Q2VsbChjZWxsRXZlbnQ6IElDZWxsRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEVkaXRDZWxsPy5jb2x1bW4gIT09IGNlbGxFdmVudD8uY29sdW1uIHx8IHRoaXMuX2N1cnJlbnRFZGl0Q2VsbD8ucm93ICE9PSBjZWxsRXZlbnQ/LnJvdykge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2VkaXRDZWxsU3RvcC5uZXh0KHRoaXMuX2N1cnJlbnRFZGl0Q2VsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjZWxsRXZlbnQ/LmNvbHVtbik7XG4gICAgICBpZiAoXG4gICAgICAgIGJvb2xPckZ1bmNDYWxsYmFjazxUPih0aGlzLnJvd0VkaXRhYmxlKSh0aGlzLmdldFJvd0J5SW5kZXgoY2VsbEV2ZW50Py5yb3cpPy5kYXRhKSAmJlxuICAgICAgICBib29sT3JGdW5jQ2FsbGJhY2s8SUNvbHVtblJvdzxUPj4oY29sdW1uPy5lZGl0YWJsZSkoe1xuICAgICAgICAgIHJvdzogdGhpcy5nZXRSb3dCeUluZGV4KGNlbGxFdmVudD8ucm93KT8uZGF0YSxcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9lZGl0Q2VsbFN0YXJ0Lm5leHQoY2VsbEV2ZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudEVkaXRDZWxsID0gY2VsbEV2ZW50O1xuICAgICAgICBjb25zdCBrZXkgPSAoY2VsbEV2ZW50Py5ldmVudCBhcyBLZXlib2FyZEV2ZW50KT8ua2V5O1xuICAgICAgICBpZiAoa2V5ICYmIChrZXkubGVuZ3RoID09PSAxIHx8IChrZXkgPT09ICdEZWxldGUnICYmICFjb2x1bW4ucmVxdWlyZWQpKSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZShjZWxsRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlUm93KHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZVJvdy5uZXh0KHJvdyk7XG4gIH1cblxuICBzZWxlY3RSb3dzKHJvd3M6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHJvd3MpO1xuICB9XG5cbiAgc2VsZWN0T3JEZXNlbGVjdFJvdyhyb3c6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dzLnZhbHVlLmluZGV4T2Yocm93KSA+PSAwKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dCh0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUuZmlsdGVyKChfKSA9PiBfICE9PSByb3cpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLm5leHQoWy4uLnRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZSwgcm93XSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmFuZ2Uocm93OiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5maW5kSW5kZXgoKF8pID0+IF8uZGF0YSA9PT0gcm93KTtcbiAgICBsZXQgbWluSW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSBjdXJyKTtcbiAgICAgIGlmIChuZXdJbmRleCA8IHByZXYpIHtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwgdGhpcy5fZGlzcGxheURhdGEudmFsdWUubGVuZ3RoKTtcbiAgICBsZXQgbWF4SW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSBjdXJyKTtcbiAgICAgIGlmIChuZXdJbmRleCA+IHByZXYpIHtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwgMCk7XG4gICAgaWYgKGluZGV4ID4gbWF4SW5kZXgpIHtcbiAgICAgIG1heEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IG1pbkluZGV4KSB7XG4gICAgICBtaW5JbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBpZiAobWluSW5kZXggPCBpbmRleCAmJiBpbmRleCA8IG1heEluZGV4KSB7XG4gICAgICBtYXhJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dChbLi4udGhpcy5fZGlzcGxheURhdGEudmFsdWUuc2xpY2UobWluSW5kZXgsIG1heEluZGV4ICsgMSkubWFwKChfKSA9PiBfLmRhdGEpXSk7XG4gIH1cblxuICBzZWxlY3RSb3cocm93OiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0VHlwZSA9PT0gU2VsZWN0VHlwZS5ub25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KFsuLi50aGlzLl9zZWxlY3RlZFJvd3MudmFsdWUsIHJvd10pO1xuICB9XG5cbiAgZGVzZWxlY3RSb3cocm93OiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0VHlwZSA9PT0gU2VsZWN0VHlwZS5ub25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZS5maWx0ZXIoKF8pID0+IF8gIT09IHJvdykpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93cy5uZXh0KHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLm1hcCgoXykgPT4gXy5kYXRhKSk7XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MubmV4dChbXSk7XG4gIH1cblxuICBhbGxSb3dzU2VsZWN0ZWQoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlPy5sZW5ndGggJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZT8ubGVuZ3RoICYmXG4gICAgICB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5ldmVyeSgoXykgPT4gdGhpcy5fc2VsZWN0ZWRSb3dzLnZhbHVlLmZpbmRJbmRleCgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkID09PSBfLmRhdGEpID49IDApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZSA9PSBudWxsIHx8IHRoaXMuX3NlbGVjdGVkUm93cy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZXRIaWRkZW5Db2x1bW5zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2F2ZUhpZGRlbkNvbHVtbnModmFsdWUpO1xuICAgIHRoaXMuX2hpZGRlbkNvbHVtbnMubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjb2x1bW5Jc0hpZGRlbihjb2x1bW46IFRhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlbkNvbHVtbnMudmFsdWUuaW5kZXhPZihjb2x1bW4ubmFtZSkgPj0gMDtcbiAgfVxuXG4gIGNoYW5nZVZhbHVlKGNvb3JkaW5hdGVzOiBJQ2VsbENvb3JkaW5hdGVzKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VkLm5leHQoY29vcmRpbmF0ZXMpO1xuICB9XG5cbiAgc2V0VmFsdWUoY2VsbFZhbHVlOiBJQ2VsbFZhbHVlKTogdm9pZDtcbiAgc2V0VmFsdWUoY2VsbFZhbHVlOiBJQ2VsbEluc3RhbmNlVmFsdWU8VD4pOiB2b2lkO1xuICBzZXRWYWx1ZShjZWxsVmFsdWU6IElDZWxsVmFsdWUgfCBJQ2VsbEluc3RhbmNlVmFsdWU8VD4pOiB2b2lkIHtcbiAgICBsZXQgdmFsdWU6IElDZWxsVmFsdWU7XG4gICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUucm93ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY2VsbFZhbHVlLmNvbHVtbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhbHVlID0ge1xuICAgICAgICByb3c6IHRoaXMuZ2V0Um93SW5kZXgoY2VsbFZhbHVlLnJvdy5kYXRhKSxcbiAgICAgICAgY29sdW1uOiBjZWxsVmFsdWUuY29sdW1uLm5hbWUsXG4gICAgICAgIHZhbHVlOiBjZWxsVmFsdWUudmFsdWUsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGNlbGxWYWx1ZSBhcyBJQ2VsbFZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZVNldC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldFJvd0J5SW5kZXgocm93SW5kZXg/OiBudW1iZXIpOiBUYWJsZVJvdzxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJvd0luZGV4ICE9PSBudWxsICYmIHJvd0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RGF0YT8udmFsdWVbcm93SW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Um93SW5kZXgocm93OiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlEYXRhLnZhbHVlLmZpbmRJbmRleCgoXykgPT4gXy5kYXRhID09PSByb3cpO1xuICB9XG5cbiAgZ2V0RXZlbnRDZWxsKGV2ZW50OiBFdmVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIGV2ZW50LmNvbXBvc2VkUGF0aCgpLmZpbmQoKHRhcmdldDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICd0ZXRhLWNlbGwnO1xuICAgIH0pIGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgZ2V0RXZlbnRSb3coZXZlbnQ6IEV2ZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gZXZlbnQuY29tcG9zZWRQYXRoKCkuZmluZCgodGFyZ2V0OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0YXJnZXQ/LmdldEF0dHJpYnV0ZSAmJiB0YXJnZXQ/LmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICB9KSBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIGdldE5leHRFZGl0YWJsZUNlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IG5leHRDZWxsID0gdGhpcy5nZXROZXh0Q2VsbChjb29yZHMpO1xuICAgIGlmICghbmV4dENlbGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShuZXh0Q2VsbD8uY29sdW1uKTtcbiAgICBpZiAoXG4gICAgICBib29sT3JGdW5jQ2FsbGJhY2s8SUNlbGxJbnN0YW5jZTxUPj4oY29sdW1uLmVkaXRhYmxlKSh7XG4gICAgICAgIHJvdzogdGhpcy5nZXRSb3dCeUluZGV4KG5leHRDZWxsLnJvdyksXG4gICAgICAgIGNvbHVtbixcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV4dENlbGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldE5leHRFZGl0YWJsZUNlbGwobmV4dENlbGwpO1xuICB9XG5cbiAgZ2V0UHJldmlvdXNFZGl0YWJsZUNlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IHByZXZDZWxsID0gdGhpcy5nZXRQcmV2aW91c0NlbGwoY29vcmRzKTtcbiAgICBpZiAoIXByZXZDZWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUocHJldkNlbGw/LmNvbHVtbik7XG4gICAgaWYgKFxuICAgICAgYm9vbE9yRnVuY0NhbGxiYWNrPElDZWxsSW5zdGFuY2U8VD4+KGNvbHVtbi5lZGl0YWJsZSkoe1xuICAgICAgICByb3c6IHRoaXMuZ2V0Um93QnlJbmRleChwcmV2Q2VsbC5yb3cpLFxuICAgICAgICBjb2x1bW4sXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuIHByZXZDZWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQcmV2aW91c0VkaXRhYmxlQ2VsbChwcmV2Q2VsbCk7XG4gIH1cblxuICBnZXROZXh0Q2VsbChjb29yZHM6IElDZWxsQ29vcmRpbmF0ZXMpOiBJQ2VsbENvb3JkaW5hdGVzIHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0RmxhdENvbHVtbnMoKTtcbiAgICBsZXQgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBsZXQgcm93SW5kZXggPSBjb29yZHM/LnJvdztcbiAgICBpZiAoY29sSW5kZXggPj0gMCAmJiByb3dJbmRleCA+PSAwKSB7XG4gICAgICBpZiAoY29sSW5kZXggPT09IGNvbHVtbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb2xJbmRleCA9IDA7XG4gICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sSW5kZXggPSBjb2xJbmRleCArIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IGNvbHVtbnNbY29sSW5kZXhdPy5uYW1lLFxuICAgICAgICByb3c6IHJvd0luZGV4LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRQcmV2aW91c0NlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgbGV0IGNvbEluZGV4ID0gY29sdW1ucy5maW5kSW5kZXgoKGNvbDogVGFibGVDb2x1bW4pID0+IGNvbC5uYW1lID09PSBjb29yZHM/LmNvbHVtbik7XG4gICAgbGV0IHJvd0luZGV4ID0gY29vcmRzPy5yb3c7XG4gICAgaWYgKGNvbEluZGV4ID49IDAgJiYgcm93SW5kZXggPj0gMCkge1xuICAgICAgaWYgKGNvbEluZGV4ID09PSAwKSB7XG4gICAgICAgIGNvbEluZGV4ID0gY29sdW1ucy5sZW5ndGggLSAxO1xuICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4IC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEluZGV4ID0gY29sSW5kZXggLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW5zW2NvbEluZGV4XT8ubmFtZSxcbiAgICAgICAgcm93OiByb3dJbmRleCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0TmV4dFJvd0NlbGwoY29vcmRzOiBJQ2VsbENvb3JkaW5hdGVzKTogSUNlbGxDb29yZGluYXRlcyB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBjb25zdCByb3dJbmRleCA9IGNvb3Jkcz8ucm93O1xuICAgIGlmIChjb2xJbmRleCA+PSAwICYmIHJvd0luZGV4ID49IDAgJiYgcm93SW5kZXggPCB0aGlzLl9kaXNwbGF5RGF0YS52YWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IGNvbHVtbnNbY29sSW5kZXhdPy5uYW1lLFxuICAgICAgICByb3c6IHJvd0luZGV4ICsgMSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0UHJldmlvdXNSb3dDZWxsKGNvb3JkczogSUNlbGxDb29yZGluYXRlcykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEZsYXRDb2x1bW5zKCk7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleCgoY29sOiBUYWJsZUNvbHVtbikgPT4gY29sLm5hbWUgPT09IGNvb3Jkcz8uY29sdW1uKTtcbiAgICBjb25zdCByb3dJbmRleCA9IGNvb3Jkcz8ucm93O1xuICAgIGlmIChjb2xJbmRleCA+PSAwICYmIHJvd0luZGV4ID4gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW5zW2NvbEluZGV4XT8ubmFtZSxcbiAgICAgICAgcm93OiByb3dJbmRleCAtIDEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXlVdGlsLmZpbmRSZWN1cnNpdmUodGhpcy5kaXNwbGF5Q29sdW1ucywgKGl0ZXJhYmxlTm9kZSkgPT4gY29sdW1uTmFtZSA9PT0gaXRlcmFibGVOb2RlLm5hbWUsICdjb2x1bW5zJyk7XG4gIH1cblxuICBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zY3JvbGxJbmRleC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Njcm9sbEluZGV4Lm5leHQoaW5kZXgpO1xuICB9XG5cbiAgZ2V0VmlzaWJsZUNvbHVtbnMoKSB7XG4gICAgY29uc3QgdmlzaWJsZSA9IEFycmF5VXRpbC5mbGF0dGVuKHRoaXMuX2NvbHVtbnMudmFsdWUsICdjb2x1bW5zJywgdHJ1ZSkuZmlsdGVyKFxuICAgICAgKF8pID0+IHRoaXMuX2hpZGRlbkNvbHVtbnMudmFsdWUuaW5kZXhPZihfLm5hbWUpIDwgMCxcbiAgICApO1xuICAgIHJldHVybiB2aXNpYmxlLnNvcnQoKGEsIGIpID0+IE51bWJlcihiLmxvY2tlZCkgLSBOdW1iZXIoYS5sb2NrZWQpKTtcbiAgfVxuXG4gIGdldENlbGxJbnN0YW5jZShjb29yZHM6IElDZWxsQ29vcmRpbmF0ZXMpOiBJQ2VsbEluc3RhbmNlPFQ+IHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvb3Jkc1xuICAgICAgPyB7XG4gICAgICAgICAgcm93OiB0aGlzLmdldFJvd0J5SW5kZXgoY29vcmRzLnJvdyksXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb29yZHMuY29sdW1uKSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1ucygpIHtcbiAgICByZXR1cm4gQXJyYXlVdGlsLmZsYXR0ZW4odGhpcy5kaXNwbGF5Q29sdW1ucywgJ2NvbHVtbnMnLCB0cnVlKS5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYi5sb2NrZWQpIC0gTnVtYmVyKGEubG9ja2VkKSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnQoY29sdW1uOiBUYWJsZUNvbHVtbiwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uW10gfCBudWxsIHtcbiAgICBjb25zdCBmb3VuZCA9IGNvbHVtbnMuZmluZCgoeCkgPT4geC5uYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gICAgaWYgKGZvdW5kICE9PSBudWxsICYmIGZvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbHVtbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5jb2x1bW5zICYmIGNvbC5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRQYXJlbnQoY29sdW1uLCBjb2wuY29sdW1ucyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyZW50Q29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW4sIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IG51bGwge1xuICAgIGNvbnN0IGZvdW5kID0gY29sdW1ucy5maW5kKCh4KSA9PiB4LmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pID49IDApO1xuICAgIGlmIChmb3VuZCAhPT0gbnVsbCAmJiBmb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sdW1ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sLmNvbHVtbnMgJiYgY29sLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFBhcmVudENvbHVtbihjb2x1bW4sIGNvbC5jb2x1bW5zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRUYWJsZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbG9zZXN0KCd0ZXRhLXRhYmxlJyk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbHVtbkF1dG9XaWR0aChjb2x1bW46IFRhYmxlQ29sdW1uLCB0YWJsZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoYHRldGEtY2VsbFtkYXRhLWNvbHVtbj1cIiR7Y29sdW1uLm5hbWV9XCJdIC5jZWxsLXRleHRgKTtcbiAgICBsZXQgbWF4V2lkdGggPSAwO1xuICAgIGNlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLnNjcm9sbFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGggPSBjZWxsLnNjcm9sbFdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFnZ0NlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChgLmFnZ3JlZ2F0ZS1jZWxsW2RhdGEtY29sdW1uPVwiJHtjb2x1bW4ubmFtZX1cIl0gLmNlbGwtdGV4dGApO1xuICAgIGFnZ0NlbGxzPy5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5zY3JvbGxXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoID0gY2VsbC5zY3JvbGxXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb2x1bW4uZmxleCA9IDA7XG4gICAgY29sdW1uLndpZHRoID0gbWF4V2lkdGggKyAyMDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJWYWx1ZShldmVudDogSUNlbGxFdmVudCkge1xuICAgIHRoaXMuc2V0VmFsdWUoe1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICB9KTtcbiAgfVxufVxuIl19