@ardium-ui/ui 1.0.2 → 2.0.1

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 (390) hide show
  1. package/esm2022/lib/_internal/boolean-component.mjs +28 -42
  2. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
  3. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +4 -4
  4. package/esm2022/lib/_internal/disablable-component.mjs +24 -22
  5. package/esm2022/lib/_internal/focusable-component.mjs +12 -25
  6. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
  7. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
  8. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
  9. package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
  10. package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
  11. package/esm2022/lib/_internal/queue.mjs +1 -1
  12. package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
  13. package/esm2022/lib/badge/badge.directive.mjs +70 -99
  14. package/esm2022/lib/badge/badge.module.mjs +4 -4
  15. package/esm2022/lib/badge/index.mjs +4 -0
  16. package/esm2022/lib/buttons/_button-base.mjs +13 -35
  17. package/esm2022/lib/buttons/button/button.component.mjs +22 -37
  18. package/esm2022/lib/buttons/button/button.module.mjs +4 -4
  19. package/esm2022/lib/buttons/button/index.mjs +3 -0
  20. package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
  21. package/esm2022/lib/buttons/fab/fab.module.mjs +4 -4
  22. package/esm2022/lib/buttons/fab/index.mjs +3 -0
  23. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
  24. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +4 -4
  25. package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
  26. package/esm2022/lib/card/card.children.mjs +32 -33
  27. package/esm2022/lib/card/card.component.mjs +14 -17
  28. package/esm2022/lib/card/card.module.mjs +4 -4
  29. package/esm2022/lib/card/index.mjs +5 -0
  30. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
  31. package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
  32. package/esm2022/lib/checkbox/index.mjs +4 -0
  33. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
  34. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +4 -4
  35. package/esm2022/lib/checkbox-list/index.mjs +4 -0
  36. package/esm2022/lib/chip/chip.component.mjs +22 -42
  37. package/esm2022/lib/chip/chip.module.mjs +4 -4
  38. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
  39. package/esm2022/lib/chip/index.mjs +5 -0
  40. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
  41. package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
  42. package/esm2022/lib/color/color-display/color-display.module.mjs +4 -4
  43. package/esm2022/lib/color/color-display/index.mjs +4 -0
  44. package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
  45. package/esm2022/lib/dialog/dialog.component.mjs +54 -130
  46. package/esm2022/lib/dialog/dialog.directives.mjs +3 -3
  47. package/esm2022/lib/dialog/dialog.module.mjs +4 -4
  48. package/esm2022/lib/dialog/dialog.types.mjs +1 -1
  49. package/esm2022/lib/dialog/index.mjs +5 -0
  50. package/esm2022/lib/divider/divider.component.mjs +9 -14
  51. package/esm2022/lib/divider/divider.module.mjs +4 -4
  52. package/esm2022/lib/divider/index.mjs +3 -0
  53. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
  54. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +4 -4
  55. package/esm2022/lib/dropdown-panel/index.mjs +4 -0
  56. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
  57. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +9 -9
  58. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
  59. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
  60. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
  61. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +18 -18
  62. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +4 -4
  63. package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
  64. package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
  65. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
  66. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +6 -6
  67. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +4 -4
  68. package/esm2022/lib/form-field-frame/index.mjs +4 -0
  69. package/esm2022/lib/icon/icon.component.mjs +32 -67
  70. package/esm2022/lib/icon/icon.module.mjs +4 -4
  71. package/esm2022/lib/icon/icon.pipe.mjs +3 -3
  72. package/esm2022/lib/icon/index.mjs +4 -0
  73. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +24 -24
  74. package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
  75. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
  76. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
  77. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +4 -4
  78. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
  79. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
  80. package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
  81. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
  82. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +9 -9
  83. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
  84. package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
  85. package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
  86. package/esm2022/lib/inputs/input/index.mjs +4 -0
  87. package/esm2022/lib/inputs/input/input.component.mjs +95 -154
  88. package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
  89. package/esm2022/lib/inputs/input/input.module.mjs +21 -7
  90. package/esm2022/lib/inputs/input-transformers.mjs +6 -6
  91. package/esm2022/lib/inputs/input-utils.mjs +75 -94
  92. package/esm2022/lib/inputs/number-input/index.mjs +4 -0
  93. package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
  94. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +3 -3
  95. package/esm2022/lib/inputs/number-input/number-input.module.mjs +4 -4
  96. package/esm2022/lib/inputs/password-input/index.mjs +5 -0
  97. package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
  98. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +12 -12
  99. package/esm2022/lib/inputs/password-input/password-input.module.mjs +4 -4
  100. package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
  101. package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
  102. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
  103. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +9 -9
  104. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +4 -4
  105. package/esm2022/lib/kbd/index.mjs +4 -0
  106. package/esm2022/lib/kbd/kbd.component.mjs +15 -29
  107. package/esm2022/lib/kbd/kbd.module.mjs +4 -4
  108. package/esm2022/lib/kbd/kbd.pipe.mjs +3 -3
  109. package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
  110. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
  111. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +4 -4
  112. package/esm2022/lib/modal/index.mjs +3 -0
  113. package/esm2022/lib/modal/modal.component.mjs +42 -83
  114. package/esm2022/lib/modal/modal.module.mjs +4 -4
  115. package/esm2022/lib/option/index.mjs +3 -0
  116. package/esm2022/lib/option/option.component.mjs +24 -46
  117. package/esm2022/lib/option/option.module.mjs +4 -4
  118. package/esm2022/lib/progress-bar/index.mjs +5 -0
  119. package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
  120. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +3 -3
  121. package/esm2022/lib/progress-bar/progress-bar.module.mjs +4 -4
  122. package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
  123. package/esm2022/lib/progress-circle/index.mjs +5 -0
  124. package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
  125. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +3 -3
  126. package/esm2022/lib/progress-circle/progress-circle.module.mjs +4 -4
  127. package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
  128. package/esm2022/lib/radio/index.mjs +4 -0
  129. package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
  130. package/esm2022/lib/radio/radio-group.component.mjs +71 -85
  131. package/esm2022/lib/radio/radio.module.mjs +4 -4
  132. package/esm2022/lib/search-functions.mjs +7 -7
  133. package/esm2022/lib/segment/index.mjs +5 -0
  134. package/esm2022/lib/segment/segment.component.mjs +70 -137
  135. package/esm2022/lib/segment/segment.directives.mjs +4 -4
  136. package/esm2022/lib/segment/segment.module.mjs +4 -4
  137. package/esm2022/lib/select/index.mjs +5 -0
  138. package/esm2022/lib/select/select.component.mjs +348 -655
  139. package/esm2022/lib/select/select.directive.mjs +46 -46
  140. package/esm2022/lib/select/select.module.mjs +4 -4
  141. package/esm2022/lib/select/select.types.mjs +1 -1
  142. package/esm2022/lib/slide-toggle/index.mjs +4 -0
  143. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
  144. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +4 -4
  145. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
  146. package/esm2022/lib/slider/abstract-slider.mjs +111 -200
  147. package/esm2022/lib/slider/index.mjs +7 -0
  148. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
  149. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +4 -4
  150. package/esm2022/lib/slider/slider.component.mjs +13 -10
  151. package/esm2022/lib/slider/slider.directive.mjs +3 -3
  152. package/esm2022/lib/slider/slider.module.mjs +7 -7
  153. package/esm2022/lib/slider/slider.types.mjs +1 -1
  154. package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
  155. package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
  156. package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
  157. package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
  158. package/esm2022/lib/spinner/index.mjs +3 -0
  159. package/esm2022/lib/spinner/spinner.component.mjs +9 -13
  160. package/esm2022/lib/spinner/spinner.module.mjs +4 -4
  161. package/esm2022/lib/star/index.mjs +4 -0
  162. package/esm2022/lib/star/star-button/index.mjs +3 -0
  163. package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
  164. package/esm2022/lib/star/star-button/star-button.module.mjs +4 -4
  165. package/esm2022/lib/star/star-display/index.mjs +3 -0
  166. package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
  167. package/esm2022/lib/star/star-display/star-display.module.mjs +4 -4
  168. package/esm2022/lib/star/star-input/index.mjs +3 -0
  169. package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
  170. package/esm2022/lib/star/star-input/star-input.module.mjs +4 -4
  171. package/esm2022/lib/star/star.component.mjs +12 -20
  172. package/esm2022/lib/star/star.module.mjs +4 -4
  173. package/esm2022/lib/statebox/index.mjs +3 -0
  174. package/esm2022/lib/statebox/statebox.component.mjs +64 -102
  175. package/esm2022/lib/statebox/statebox.module.mjs +4 -4
  176. package/esm2022/lib/statebox/statebox.types.mjs +1 -1
  177. package/esm2022/lib/tabber/index.mjs +4 -0
  178. package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
  179. package/esm2022/lib/tabber/tabber.component.mjs +83 -0
  180. package/esm2022/lib/tabber/tabber.module.mjs +19 -0
  181. package/esm2022/lib/table/index.mjs +5 -0
  182. package/esm2022/lib/table/table-item-storage.mjs +204 -200
  183. package/esm2022/lib/table/table.component.mjs +184 -304
  184. package/esm2022/lib/table/table.directives.mjs +19 -21
  185. package/esm2022/lib/table/table.module.mjs +4 -4
  186. package/esm2022/lib/table/utils.mjs +1 -1
  187. package/esm2022/lib/table-from-csv/index.mjs +3 -0
  188. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
  189. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +4 -4
  190. package/esm2022/lib/table-pagination/index.mjs +4 -0
  191. package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
  192. package/esm2022/lib/table-pagination/table-pagination.module.mjs +4 -4
  193. package/esm2022/lib/types/item-storage.types.mjs +1 -1
  194. package/esm2022/lib/types/utility.types.mjs +2 -2
  195. package/esm2022/public-api.mjs +58 -182
  196. package/fesm2022/ardium-ui-ui.mjs +7847 -11692
  197. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  198. package/lib/_internal/boolean-component.d.ts +8 -9
  199. package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
  200. package/lib/_internal/disablable-component.d.ts +12 -7
  201. package/lib/_internal/focusable-component.d.ts +5 -7
  202. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
  203. package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
  204. package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
  205. package/lib/_internal/models/pagination.model.d.ts +38 -42
  206. package/lib/_internal/ngmodel-component.d.ts +1 -1
  207. package/lib/_internal/selectable-list-component.d.ts +30 -30
  208. package/lib/badge/badge.directive.d.ts +15 -20
  209. package/lib/badge/index.d.ts +3 -0
  210. package/lib/buttons/_button-base.d.ts +9 -12
  211. package/lib/buttons/button/button.component.d.ts +6 -8
  212. package/lib/buttons/button/index.d.ts +2 -0
  213. package/lib/buttons/fab/fab.component.d.ts +4 -6
  214. package/lib/buttons/fab/index.d.ts +2 -0
  215. package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
  216. package/lib/buttons/icon-button/index.d.ts +2 -0
  217. package/lib/card/card.children.d.ts +4 -3
  218. package/lib/card/card.component.d.ts +5 -4
  219. package/lib/card/index.d.ts +4 -0
  220. package/lib/checkbox/checkbox.component.d.ts +8 -12
  221. package/lib/checkbox/index.d.ts +3 -0
  222. package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
  223. package/lib/checkbox-list/index.d.ts +3 -0
  224. package/lib/chip/chip.component.d.ts +8 -10
  225. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
  226. package/lib/chip/index.d.ts +4 -0
  227. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
  228. package/lib/color/color-display/color-display.component.d.ts +6 -9
  229. package/lib/color/color-display/index.d.ts +3 -0
  230. package/lib/color/color-picker/color-picker.types.d.ts +4 -4
  231. package/lib/dialog/dialog.component.d.ts +25 -35
  232. package/lib/dialog/dialog.types.d.ts +2 -2
  233. package/lib/dialog/index.d.ts +4 -0
  234. package/lib/divider/divider.component.d.ts +3 -4
  235. package/lib/divider/index.d.ts +2 -0
  236. package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
  237. package/lib/dropdown-panel/index.d.ts +3 -0
  238. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
  239. package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
  240. package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
  241. package/lib/file-inputs/file-input/index.d.ts +3 -0
  242. package/lib/file-inputs/file-input-base.d.ts +13 -18
  243. package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
  244. package/lib/form-field-frame/index.d.ts +3 -0
  245. package/lib/icon/icon.component.d.ts +10 -19
  246. package/lib/icon/index.d.ts +3 -0
  247. package/lib/inputs/color-input/color-input.types.d.ts +2 -2
  248. package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
  249. package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
  250. package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
  251. package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
  252. package/lib/inputs/digit-input/index.d.ts +3 -0
  253. package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
  254. package/lib/inputs/hex-input/index.d.ts +3 -0
  255. package/lib/inputs/hex-input.model.d.ts +10 -11
  256. package/lib/inputs/input/index.d.ts +3 -0
  257. package/lib/inputs/input/input.component.d.ts +34 -40
  258. package/lib/inputs/input/input.directives.d.ts +3 -3
  259. package/lib/inputs/input-utils.d.ts +24 -27
  260. package/lib/inputs/number-input/index.d.ts +3 -0
  261. package/lib/inputs/number-input/number-input.component.d.ts +38 -48
  262. package/lib/inputs/password-input/index.d.ts +4 -0
  263. package/lib/inputs/password-input/password-input.component.d.ts +28 -40
  264. package/lib/inputs/password-input/password-input.types.d.ts +2 -2
  265. package/lib/inputs/simple-input/index.d.ts +3 -0
  266. package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
  267. package/lib/kbd/index.d.ts +3 -0
  268. package/lib/kbd/kbd.component.d.ts +6 -8
  269. package/lib/kbd-shortcut/index.d.ts +2 -0
  270. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
  271. package/lib/modal/index.d.ts +2 -0
  272. package/lib/modal/modal.component.d.ts +22 -30
  273. package/lib/option/index.d.ts +2 -0
  274. package/lib/option/option.component.d.ts +11 -16
  275. package/lib/progress-bar/index.d.ts +4 -0
  276. package/lib/progress-bar/progress-bar.component.d.ts +14 -20
  277. package/lib/progress-bar/progress-bar.types.d.ts +2 -2
  278. package/lib/progress-circle/index.d.ts +4 -0
  279. package/lib/progress-circle/progress-circle.component.d.ts +12 -20
  280. package/lib/progress-circle/progress-circle.types.d.ts +2 -2
  281. package/lib/radio/index.d.ts +3 -0
  282. package/lib/radio/radio/radio.component.d.ts +7 -8
  283. package/lib/radio/radio-group.component.d.ts +13 -16
  284. package/lib/segment/index.d.ts +4 -0
  285. package/lib/segment/segment.component.d.ts +22 -34
  286. package/lib/segment/segment.directives.d.ts +2 -3
  287. package/lib/select/index.d.ts +4 -0
  288. package/lib/select/select.component.d.ts +114 -160
  289. package/lib/select/select.directive.d.ts +3 -3
  290. package/lib/select/select.types.d.ts +2 -76
  291. package/lib/slide-toggle/index.d.ts +3 -0
  292. package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
  293. package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
  294. package/lib/slider/abstract-slider.d.ts +38 -55
  295. package/lib/slider/index.d.ts +6 -0
  296. package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
  297. package/lib/slider/slider.component.d.ts +2 -0
  298. package/lib/slider/slider.types.d.ts +8 -8
  299. package/lib/snackbar/snackbar-ref.d.ts +1 -2
  300. package/lib/snackbar/snackbar.component.d.ts +3 -3
  301. package/lib/snackbar/snackbar.service.d.ts +2 -2
  302. package/lib/snackbar/snackbar.types.d.ts +4 -4
  303. package/lib/spinner/index.d.ts +2 -0
  304. package/lib/spinner/spinner.component.d.ts +3 -3
  305. package/lib/star/index.d.ts +3 -0
  306. package/lib/star/star-button/index.d.ts +2 -0
  307. package/lib/star/star-button/star-button.component.d.ts +7 -7
  308. package/lib/star/star-display/index.d.ts +2 -0
  309. package/lib/star/star-display/star-display.component.d.ts +8 -12
  310. package/lib/star/star-input/index.d.ts +2 -0
  311. package/lib/star/star-input/star-input.component.d.ts +17 -22
  312. package/lib/star/star.component.d.ts +5 -5
  313. package/lib/statebox/index.d.ts +3 -0
  314. package/lib/statebox/statebox.component.d.ts +15 -21
  315. package/lib/statebox/statebox.types.d.ts +12 -8
  316. package/lib/tabber/index.d.ts +3 -0
  317. package/lib/tabber/tab/tab.component.d.ts +18 -0
  318. package/lib/tabber/tabber.component.d.ts +25 -0
  319. package/lib/tabber/tabber.module.d.ts +9 -0
  320. package/lib/table/index.d.ts +4 -0
  321. package/lib/table/table-item-storage.d.ts +70 -58
  322. package/lib/table/table.component.d.ts +59 -78
  323. package/lib/table/table.directives.d.ts +4 -3
  324. package/lib/table-from-csv/index.d.ts +2 -0
  325. package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
  326. package/lib/table-pagination/index.d.ts +3 -0
  327. package/lib/table-pagination/table-pagination.component.d.ts +21 -30
  328. package/lib/types/item-storage.types.d.ts +19 -18
  329. package/lib/types/utility.types.d.ts +2 -1
  330. package/package.json +8 -9
  331. package/prebuilt-themes/default/badge.css +5 -5
  332. package/prebuilt-themes/default/buttons/fab.css +4 -3
  333. package/prebuilt-themes/default/buttons/fab.css.map +1 -1
  334. package/prebuilt-themes/default/card.css +7 -7
  335. package/prebuilt-themes/default/chips.css +3 -8
  336. package/prebuilt-themes/default/chips.css.map +1 -1
  337. package/prebuilt-themes/default/core.css +6 -3
  338. package/prebuilt-themes/default/core.css.map +1 -1
  339. package/prebuilt-themes/default/inputs/color-input.css +1 -1
  340. package/prebuilt-themes/default/inputs/digit-input.css +1 -1
  341. package/prebuilt-themes/default/inputs/file-input.css +139 -2
  342. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  343. package/prebuilt-themes/default/inputs/hex-input.css +2 -2
  344. package/prebuilt-themes/default/inputs/input.css +1 -1
  345. package/prebuilt-themes/default/inputs/search-bar.css +1 -1
  346. package/prebuilt-themes/default/inputs/simple-input.css +1 -1
  347. package/prebuilt-themes/default/modal.css +1 -1
  348. package/prebuilt-themes/default/segment.css +2 -2
  349. package/prebuilt-themes/default/segment.css.map +1 -1
  350. package/prebuilt-themes/default/select.css +5 -3
  351. package/prebuilt-themes/default/select.css.map +1 -1
  352. package/prebuilt-themes/default/snackbar.css +0 -1
  353. package/prebuilt-themes/default/snackbar.css.map +1 -1
  354. package/prebuilt-themes/default/tabber.css +207 -0
  355. package/prebuilt-themes/default/tabber.css.map +1 -0
  356. package/public-api.d.ts +43 -136
  357. package/themes/default/_clear-button.scss +1 -1
  358. package/themes/default/badge.scss +5 -5
  359. package/themes/default/buttons/fab.scss +5 -3
  360. package/themes/default/card.scss +7 -7
  361. package/themes/default/chips.scss +2 -8
  362. package/themes/default/core.scss +6 -3
  363. package/themes/default/inputs/digit-input.scss +1 -1
  364. package/themes/default/inputs/file-input.scss +8 -1
  365. package/themes/default/inputs/hex-input.scss +1 -1
  366. package/themes/default/modal.scss +1 -1
  367. package/themes/default/segment.scss +2 -1
  368. package/themes/default/select.scss +4 -2
  369. package/themes/default/snackbar.scss +0 -2
  370. package/themes/default/tabber.scss +86 -0
  371. package/esm2022/lib/calendar/calendar.component.mjs +0 -979
  372. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  373. package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
  374. package/esm2022/lib/calendar/calendar.module.mjs +0 -21
  375. package/esm2022/lib/calendar/calendar.types.mjs +0 -11
  376. package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
  377. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
  378. package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
  379. package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
  380. package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
  381. package/lib/calendar/calendar.component.d.ts +0 -155
  382. package/lib/calendar/calendar.directives.d.ts +0 -51
  383. package/lib/calendar/calendar.helpers.d.ts +0 -15
  384. package/lib/calendar/calendar.module.d.ts +0 -11
  385. package/lib/calendar/calendar.types.d.ts +0 -80
  386. package/lib/color/color-picker/color-picker.component.d.ts +0 -125
  387. package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
  388. package/lib/color/color-picker/color-picker.module.d.ts +0 -13
  389. package/lib/inputs/color-input/color-input.component.d.ts +0 -147
  390. package/lib/inputs/color-input/color-input.module.d.ts +0 -16
@@ -1,11 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, EventEmitter, Input, Output, TemplateRef, ViewEncapsulation, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input, TemplateRef, ViewEncapsulation, computed, contentChild, contentChildren, input, model, output, } from '@angular/core';
2
2
  import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
3
- import { isDefined } from 'simple-bool';
3
+ import { isDefined, isNumber } from 'simple-bool';
4
4
  import { _FocusableComponentBase } from '../_internal/focusable-component';
5
5
  import { CheckboxState } from '../checkbox/checkbox.types';
6
6
  import { PaginationAlign } from '../table-pagination/table-pagination.types';
7
7
  import { ComponentColor, SimpleComponentColor } from '../types/colors.types';
8
- import { TableItemStorage } from './table-item-storage';
8
+ import { ArdTableRow, TableItemStorage } from './table-item-storage';
9
9
  import { ArdiumTableCaptionTemplateDirective, ArdiumTableCheckboxTemplateDirective, ArdiumTableHeaderCheckboxTemplateDirective, ArdiumTableTemplateDirective, } from './table.directives';
10
10
  import { TableAlignType, TableAppearance, TablePaginationStrategy, TableVariant, } from './table.types';
11
11
  import { isTableSubheader } from './utils';
@@ -22,159 +22,139 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
22
22
  rowDisabledFrom: 'disabled',
23
23
  rowBoldFrom: 'bold',
24
24
  };
25
- this._invertRowDisabled = false;
26
- this._invertRowBold = false;
27
- this._selectableRows = false;
25
+ this.rowDisabledFrom = input(undefined);
26
+ this.rowBoldFrom = input(undefined);
27
+ this.invertRowDisabled = input(false, { transform: v => coerceBooleanProperty(v) });
28
+ this.invertRowBold = input(false, { transform: v => coerceBooleanProperty(v) });
29
+ this.selectableRows = input(false, { transform: v => coerceBooleanProperty(v) });
30
+ this.maxSelectedItems = input(undefined, { transform: v => coerceNumberProperty(v, undefined) });
31
+ this.clickableRows = input(false, { transform: v => coerceBooleanProperty(v) });
32
+ this.caption = input(undefined);
33
+ this.isLoading = input(false, { transform: v => coerceBooleanProperty(v) });
34
+ this.loadingProgress = input(0, { transform: v => coerceNumberProperty(v, 0) }); //TODO add progress bar
28
35
  //! appearance
29
- this.appearance = TableAppearance.Strong;
30
- this.variant = TableVariant.Rounded;
31
- this.color = ComponentColor.Primary;
32
- this.align = TableAlignType.CenterLeft;
33
- this.headerAlign = TableAlignType.CenterLeft;
34
- this._compact = false;
35
- this._zebra = false;
36
- this._stickyHeader = false;
36
+ this.appearance = input(TableAppearance.Strong);
37
+ this.variant = input(TableVariant.Rounded);
38
+ this.color = input(ComponentColor.Primary);
39
+ this.align = input(TableAlignType.CenterLeft);
40
+ this.headerAlign = input(TableAlignType.CenterLeft);
41
+ this.compact = input(false, { transform: v => coerceBooleanProperty(v) });
42
+ this.zebra = input(false, { transform: v => coerceBooleanProperty(v) });
43
+ this.stickyHeader = input(false, { transform: v => coerceBooleanProperty(v) });
44
+ this.ngClasses = computed(() => [
45
+ `ard-appearance-${this.appearance()}`,
46
+ `ard-variant-${this.variant()}`,
47
+ `ard-color-${this.color()}`,
48
+ `ard-align-${this.align()}`,
49
+ `ard-header-align-${this.headerAlign()}`,
50
+ this.compact() ? 'ard-compact' : '',
51
+ this.zebra() ? 'ard-zebra-table' : '',
52
+ this.selectableRows() ? 'ard-selectable-rows' : '',
53
+ this.stickyHeader() ? 'ard-sticky-header' : '',
54
+ this.isLoading() ? 'ard-table-loading' : '',
55
+ ].join(' '));
37
56
  //! pagination
38
- this._paginated = false;
39
- this.paginationStrategy = TablePaginationStrategy.Noop;
40
- this.paginationOptions = [10, 25, 50];
41
- this.paginationColor = ComponentColor.None;
42
- this.paginationAlign = PaginationAlign.Split;
43
- this.itemsPerPageText = 'Items per page:';
44
- this.currentItemsFormatFn = ({ currentItemsFirst, currentItemsLast, totalItems }) => {
45
- return `${currentItemsFirst} ${currentItemsLast} of ${totalItems}`;
46
- };
47
- this._pageFillRemaining = false;
48
- this._paginationDisabled = false;
49
- this._useFirstLastButtons = false;
50
- this._itemsPerPage = 50;
51
- this.itemsPerPageChange = new EventEmitter();
52
- this._page = 1;
53
- this.pageChange = new EventEmitter();
57
+ this.paginated = input(false, { transform: v => coerceBooleanProperty(v) });
58
+ this.paginationStrategy = input(TablePaginationStrategy.Noop);
59
+ this.paginationOptions = input([10, 25, 50], {
60
+ transform: v => {
61
+ return v.filter(el => {
62
+ const opt = isNumber(el) ? el : el.value;
63
+ if (opt <= 0 || opt % 1 !== 0) {
64
+ console.error(new Error(`ARD-NF5052: each item of <ard-table>'s [paginationOptions] must be a positive integer. The "${opt}" option will be ignored.`));
65
+ return false;
66
+ }
67
+ return true;
68
+ });
69
+ },
70
+ });
71
+ this.totalItems = input(undefined, { transform: v => coerceNumberProperty(v, undefined) });
72
+ this.paginationColor = input(ComponentColor.None);
73
+ this.paginationAlign = input(PaginationAlign.Split);
74
+ this.itemsPerPageText = input('Items per page:');
75
+ this.currentItemsFormatFn = input(({ currentItemsFirst, currentItemsLast, totalItems }) => `${currentItemsFirst} – ${currentItemsLast} of ${totalItems}`);
76
+ this.pageFillRemaining = input(false, { transform: v => coerceBooleanProperty(v) });
77
+ this.paginationDisabled = input(false, { transform: v => coerceBooleanProperty(v) });
78
+ this.useFirstLastButtons = input(false, { transform: v => coerceBooleanProperty(v) });
79
+ this.itemsPerPage = model(50);
80
+ this.page = model(1);
81
+ this.isDefinedTotalItems = computed(() => this.paginationStrategy() !== TablePaginationStrategy.Noop || isDefined(this.totalItems()));
82
+ this.canDisplayPagination = computed(() => this.paginated() && this.isDefinedTotalItems());
83
+ //! item storage getters
84
+ this.headerCells = computed(() => this._itemStorage.headerCells());
85
+ this.dataRows = computed(() => {
86
+ const items = this._itemStorage.paginatedItems();
87
+ if (!this.pageFillRemaining())
88
+ return items;
89
+ if (!this.isDefinedTotalItems()) {
90
+ throw new Error('ARD-FT5050: <ard-table> requires [totalItems] to be defined when using "slice" pagination strategy.');
91
+ }
92
+ if (this.page() === 1)
93
+ return items;
94
+ const ipp = this.itemsPerPage();
95
+ for (let i = items.length; i < ipp; i++) {
96
+ items.push(ArdTableRow.newEmptyCell(i));
97
+ }
98
+ return items;
99
+ });
54
100
  this._data = [];
55
- this._treatDataSourceAsString = false;
101
+ this.treatDataSourceAsString = input(false, { transform: v => coerceBooleanProperty(v) });
102
+ this._suppressErrors = input(false);
103
+ //! templates
104
+ this.checkboxTemplate = contentChild(ArdiumTableCheckboxTemplateDirective, {
105
+ read: (TemplateRef),
106
+ });
107
+ this.headerCheckboxTemplate = contentChild(ArdiumTableHeaderCheckboxTemplateDirective, {
108
+ read: (TemplateRef),
109
+ });
110
+ this.captionTemplate = contentChild(ArdiumTableCaptionTemplateDirective, {
111
+ read: (TemplateRef),
112
+ });
56
113
  this._itemTemplates = {};
57
- this.selectedRowsChangeEvent = new EventEmitter();
58
- this.failedSelectRowEvent = new EventEmitter();
59
- this.selectRowEvent = new EventEmitter();
60
- this.unselectRowEvent = new EventEmitter();
61
- }
62
- get invertRowDisabled() {
63
- return this._invertRowDisabled;
64
- }
65
- set invertRowDisabled(v) {
66
- this._invertRowDisabled = coerceBooleanProperty(v);
67
- }
68
- get invertRowBold() {
69
- return this._invertRowBold;
70
- }
71
- set invertRowBold(v) {
72
- this._invertRowBold = coerceBooleanProperty(v);
73
- }
74
- get selectableRows() {
75
- return this._selectableRows;
76
- }
77
- set selectableRows(v) {
78
- this._selectableRows = coerceBooleanProperty(v);
79
- }
80
- get compact() {
81
- return this._compact;
82
- }
83
- set compact(v) {
84
- this._compact = coerceBooleanProperty(v);
85
- }
86
- get zebra() {
87
- return this._zebra;
88
- }
89
- set zebra(v) {
90
- this._zebra = coerceBooleanProperty(v);
91
- }
92
- get stickyHeader() {
93
- return this._stickyHeader;
94
- }
95
- set stickyHeader(v) {
96
- this._stickyHeader = coerceBooleanProperty(v);
97
- }
98
- get ngClasses() {
99
- return [
100
- `ard-appearance-${this.appearance}`,
101
- `ard-variant-${this.variant}`,
102
- `ard-color-${this.color}`,
103
- `ard-align-${this.align}`,
104
- `ard-header-align-${this.headerAlign}`,
105
- this.compact ? 'ard-compact' : '',
106
- this.zebra ? 'ard-zebra-table' : '',
107
- this.selectableRows ? 'ard-selectable-rows' : '',
108
- this.stickyHeader ? 'ard-sticky-header' : '',
109
- this.isLoading ? 'ard-table-loading' : '',
110
- ].join(' ');
111
- }
112
- get paginated() {
113
- return this._paginated;
114
- }
115
- set paginated(v) {
116
- this._paginated = coerceBooleanProperty(v);
117
- }
118
- get pageFillRemaining() {
119
- return this._pageFillRemaining;
120
- }
121
- set pageFillRemaining(v) {
122
- this._pageFillRemaining = coerceBooleanProperty(v);
123
- }
124
- get paginationDisabled() {
125
- return this._paginationDisabled;
126
- }
127
- set paginationDisabled(v) {
128
- this._paginationDisabled = coerceBooleanProperty(v);
129
- }
130
- get useFirstLastButtons() {
131
- return this._useFirstLastButtons;
132
- }
133
- set useFirstLastButtons(v) {
134
- this._useFirstLastButtons = coerceBooleanProperty(v);
135
- }
136
- get itemsPerPage() {
137
- return this._itemsPerPage;
138
- }
139
- set itemsPerPage(v) {
140
- this._itemsPerPage = coerceNumberProperty(v);
141
- }
142
- get page() {
143
- return this._page;
144
- }
145
- set page(v) {
146
- this._page = coerceNumberProperty(v);
147
- }
148
- get isDefinedTotalItems() {
149
- return (this.paginationStrategy == TablePaginationStrategy.Noop && isDefined(this.totalItems)) || this.paginationStrategy != TablePaginationStrategy.Noop;
150
- }
151
- get canDisplayPagination() {
152
- //prettier-ignore
153
- return this.paginated && this.isDefinedTotalItems;
154
- }
155
- //! item storage getters
156
- get headerCells() {
157
- return this._itemStorage.headerCells;
158
- }
159
- get dataRows() {
160
- const items = this._itemStorage.paginatedItems;
161
- if (!this.pageFillRemaining)
162
- return items;
163
- if (!this.isDefinedTotalItems) {
164
- throw new Error('<ard-table> requires [totalItems] to be defined.');
114
+ this.templateChildren = contentChildren(ArdiumTableTemplateDirective);
115
+ this.selectedRowsChangeEvent = output({ alias: 'selectedRowsChange' });
116
+ this.failedSelectRowEvent = output({ alias: 'failedSelectRow' });
117
+ this.selectRowEvent = output({ alias: 'selectRow' });
118
+ this.unselectRowEvent = output({ alias: 'unselectRow' });
119
+ this.clickRowEvent = output({ alias: 'clickRow' });
120
+ this.getHeaderCheckboxContext = computed(() => {
121
+ let state = CheckboxState.Unselected;
122
+ if (this._itemStorage.isAnyItemSelected()) {
123
+ state = CheckboxState.Indeterminate;
124
+ if (this._itemStorage.areAllSelected()) {
125
+ state = CheckboxState.Selected;
126
+ }
127
+ }
128
+ return {
129
+ $implicit: state,
130
+ state,
131
+ onChange: () => {
132
+ this.toggleAllRowsSelected();
133
+ },
134
+ };
135
+ });
136
+ }
137
+ //! print errors if needed
138
+ ngOnChanges(changes) {
139
+ if (changes['itemsPerPage']) {
140
+ const ipp = changes['itemsPerPage'].currentValue;
141
+ const options = changes['paginationOptions']?.currentValue ||
142
+ this.paginationOptions();
143
+ if (!options.find(v => (typeof v === 'number' ? v === ipp : v.value === ipp))) {
144
+ console.error(new Error(`ARD-NF5051: value of "${ipp}" in <ard-table>'s [itemsPerPage] does not appear in [paginationOptions] array [${options
145
+ .map(v => (typeof v === 'number' ? v : v.value))
146
+ .join(', ')}]`));
147
+ }
165
148
  }
166
- if (this.page == 1)
167
- return items;
168
- for (let i = items.length; i < this.itemsPerPage; i++) {
169
- items.push({
170
- itemData: null,
171
- index: i,
172
- data: [],
173
- dataColumns: [],
174
- isEmpty: true,
175
- });
149
+ if (changes['page']) {
150
+ const page = changes['page'].currentValue;
151
+ if (page === 0) {
152
+ throw new Error(`ARD-FT5053a: <ard-table>'s [page] uses 1-indexed numbering system. The value 0 is not accepted.`);
153
+ }
154
+ else if (page < 0 || page % 1 !== 0) {
155
+ throw new Error(`ARD-FT5053b: value of <ard-table>'s [page] must be a positive integer, got "${page}".`);
156
+ }
176
157
  }
177
- return items;
178
158
  }
179
159
  //! columns/data setters
180
160
  set columns(v) {
@@ -187,31 +167,26 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
187
167
  get data() {
188
168
  return this._data;
189
169
  }
190
- get treatDataSourceAsString() {
191
- return this._treatDataSourceAsString;
192
- }
193
- set treatDataSourceAsString(v) {
194
- this._treatDataSourceAsString = coerceBooleanProperty(v);
195
- }
196
170
  ngAfterContentInit() {
197
- const templates = Array.from(this.templateChildren);
171
+ const templates = Array.from(this.templateChildren());
198
172
  for (const instance of templates) {
199
- if (!instance.name) {
200
- console.error(new Error('[ard-table-tmp] requires a value to be specified.'));
173
+ const name = instance.name();
174
+ if (!name) {
175
+ console.error(new Error('ARD-FT5054: [ard-table-tmp] requires a value to be specified.'));
201
176
  continue;
202
177
  }
203
- this._itemTemplates[instance.name] = instance.template;
178
+ this._itemTemplates[name] = instance.template;
204
179
  }
205
180
  }
206
181
  getHeaderTemplate(tmp) {
207
- if (typeof tmp == 'string')
182
+ if (typeof tmp === 'string')
208
183
  return undefined;
209
184
  return this.getCellTemplate(tmp.template);
210
185
  }
211
186
  getHeaderCheckboxColor() {
212
- if (this.appearance == TableAppearance.Strong)
187
+ if (this.appearance() === TableAppearance.Strong)
213
188
  return SimpleComponentColor.CurrentColor;
214
- return this.color;
189
+ return this.color();
215
190
  }
216
191
  getCellTemplate(tmp) {
217
192
  //return undefined
@@ -222,7 +197,7 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
222
197
  return tmp;
223
198
  //check if the name can be found
224
199
  if (!(tmp in this._itemTemplates)) {
225
- console.error(new Error(`<ard-table> error: cannot find template named "${tmp}"`));
200
+ console.error(new Error(`ARD-NF5055: <ard-table> error: cannot find template named "${tmp}"`));
226
201
  return undefined;
227
202
  }
228
203
  //return the template
@@ -231,31 +206,37 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
231
206
  getCellStyle(cell) {
232
207
  if (isTableSubheader(cell))
233
208
  return 'width:unset;min-width:unset';
234
- const width = typeof cell.width == 'number' ? `${cell.width}px` : cell.width;
235
- const minWidth = typeof cell.minWidth == 'number' ? `${cell.minWidth}px` : cell.minWidth;
209
+ const width = typeof cell.width === 'number' ? `${cell.width}px` : cell.width;
210
+ const minWidth = typeof cell.minWidth === 'number' ? `${cell.minWidth}px` : cell.minWidth;
236
211
  return [`width:${width ?? 'unset'}`, `min-width:${minWidth ?? 'unset'}`].join(';');
237
212
  }
238
213
  //! click & hover handlers
239
214
  onCheckboxClick(index) {
240
215
  this.toggleRowSelected(index);
241
216
  }
242
- onRowClick(index, event) {
243
- if (!this.selectableRows)
217
+ onRowClick(row, event) {
218
+ if (this.clickableRows()) {
219
+ event.stopPropagation();
220
+ this.clickRowEvent.emit(row.itemData());
244
221
  return;
245
- event.stopPropagation();
246
- this.toggleRowSelected(index);
222
+ }
223
+ if (this.selectableRows()) {
224
+ event.stopPropagation();
225
+ this.toggleRowSelected(row.index());
226
+ return;
227
+ }
247
228
  }
248
229
  onRowMouseOver(event) {
249
230
  event.stopPropagation();
250
231
  }
251
232
  onRowMouseEnter(index, event) {
252
- if (!this.selectableRows)
233
+ if (!this.selectableRows() && !this.clickableRows())
253
234
  return;
254
235
  event.stopPropagation();
255
236
  this._itemStorage.highlightSingleItem(index);
256
237
  }
257
238
  onRowMouseLeave(index, event) {
258
- if (!this.selectableRows)
239
+ if (!this.selectableRows() && !this.clickableRows())
259
240
  return;
260
241
  event.stopPropagation();
261
242
  this._itemStorage.unhighlightItem(index);
@@ -269,12 +250,15 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
269
250
  toggleRowSelected(index) {
270
251
  if (this._itemStorage.isItemSelected(index)) {
271
252
  const unselected = this._itemStorage.unselectItem(index);
272
- this.unselectRowEvent.emit(unselected);
253
+ if (unselected.length)
254
+ this.unselectRowEvent.emit(unselected);
273
255
  }
274
256
  else {
275
257
  const [selected, failed] = this._itemStorage.selectItem(index);
276
- this.selectRowEvent.emit(selected);
277
- this.failedSelectRowEvent.emit(failed);
258
+ if (selected.length)
259
+ this.selectRowEvent.emit(selected);
260
+ if (failed.length)
261
+ this.failedSelectRowEvent.emit(failed);
278
262
  }
279
263
  this._emitSelect();
280
264
  }
@@ -282,40 +266,43 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
282
266
  * Toggles the selection state of all rows in the table.
283
267
  */
284
268
  toggleAllRowsSelected() {
285
- if (this._itemStorage.areAllSelected) {
269
+ if (this._itemStorage.areAllSelected()) {
286
270
  const unselected = this._itemStorage.unselectAll();
287
- this.unselectRowEvent.emit(unselected);
271
+ if (unselected.length)
272
+ this.unselectRowEvent.emit(unselected);
288
273
  }
289
274
  else {
290
275
  const [selected, failed] = this._itemStorage.selectAll();
291
- this.selectRowEvent.emit(selected);
292
- this.failedSelectRowEvent.emit(failed);
276
+ if (selected.length)
277
+ this.selectRowEvent.emit(selected);
278
+ if (failed.length)
279
+ this.failedSelectRowEvent.emit(failed);
293
280
  }
294
281
  this._emitSelect();
295
282
  }
296
283
  _emitSelect() {
297
- const v = this._itemStorage.value;
284
+ const v = this._itemStorage.value();
298
285
  this.selectedRowsChangeEvent.emit(v);
299
286
  }
300
287
  isCellCheckbox(cell) {
301
- return typeof cell == 'object' && '_ardCheckbox' in cell && 'index' in cell;
288
+ return typeof cell === 'object' && '_ardCheckbox' in cell && 'index' in cell;
302
289
  }
303
290
  isHeaderCellCheckbox(cell) {
304
- const dataCell = cell.cell;
291
+ const dataCell = cell.cell();
305
292
  if (isTableSubheader(dataCell))
306
293
  return false;
307
- if (typeof dataCell.dataSource == 'string')
294
+ if (typeof dataCell.dataSource === 'string')
308
295
  return false;
309
- return dataCell.dataSource.type == 'checkbox';
296
+ return dataCell.dataSource.type === 'checkbox';
310
297
  }
311
298
  isHeaderCellSortable(cell) {
312
- const dataCell = cell.cell;
299
+ const dataCell = cell.cell();
313
300
  if (isTableSubheader(dataCell))
314
301
  return false;
315
302
  return dataCell.sortable ?? false;
316
303
  }
317
304
  getHeaderContext(cell, index) {
318
- if (typeof cell.header != 'string')
305
+ if (typeof cell.header !== 'string')
319
306
  return null;
320
307
  if (isTableSubheader(cell))
321
308
  return {
@@ -327,7 +314,7 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
327
314
  header: cell.header,
328
315
  sortable: cell.sortable ?? false,
329
316
  sortType: this._itemStorage.getColumnSortType(index),
330
- onTriggerSort: (event) => this._itemStorage.toggleCurrentSortColumn(index),
317
+ onTriggerSort: () => this._itemStorage.toggleCurrentSortColumn(index),
331
318
  onTriggerResetSort: (event) => {
332
319
  this._itemStorage.resetSort();
333
320
  event?.preventDefault();
@@ -335,134 +322,27 @@ export class ArdiumTableComponent extends _FocusableComponentBase {
335
322
  },
336
323
  };
337
324
  }
338
- getHeaderCheckboxContext() {
339
- let state = CheckboxState.Unselected;
340
- if (this._itemStorage.isAnyItemSelected) {
341
- state = CheckboxState.Indeterminate;
342
- if (this._itemStorage.areAllSelected) {
343
- state = CheckboxState.Selected;
344
- }
345
- }
346
- return {
347
- $implicit: state,
348
- state,
349
- onChange: () => {
350
- this.toggleAllRowsSelected();
351
- },
352
- };
353
- }
354
325
  getCheckboxContext(index) {
355
- const item = this._itemStorage.items.find(v => v.index == index);
356
- const selected = item.selected ?? false;
357
- const disabled = item.disabled ?? false;
326
+ const item = this._itemStorage.items().find(v => v.index() === index);
327
+ const selected = item.selected();
358
328
  return {
359
329
  $implicit: selected,
360
- selected,
361
- disabled,
330
+ selected: selected,
331
+ disabled: item.disabled(),
362
332
  onChange: () => {
363
333
  this.onCheckboxClick(index);
364
334
  },
365
335
  };
366
336
  }
367
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
368
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumTableComponent, selector: "ard-table", inputs: { rowDisabledFrom: "rowDisabledFrom", rowBoldFrom: "rowBoldFrom", invertRowDisabled: "invertRowDisabled", invertRowBold: "invertRowBold", selectableRows: "selectableRows", caption: "caption", isLoading: "isLoading", loadingProgress: "loadingProgress", appearance: "appearance", variant: "variant", color: "color", align: "align", headerAlign: "headerAlign", compact: "compact", zebra: "zebra", stickyHeader: "stickyHeader", paginated: "paginated", paginationStrategy: "paginationStrategy", paginationOptions: "paginationOptions", totalItems: "totalItems", paginationColor: "paginationColor", paginationAlign: "paginationAlign", itemsPerPageText: "itemsPerPageText", currentItemsFormatFn: "currentItemsFormatFn", pageFillRemaining: "pageFillRemaining", paginationDisabled: "paginationDisabled", useFirstLastButtons: "useFirstLastButtons", itemsPerPage: "itemsPerPage", page: "page", columns: "columns", data: "data", treatDataSourceAsString: "treatDataSourceAsString" }, outputs: { itemsPerPageChange: "itemsPerPageChange", pageChange: "pageChange", selectedRowsChangeEvent: "selectedRowsChange", failedSelectRowEvent: "failedSelectRow", selectRowEvent: "selectRow", unselectRowEvent: "unselectRow" }, queries: [{ propertyName: "checkboxTemplate", first: true, predicate: ArdiumTableCheckboxTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "headerCheckboxTemplate", first: true, predicate: ArdiumTableHeaderCheckboxTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "captionTemplate", first: true, predicate: ArdiumTableCaptionTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "templateChildren", predicate: ArdiumTableTemplateDirective }], usesInheritance: true, ngImport: i0, template: "<table class=\"ard-table\" [ngClass]=\"ngClasses\">\r\n <caption\r\n *ngIf=\"caption\"\r\n class=\"ard-table__caption\"\r\n >\r\n <div class=\"ard-table__caption-container\">\r\n <ng-template #defaultCaptionTemplate let-captionText>\r\n {{ captionText }}\r\n </ng-template>\r\n \r\n <ng-template\r\n [ngTemplateOutlet]=\"captionTemplate ?? defaultCaptionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: caption }\"\r\n />\r\n </div>\r\n </caption>\r\n <thead class=\"ard-table__header\">\r\n <tr class=\"ard-table__header-row\" *ngFor=\"let row of headerCells\">\r\n <th\r\n *ngFor=\"let cell of row; let index = index\"\r\n class=\"ard-table__header-cell\"\r\n [ngClass]=\"cell.cell.cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isHeaderCellCheckbox(cell)\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan\"\r\n [scope]=\"cell.colspan > 1 ? 'colgroup' : 'col'\"\r\n >\r\n <div\r\n class=\"ard-table__cell-container\"\r\n [class.ard-table__sortable]=\"isHeaderCellSortable(cell)\"\r\n [style.width]=\"cell.width\"\r\n [style.minWidth]=\"cell.minWidth\"\r\n >\r\n <ng-container *ngIf=\"isHeaderCellCheckbox(cell)\">\r\n <ng-template #defaultHeaderCheckboxTemplate let-state let-onChange=\"onChange\">\r\n <ard-checkbox [tabIndex]=\"isLoading ? -1 : tabIndex\" [state]=\"state\" [color]=\"getHeaderCheckboxColor()\" unselectedColor=\"currentColor\" (change)=\"onChange()\" />\r\n </ng-template>\r\n \r\n <ng-template\r\n [ngTemplateOutlet]=\"headerCheckboxTemplate ?? defaultHeaderCheckboxTemplate\"\r\n [ngTemplateOutletContext]=\"getHeaderCheckboxContext()\"\r\n />\r\n </ng-container>\r\n <ng-container *ngIf=\"!isHeaderCellCheckbox(cell)\">\r\n <ng-template\r\n #defaultHeaderCellTemplate\r\n let-content\r\n let-sortable=\"sortable\"\r\n let-sortType=\"sortType\"\r\n let-onTriggerSort=\"onTriggerSort\"\r\n let-onTriggerResetSort=\"onTriggerResetSort\"\r\n >\r\n <div\r\n class=\"ard-table__header-template-container\"\r\n [class.ard-sortable]=\"sortable\"\r\n [class.ard-nonsortable]=\"!sortable\"\r\n >\r\n <button\r\n class=\"ard-table__header-content-container\"\r\n *ngIf=\"sortable\"\r\n (click)=\"onTriggerSort($event)\"\r\n [tabindex]=\"tabIndex\"\r\n (keydown.Esc)=\"onTriggerResetSort($event)\"\r\n >\r\n <div class=\"ard-table__header-content\">{{ content }}</div>\r\n <div class=\"ard-table__header-sort-icon\" *ngIf=\"sortType != null\">\r\n <ard-icon *ngIf=\"sortType == 'ascending'\">south</ard-icon>\r\n <ard-icon *ngIf=\"sortType == 'descending'\">north</ard-icon>\r\n </div>\r\n </button>\r\n <div\r\n class=\"ard-table__header-content-container\"\r\n *ngIf=\"!sortable\"\r\n >\r\n <div class=\"ard-table__header-content\">{{ content }}</div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template \r\n [ngTemplateOutlet]=\"getHeaderTemplate(cell.cell.header) ?? defaultHeaderCellTemplate\"\r\n [ngTemplateOutletContext]=\"getHeaderContext(cell.cell, index)\"\r\n />\r\n </ng-container>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"ard-table__body\">\r\n <ng-container *ngFor=\"let row of dataRows; let rowIndex = index;\">\r\n <tr *ngIf=\"row.isEmpty\" class=\"ard-table__empty-row\">\r\n <td class=\"ard-table__empty-cell\" colspan=\"9999\"></td>\r\n </tr>\r\n <tr\r\n *ngIf=\"!row.isEmpty\"\r\n class=\"ard-table__body-row\"\r\n [class.ard-table__selected-row]=\"row.selected\"\r\n [class.ard-table__highlighted-row]=\"row.highlighted\"\r\n [class.ard-table__disabled-row]=\"row.disabled\"\r\n [class.ard-table__bold-row]=\"row.bold\"\r\n (click)=\"onRowClick(rowIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver($event)\"\r\n (mouseenter)=\"onRowMouseEnter(rowIndex, $event)\"\r\n (mouseleave)=\"onRowMouseLeave(rowIndex, $event)\"\r\n >\r\n <ng-container *ngFor=\"let cell of row.data; let cellIndex = index\">\r\n <ng-template #cellTmp>\r\n <div\r\n class=\"ard-table__cell-container\"\r\n [style]=\"getCellStyle(row.dataColumns[cellIndex])\"\r\n >\r\n <ng-container *ngIf=\"isCellCheckbox(cell)\">\r\n <ng-template #defaultCheckboxTemplate let-isChecked let-onChange=\"onChange\" let-disabled=\"disabled\">\r\n <ard-checkbox [tabIndex]=\"isLoading ? -1 : tabIndex\" [selected]=\"isChecked\" [color]=\"color\" [disabled]=\"disabled\" (change)=\"onChange()\" (click)=\"$event.stopPropagation()\" />\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"checkboxTemplate ?? defaultCheckboxTemplate\"\r\n [ngTemplateOutletContext]=\"getCheckboxContext(rowIndex)\"\r\n />\r\n </ng-container>\r\n <ng-container *ngIf=\"!isCellCheckbox(cell)\">\r\n <ng-template #defaultCellTemplate let-content>\r\n {{ content }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"getCellTemplate(row.dataColumns[cellIndex].template) ?? defaultCellTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell }\"\r\n />\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n <td\r\n *ngIf=\"!row.dataColumns[cellIndex].isRowHeader\"\r\n class=\"ard-table__body-cell\"\r\n [ngClass]=\"row.dataColumns[cellIndex].cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\r\n >\r\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\r\n </td>\r\n <th\r\n *ngIf=\"row.dataColumns[cellIndex].isRowHeader\"\r\n class=\"ard-table__body-cell ard-table__row-header\"\r\n scope=\"row\"\r\n [ngClass]=\"row.dataColumns[cellIndex].cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\r\n >\r\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n <tfoot class=\"ard-table__foot\" *ngIf=\"canDisplayPagination\">\r\n <tr class=\"ard-table__foot-row\">\r\n <td class=\"ard-table__pagination-cell\" colspan=\"9999\">\r\n <ard-table-pagination\r\n [options]=\"paginationOptions\"\r\n [(page)]=\"page\"\r\n [totalItems]=\"totalItems\"\r\n [disabled]=\"paginationDisabled\"\r\n [(itemsPerPage)]=\"itemsPerPage\"\r\n [align]=\"paginationAlign\"\r\n [isLoading]=\"isLoading\"\r\n [itemsPerPageText]=\"itemsPerPageText\"\r\n [currentItemsFormatFn]=\"currentItemsFormatFn\"\r\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n ></ard-table-pagination>\r\n </td>\r\n </tr>\r\n </tfoot>\r\n</table>", styles: [".ard-table__cell-container,.ard-table__header-template-container{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumCheckboxComponent, selector: "ard-checkbox", inputs: ["wrapperClasses", "htmlId", "color", "unselectedColor", "state"], outputs: ["stateChange"] }, { kind: "component", type: i3.ArdiumTablePaginationComponent, selector: "ard-table-pagination", inputs: ["options", "itemsPerPage", "page", "totalItems", "color", "align", "compact", "useFirstLastButtons", "isLoading", "itemsPerPageText", "currentItemsFormatFn"], outputs: ["itemsPerPageChange", "pageChange"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
338
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: ArdiumTableComponent, selector: "ard-table", inputs: { rowDisabledFrom: { classPropertyName: "rowDisabledFrom", publicName: "rowDisabledFrom", isSignal: true, isRequired: false, transformFunction: null }, rowBoldFrom: { classPropertyName: "rowBoldFrom", publicName: "rowBoldFrom", isSignal: true, isRequired: false, transformFunction: null }, invertRowDisabled: { classPropertyName: "invertRowDisabled", publicName: "invertRowDisabled", isSignal: true, isRequired: false, transformFunction: null }, invertRowBold: { classPropertyName: "invertRowBold", publicName: "invertRowBold", isSignal: true, isRequired: false, transformFunction: null }, selectableRows: { classPropertyName: "selectableRows", publicName: "selectableRows", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedItems: { classPropertyName: "maxSelectedItems", publicName: "maxSelectedItems", isSignal: true, isRequired: false, transformFunction: null }, clickableRows: { classPropertyName: "clickableRows", publicName: "clickableRows", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, loadingProgress: { classPropertyName: "loadingProgress", publicName: "loadingProgress", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, headerAlign: { classPropertyName: "headerAlign", publicName: "headerAlign", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, zebra: { classPropertyName: "zebra", publicName: "zebra", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, paginated: { classPropertyName: "paginated", publicName: "paginated", isSignal: true, isRequired: false, transformFunction: null }, paginationStrategy: { classPropertyName: "paginationStrategy", publicName: "paginationStrategy", isSignal: true, isRequired: false, transformFunction: null }, paginationOptions: { classPropertyName: "paginationOptions", publicName: "paginationOptions", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: false, transformFunction: null }, paginationColor: { classPropertyName: "paginationColor", publicName: "paginationColor", isSignal: true, isRequired: false, transformFunction: null }, paginationAlign: { classPropertyName: "paginationAlign", publicName: "paginationAlign", isSignal: true, isRequired: false, transformFunction: null }, itemsPerPageText: { classPropertyName: "itemsPerPageText", publicName: "itemsPerPageText", isSignal: true, isRequired: false, transformFunction: null }, currentItemsFormatFn: { classPropertyName: "currentItemsFormatFn", publicName: "currentItemsFormatFn", isSignal: true, isRequired: false, transformFunction: null }, pageFillRemaining: { classPropertyName: "pageFillRemaining", publicName: "pageFillRemaining", isSignal: true, isRequired: false, transformFunction: null }, paginationDisabled: { classPropertyName: "paginationDisabled", publicName: "paginationDisabled", isSignal: true, isRequired: false, transformFunction: null }, useFirstLastButtons: { classPropertyName: "useFirstLastButtons", publicName: "useFirstLastButtons", isSignal: true, isRequired: false, transformFunction: null }, itemsPerPage: { classPropertyName: "itemsPerPage", publicName: "itemsPerPage", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, treatDataSourceAsString: { classPropertyName: "treatDataSourceAsString", publicName: "treatDataSourceAsString", isSignal: true, isRequired: false, transformFunction: null }, _suppressErrors: { classPropertyName: "_suppressErrors", publicName: "_suppressErrors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemsPerPage: "itemsPerPageChange", page: "pageChange", selectedRowsChangeEvent: "selectedRowsChange", failedSelectRowEvent: "failedSelectRow", selectRowEvent: "selectRow", unselectRowEvent: "unselectRow", clickRowEvent: "clickRow" }, queries: [{ propertyName: "checkboxTemplate", first: true, predicate: ArdiumTableCheckboxTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "headerCheckboxTemplate", first: true, predicate: ArdiumTableHeaderCheckboxTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "captionTemplate", first: true, predicate: ArdiumTableCaptionTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "templateChildren", predicate: ArdiumTableTemplateDirective, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<table\n class=\"ard-table\"\n [ngClass]=\"ngClasses()\"\n>\n @if (caption()) {\n <caption class=\"ard-table__caption\">\n <div class=\"ard-table__caption-container\">\n <ng-template\n #defaultCaptionTemplate\n let-captionText\n >\n {{ captionText }}\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"captionTemplate() ?? defaultCaptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: caption() }\"\n />\n </div>\n </caption>\n }\n <thead class=\"ard-table__header\">\n @for (row of headerCells(); track $index) {\n <tr class=\"ard-table__header-row\">\n @for (cell of row; track $index) {\n <th\n class=\"ard-table__header-cell\"\n [ngClass]=\"cell.cell().cellClass\"\n [class.ard-table__checkbox-cell]=\"isHeaderCellCheckbox(cell)\"\n [attr.colspan]=\"cell.colspan()\"\n [attr.rowspan]=\"cell.rowspan()\"\n [scope]=\"cell.colspan() > 1 ? 'colgroup' : 'col'\"\n >\n <div\n class=\"ard-table__cell-container\"\n [class.ard-table__sortable]=\"isHeaderCellSortable(cell)\"\n [style.width]=\"cell.width\"\n [style.minWidth]=\"cell.minWidth\"\n >\n @if (isHeaderCellCheckbox(cell)) {\n <ng-template\n #defaultHeaderCheckboxTemplate\n let-state\n let-onChange=\"onChange\"\n >\n <ard-checkbox\n [tabIndex]=\"isLoading() ? -1 : tabIndex()\"\n [state]=\"state\"\n [color]=\"getHeaderCheckboxColor()\"\n unselectedColor=\"currentColor\"\n (change)=\"onChange()\"\n />\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"headerCheckboxTemplate() ?? defaultHeaderCheckboxTemplate\"\n [ngTemplateOutletContext]=\"getHeaderCheckboxContext()\"\n />\n } @else {\n <ng-template\n #defaultHeaderCellTemplate\n let-content\n let-sortable=\"sortable\"\n let-sortType=\"sortType\"\n let-onTriggerSort=\"onTriggerSort\"\n let-onTriggerResetSort=\"onTriggerResetSort\"\n >\n <div\n class=\"ard-table__header-template-container\"\n [class.ard-sortable]=\"sortable\"\n [class.ard-nonsortable]=\"!sortable\"\n >\n @if (sortable) {\n <button\n class=\"ard-table__header-content-container\"\n (click)=\"onTriggerSort($event)\"\n [tabindex]=\"tabIndex()\"\n (keydown.Esc)=\"onTriggerResetSort($event)\"\n >\n <div class=\"ard-table__header-content\">{{ content }}</div>\n @if (sortType !== null) {\n <div class=\"ard-table__header-sort-icon\">\n @if (sortType === 'ascending') {\n <ard-icon>south</ard-icon>\n } @else if (sortType === 'descending') {\n <ard-icon>north</ard-icon>\n }\n </div>\n }\n </button>\n } @else {\n <div class=\"ard-table__header-content-container\">\n <div class=\"ard-table__header-content\">{{ content }}</div>\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"getHeaderTemplate(cell.cell().header) ?? defaultHeaderCellTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(cell.cell(), $index)\"\n />\n }\n </div>\n </th>\n }\n </tr>\n }\n </thead>\n <tbody class=\"ard-table__body\">\n @for (row of dataRows(); track $index) {\n @if (row.isEmpty()) {\n <tr class=\"ard-table__empty-row\">\n <td\n class=\"ard-table__empty-cell\"\n colspan=\"9999\"\n ></td>\n </tr>\n } @else {\n <tr\n class=\"ard-table__body-row\"\n [class.ard-table__selected-row]=\"row.selected()\"\n [class.ard-table__highlighted-row]=\"row.highlighted()\"\n [class.ard-table__disabled-row]=\"row.disabled()\"\n [class.ard-table__bold-row]=\"row.bold()\"\n (click)=\"onRowClick(row, $event)\"\n (mouseover)=\"onRowMouseOver($event)\"\n (mouseenter)=\"onRowMouseEnter(row.index(), $event)\"\n (mouseleave)=\"onRowMouseLeave(row.index(), $event)\"\n >\n @for (cell of row.data(); track $index) {\n <ng-template #cellTmp>\n <div\n class=\"ard-table__cell-container\"\n [style]=\"getCellStyle(row.dataColumns()[$index])\"\n >\n @if (isCellCheckbox(cell)) {\n <ng-template\n #defaultCheckboxTemplate\n let-isChecked\n let-onChange=\"onChange\"\n let-disabled=\"disabled\"\n >\n <ard-checkbox\n [tabIndex]=\"isLoading() ? -1 : tabIndex()\"\n [selected]=\"isChecked\"\n [color]=\"color()\"\n [disabled]=\"disabled\"\n (change)=\"onChange()\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"checkboxTemplate() ?? defaultCheckboxTemplate\"\n [ngTemplateOutletContext]=\"getCheckboxContext(row.index())\"\n />\n } @else {\n <ng-template\n #defaultCellTemplate\n let-content\n >\n {{ content }}\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"getCellTemplate(row.dataColumns()[$index].template) ?? defaultCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: cell }\"\n />\n }\n </div>\n </ng-template>\n @if (!row.dataColumns()[$index].isRowHeader) {\n <td\n class=\"ard-table__body-cell\"\n [ngClass]=\"row.dataColumns()[$index].cellClass\"\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\n >\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\n </td>\n } @else {\n <th\n class=\"ard-table__body-cell ard-table__row-header\"\n scope=\"row\"\n [ngClass]=\"row.dataColumns()[$index].cellClass\"\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\n >\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\n </th>\n }\n }\n </tr>\n }\n }\n </tbody>\n @if (canDisplayPagination()) {\n <tfoot class=\"ard-table__foot\">\n <tr class=\"ard-table__foot-row\">\n <td\n class=\"ard-table__pagination-cell\"\n colspan=\"9999\"\n >\n <ard-table-pagination\n [options]=\"paginationOptions()\"\n [totalItems]=\"totalItems()!\"\n [disabled]=\"paginationDisabled()\"\n [(itemsPerPage)]=\"itemsPerPage\"\n [(page)]=\"page\"\n [align]=\"paginationAlign()\"\n [isLoading]=\"isLoading()\"\n [itemsPerPageText]=\"itemsPerPageText()\"\n [currentItemsFormatFn]=\"currentItemsFormatFn()\"\n />\n </td>\n </tr>\n </tfoot>\n }\n</table>\n", styles: [".ard-table__cell-container,.ard-table__header-template-container{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumCheckboxComponent, selector: "ard-checkbox", inputs: ["wrapperClasses", "htmlId", "color", "unselectedColor", "state"], outputs: ["stateChange"] }, { kind: "component", type: i3.ArdiumTablePaginationComponent, selector: "ard-table-pagination", inputs: ["totalItems", "options", "itemsPerPage", "page", "color", "align", "compact", "useFirstLastButtons", "isLoading", "itemsPerPageText", "currentItemsFormatFn"], outputs: ["itemsPerPageChange", "pageChange"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
369
339
  }
370
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumTableComponent, decorators: [{
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumTableComponent, decorators: [{
371
341
  type: Component,
372
- args: [{ selector: 'ard-table', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"ard-table\" [ngClass]=\"ngClasses\">\r\n <caption\r\n *ngIf=\"caption\"\r\n class=\"ard-table__caption\"\r\n >\r\n <div class=\"ard-table__caption-container\">\r\n <ng-template #defaultCaptionTemplate let-captionText>\r\n {{ captionText }}\r\n </ng-template>\r\n \r\n <ng-template\r\n [ngTemplateOutlet]=\"captionTemplate ?? defaultCaptionTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: caption }\"\r\n />\r\n </div>\r\n </caption>\r\n <thead class=\"ard-table__header\">\r\n <tr class=\"ard-table__header-row\" *ngFor=\"let row of headerCells\">\r\n <th\r\n *ngFor=\"let cell of row; let index = index\"\r\n class=\"ard-table__header-cell\"\r\n [ngClass]=\"cell.cell.cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isHeaderCellCheckbox(cell)\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan\"\r\n [scope]=\"cell.colspan > 1 ? 'colgroup' : 'col'\"\r\n >\r\n <div\r\n class=\"ard-table__cell-container\"\r\n [class.ard-table__sortable]=\"isHeaderCellSortable(cell)\"\r\n [style.width]=\"cell.width\"\r\n [style.minWidth]=\"cell.minWidth\"\r\n >\r\n <ng-container *ngIf=\"isHeaderCellCheckbox(cell)\">\r\n <ng-template #defaultHeaderCheckboxTemplate let-state let-onChange=\"onChange\">\r\n <ard-checkbox [tabIndex]=\"isLoading ? -1 : tabIndex\" [state]=\"state\" [color]=\"getHeaderCheckboxColor()\" unselectedColor=\"currentColor\" (change)=\"onChange()\" />\r\n </ng-template>\r\n \r\n <ng-template\r\n [ngTemplateOutlet]=\"headerCheckboxTemplate ?? defaultHeaderCheckboxTemplate\"\r\n [ngTemplateOutletContext]=\"getHeaderCheckboxContext()\"\r\n />\r\n </ng-container>\r\n <ng-container *ngIf=\"!isHeaderCellCheckbox(cell)\">\r\n <ng-template\r\n #defaultHeaderCellTemplate\r\n let-content\r\n let-sortable=\"sortable\"\r\n let-sortType=\"sortType\"\r\n let-onTriggerSort=\"onTriggerSort\"\r\n let-onTriggerResetSort=\"onTriggerResetSort\"\r\n >\r\n <div\r\n class=\"ard-table__header-template-container\"\r\n [class.ard-sortable]=\"sortable\"\r\n [class.ard-nonsortable]=\"!sortable\"\r\n >\r\n <button\r\n class=\"ard-table__header-content-container\"\r\n *ngIf=\"sortable\"\r\n (click)=\"onTriggerSort($event)\"\r\n [tabindex]=\"tabIndex\"\r\n (keydown.Esc)=\"onTriggerResetSort($event)\"\r\n >\r\n <div class=\"ard-table__header-content\">{{ content }}</div>\r\n <div class=\"ard-table__header-sort-icon\" *ngIf=\"sortType != null\">\r\n <ard-icon *ngIf=\"sortType == 'ascending'\">south</ard-icon>\r\n <ard-icon *ngIf=\"sortType == 'descending'\">north</ard-icon>\r\n </div>\r\n </button>\r\n <div\r\n class=\"ard-table__header-content-container\"\r\n *ngIf=\"!sortable\"\r\n >\r\n <div class=\"ard-table__header-content\">{{ content }}</div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template \r\n [ngTemplateOutlet]=\"getHeaderTemplate(cell.cell.header) ?? defaultHeaderCellTemplate\"\r\n [ngTemplateOutletContext]=\"getHeaderContext(cell.cell, index)\"\r\n />\r\n </ng-container>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"ard-table__body\">\r\n <ng-container *ngFor=\"let row of dataRows; let rowIndex = index;\">\r\n <tr *ngIf=\"row.isEmpty\" class=\"ard-table__empty-row\">\r\n <td class=\"ard-table__empty-cell\" colspan=\"9999\"></td>\r\n </tr>\r\n <tr\r\n *ngIf=\"!row.isEmpty\"\r\n class=\"ard-table__body-row\"\r\n [class.ard-table__selected-row]=\"row.selected\"\r\n [class.ard-table__highlighted-row]=\"row.highlighted\"\r\n [class.ard-table__disabled-row]=\"row.disabled\"\r\n [class.ard-table__bold-row]=\"row.bold\"\r\n (click)=\"onRowClick(rowIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver($event)\"\r\n (mouseenter)=\"onRowMouseEnter(rowIndex, $event)\"\r\n (mouseleave)=\"onRowMouseLeave(rowIndex, $event)\"\r\n >\r\n <ng-container *ngFor=\"let cell of row.data; let cellIndex = index\">\r\n <ng-template #cellTmp>\r\n <div\r\n class=\"ard-table__cell-container\"\r\n [style]=\"getCellStyle(row.dataColumns[cellIndex])\"\r\n >\r\n <ng-container *ngIf=\"isCellCheckbox(cell)\">\r\n <ng-template #defaultCheckboxTemplate let-isChecked let-onChange=\"onChange\" let-disabled=\"disabled\">\r\n <ard-checkbox [tabIndex]=\"isLoading ? -1 : tabIndex\" [selected]=\"isChecked\" [color]=\"color\" [disabled]=\"disabled\" (change)=\"onChange()\" (click)=\"$event.stopPropagation()\" />\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"checkboxTemplate ?? defaultCheckboxTemplate\"\r\n [ngTemplateOutletContext]=\"getCheckboxContext(rowIndex)\"\r\n />\r\n </ng-container>\r\n <ng-container *ngIf=\"!isCellCheckbox(cell)\">\r\n <ng-template #defaultCellTemplate let-content>\r\n {{ content }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"getCellTemplate(row.dataColumns[cellIndex].template) ?? defaultCellTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell }\"\r\n />\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n <td\r\n *ngIf=\"!row.dataColumns[cellIndex].isRowHeader\"\r\n class=\"ard-table__body-cell\"\r\n [ngClass]=\"row.dataColumns[cellIndex].cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\r\n >\r\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\r\n </td>\r\n <th\r\n *ngIf=\"row.dataColumns[cellIndex].isRowHeader\"\r\n class=\"ard-table__body-cell ard-table__row-header\"\r\n scope=\"row\"\r\n [ngClass]=\"row.dataColumns[cellIndex].cellClass\"\r\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\r\n >\r\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n <tfoot class=\"ard-table__foot\" *ngIf=\"canDisplayPagination\">\r\n <tr class=\"ard-table__foot-row\">\r\n <td class=\"ard-table__pagination-cell\" colspan=\"9999\">\r\n <ard-table-pagination\r\n [options]=\"paginationOptions\"\r\n [(page)]=\"page\"\r\n [totalItems]=\"totalItems\"\r\n [disabled]=\"paginationDisabled\"\r\n [(itemsPerPage)]=\"itemsPerPage\"\r\n [align]=\"paginationAlign\"\r\n [isLoading]=\"isLoading\"\r\n [itemsPerPageText]=\"itemsPerPageText\"\r\n [currentItemsFormatFn]=\"currentItemsFormatFn\"\r\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n ></ard-table-pagination>\r\n </td>\r\n </tr>\r\n </tfoot>\r\n</table>", styles: [".ard-table__cell-container,.ard-table__header-template-container{width:100%;height:100%}\n"] }]
373
- }], propDecorators: { rowDisabledFrom: [{
374
- type: Input
375
- }], rowBoldFrom: [{
376
- type: Input
377
- }], invertRowDisabled: [{
378
- type: Input
379
- }], invertRowBold: [{
380
- type: Input
381
- }], selectableRows: [{
382
- type: Input
383
- }], caption: [{
384
- type: Input
385
- }], isLoading: [{
386
- type: Input
387
- }], loadingProgress: [{
388
- type: Input
389
- }], appearance: [{
390
- type: Input
391
- }], variant: [{
392
- type: Input
393
- }], color: [{
394
- type: Input
395
- }], align: [{
396
- type: Input
397
- }], headerAlign: [{
398
- type: Input
399
- }], compact: [{
400
- type: Input
401
- }], zebra: [{
402
- type: Input
403
- }], stickyHeader: [{
404
- type: Input
405
- }], paginated: [{
406
- type: Input
407
- }], paginationStrategy: [{
408
- type: Input
409
- }], paginationOptions: [{
410
- type: Input
411
- }], totalItems: [{
412
- type: Input
413
- }], paginationColor: [{
414
- type: Input
415
- }], paginationAlign: [{
416
- type: Input
417
- }], itemsPerPageText: [{
418
- type: Input
419
- }], currentItemsFormatFn: [{
420
- type: Input
421
- }], pageFillRemaining: [{
422
- type: Input
423
- }], paginationDisabled: [{
424
- type: Input
425
- }], useFirstLastButtons: [{
426
- type: Input
427
- }], itemsPerPage: [{
428
- type: Input
429
- }], itemsPerPageChange: [{
430
- type: Output
431
- }], page: [{
432
- type: Input
433
- }], pageChange: [{
434
- type: Output
435
- }], columns: [{
342
+ args: [{ selector: 'ard-table', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table\n class=\"ard-table\"\n [ngClass]=\"ngClasses()\"\n>\n @if (caption()) {\n <caption class=\"ard-table__caption\">\n <div class=\"ard-table__caption-container\">\n <ng-template\n #defaultCaptionTemplate\n let-captionText\n >\n {{ captionText }}\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"captionTemplate() ?? defaultCaptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: caption() }\"\n />\n </div>\n </caption>\n }\n <thead class=\"ard-table__header\">\n @for (row of headerCells(); track $index) {\n <tr class=\"ard-table__header-row\">\n @for (cell of row; track $index) {\n <th\n class=\"ard-table__header-cell\"\n [ngClass]=\"cell.cell().cellClass\"\n [class.ard-table__checkbox-cell]=\"isHeaderCellCheckbox(cell)\"\n [attr.colspan]=\"cell.colspan()\"\n [attr.rowspan]=\"cell.rowspan()\"\n [scope]=\"cell.colspan() > 1 ? 'colgroup' : 'col'\"\n >\n <div\n class=\"ard-table__cell-container\"\n [class.ard-table__sortable]=\"isHeaderCellSortable(cell)\"\n [style.width]=\"cell.width\"\n [style.minWidth]=\"cell.minWidth\"\n >\n @if (isHeaderCellCheckbox(cell)) {\n <ng-template\n #defaultHeaderCheckboxTemplate\n let-state\n let-onChange=\"onChange\"\n >\n <ard-checkbox\n [tabIndex]=\"isLoading() ? -1 : tabIndex()\"\n [state]=\"state\"\n [color]=\"getHeaderCheckboxColor()\"\n unselectedColor=\"currentColor\"\n (change)=\"onChange()\"\n />\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"headerCheckboxTemplate() ?? defaultHeaderCheckboxTemplate\"\n [ngTemplateOutletContext]=\"getHeaderCheckboxContext()\"\n />\n } @else {\n <ng-template\n #defaultHeaderCellTemplate\n let-content\n let-sortable=\"sortable\"\n let-sortType=\"sortType\"\n let-onTriggerSort=\"onTriggerSort\"\n let-onTriggerResetSort=\"onTriggerResetSort\"\n >\n <div\n class=\"ard-table__header-template-container\"\n [class.ard-sortable]=\"sortable\"\n [class.ard-nonsortable]=\"!sortable\"\n >\n @if (sortable) {\n <button\n class=\"ard-table__header-content-container\"\n (click)=\"onTriggerSort($event)\"\n [tabindex]=\"tabIndex()\"\n (keydown.Esc)=\"onTriggerResetSort($event)\"\n >\n <div class=\"ard-table__header-content\">{{ content }}</div>\n @if (sortType !== null) {\n <div class=\"ard-table__header-sort-icon\">\n @if (sortType === 'ascending') {\n <ard-icon>south</ard-icon>\n } @else if (sortType === 'descending') {\n <ard-icon>north</ard-icon>\n }\n </div>\n }\n </button>\n } @else {\n <div class=\"ard-table__header-content-container\">\n <div class=\"ard-table__header-content\">{{ content }}</div>\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"getHeaderTemplate(cell.cell().header) ?? defaultHeaderCellTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(cell.cell(), $index)\"\n />\n }\n </div>\n </th>\n }\n </tr>\n }\n </thead>\n <tbody class=\"ard-table__body\">\n @for (row of dataRows(); track $index) {\n @if (row.isEmpty()) {\n <tr class=\"ard-table__empty-row\">\n <td\n class=\"ard-table__empty-cell\"\n colspan=\"9999\"\n ></td>\n </tr>\n } @else {\n <tr\n class=\"ard-table__body-row\"\n [class.ard-table__selected-row]=\"row.selected()\"\n [class.ard-table__highlighted-row]=\"row.highlighted()\"\n [class.ard-table__disabled-row]=\"row.disabled()\"\n [class.ard-table__bold-row]=\"row.bold()\"\n (click)=\"onRowClick(row, $event)\"\n (mouseover)=\"onRowMouseOver($event)\"\n (mouseenter)=\"onRowMouseEnter(row.index(), $event)\"\n (mouseleave)=\"onRowMouseLeave(row.index(), $event)\"\n >\n @for (cell of row.data(); track $index) {\n <ng-template #cellTmp>\n <div\n class=\"ard-table__cell-container\"\n [style]=\"getCellStyle(row.dataColumns()[$index])\"\n >\n @if (isCellCheckbox(cell)) {\n <ng-template\n #defaultCheckboxTemplate\n let-isChecked\n let-onChange=\"onChange\"\n let-disabled=\"disabled\"\n >\n <ard-checkbox\n [tabIndex]=\"isLoading() ? -1 : tabIndex()\"\n [selected]=\"isChecked\"\n [color]=\"color()\"\n [disabled]=\"disabled\"\n (change)=\"onChange()\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"checkboxTemplate() ?? defaultCheckboxTemplate\"\n [ngTemplateOutletContext]=\"getCheckboxContext(row.index())\"\n />\n } @else {\n <ng-template\n #defaultCellTemplate\n let-content\n >\n {{ content }}\n </ng-template>\n\n <ng-template\n [ngTemplateOutlet]=\"getCellTemplate(row.dataColumns()[$index].template) ?? defaultCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: cell }\"\n />\n }\n </div>\n </ng-template>\n @if (!row.dataColumns()[$index].isRowHeader) {\n <td\n class=\"ard-table__body-cell\"\n [ngClass]=\"row.dataColumns()[$index].cellClass\"\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\n >\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\n </td>\n } @else {\n <th\n class=\"ard-table__body-cell ard-table__row-header\"\n scope=\"row\"\n [ngClass]=\"row.dataColumns()[$index].cellClass\"\n [class.ard-table__checkbox-cell]=\"isCellCheckbox(cell)\"\n >\n <ng-template [ngTemplateOutlet]=\"cellTmp\"></ng-template>\n </th>\n }\n }\n </tr>\n }\n }\n </tbody>\n @if (canDisplayPagination()) {\n <tfoot class=\"ard-table__foot\">\n <tr class=\"ard-table__foot-row\">\n <td\n class=\"ard-table__pagination-cell\"\n colspan=\"9999\"\n >\n <ard-table-pagination\n [options]=\"paginationOptions()\"\n [totalItems]=\"totalItems()!\"\n [disabled]=\"paginationDisabled()\"\n [(itemsPerPage)]=\"itemsPerPage\"\n [(page)]=\"page\"\n [align]=\"paginationAlign()\"\n [isLoading]=\"isLoading()\"\n [itemsPerPageText]=\"itemsPerPageText()\"\n [currentItemsFormatFn]=\"currentItemsFormatFn()\"\n />\n </td>\n </tr>\n </tfoot>\n }\n</table>\n", styles: [".ard-table__cell-container,.ard-table__header-template-container{width:100%;height:100%}\n"] }]
343
+ }], propDecorators: { columns: [{
436
344
  type: Input
437
345
  }], data: [{
438
346
  type: Input
439
- }], treatDataSourceAsString: [{
440
- type: Input
441
- }], checkboxTemplate: [{
442
- type: ContentChild,
443
- args: [ArdiumTableCheckboxTemplateDirective, { read: TemplateRef }]
444
- }], headerCheckboxTemplate: [{
445
- type: ContentChild,
446
- args: [ArdiumTableHeaderCheckboxTemplateDirective, {
447
- read: TemplateRef,
448
- }]
449
- }], captionTemplate: [{
450
- type: ContentChild,
451
- args: [ArdiumTableCaptionTemplateDirective, { read: TemplateRef }]
452
- }], templateChildren: [{
453
- type: ContentChildren,
454
- args: [ArdiumTableTemplateDirective]
455
- }], selectedRowsChangeEvent: [{
456
- type: Output,
457
- args: ['selectedRowsChange']
458
- }], failedSelectRowEvent: [{
459
- type: Output,
460
- args: ['failedSelectRow']
461
- }], selectRowEvent: [{
462
- type: Output,
463
- args: ['selectRow']
464
- }], unselectRowEvent: [{
465
- type: Output,
466
- args: ['unselectRow']
467
347
  }] } });
468
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQXdCLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RSxPQUFPLEVBQTJCLGdCQUFnQixFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBQ3ZHLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsb0NBQW9DLEVBQ3BDLDBDQUEwQyxFQUMxQyw0QkFBNEIsR0FDN0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBRUwsY0FBYyxFQUNkLGVBQWUsRUFNZix1QkFBdUIsRUFFdkIsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7O0FBUzNDLE1BQU0sT0FBTyxv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QWtCO3NCQUEzQixNQUFNO2dCQUlILElBQUk7c0JBRFAsS0FBSztnQkFPSSxVQUFVO3NCQUFuQixNQUFNO2dCQW9DSCxPQUFPO3NCQURWLEtBQUs7Z0JBTUYsSUFBSTtzQkFEUCxLQUFLO2dCQVdGLHVCQUF1QjtzQkFEMUIsS0FBSztnQkFVTixnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBS3pFLHNCQUFzQjtzQkFIckIsWUFBWTt1QkFBQywwQ0FBMEMsRUFBRTt3QkFDeEQsSUFBSSxFQUFFLFdBQVc7cUJBQ2xCO2dCQUdELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxtQ0FBbUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBS3hFLGdCQUFnQjtzQkFEZixlQUFlO3VCQUFDLDRCQUE0QjtnQkFtSGYsdUJBQXVCO3NCQUFwRCxNQUFNO3VCQUFDLG9CQUFvQjtnQkFDRCxvQkFBb0I7c0JBQTlDLE1BQU07dUJBQUMsaUJBQWlCO2dCQUNKLGNBQWM7c0JBQWxDLE1BQU07dUJBQUMsV0FBVztnQkFDSSxnQkFBZ0I7c0JBQXRDLE1BQU07dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICdzaW1wbGUtYm9vbCc7XG5pbXBvcnQgeyBfRm9jdXNhYmxlQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9mb2N1c2FibGUtY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94U3RhdGUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC50eXBlcyc7XG5pbXBvcnQgeyBDdXJyZW50SXRlbXNGb3JtYXRGbiwgUGFnaW5hdGlvbkFsaWduIH0gZnJvbSAnLi4vdGFibGUtcGFnaW5hdGlvbi90YWJsZS1wYWdpbmF0aW9uLnR5cGVzJztcbmltcG9ydCB7IENvbXBvbmVudENvbG9yLCBTaW1wbGVDb21wb25lbnRDb2xvciB9IGZyb20gJy4uL3R5cGVzL2NvbG9ycy50eXBlcyc7XG5pbXBvcnQgeyBBcmRUYWJsZVJvdywgSGVhZGVyQ2VsbCwgVGFibGVJdGVtU3RvcmFnZSwgVGFibGVJdGVtU3RvcmFnZUhvc3QgfSBmcm9tICcuL3RhYmxlLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQge1xuICBBcmRpdW1UYWJsZUNhcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkaXVtVGFibGVDaGVja2JveFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRpdW1UYWJsZUhlYWRlckNoZWNrYm94VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZGl1bVRhYmxlVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vdGFibGUuZGlyZWN0aXZlcyc7XG5pbXBvcnQge1xuICBTb3J0VHlwZSxcbiAgVGFibGVBbGlnblR5cGUsXG4gIFRhYmxlQXBwZWFyYW5jZSxcbiAgVGFibGVDYXB0aW9uQ29udGV4dCxcbiAgVGFibGVDaGVja2JveENvbnRleHQsXG4gIFRhYmxlRGF0YUNvbHVtbixcbiAgVGFibGVIZWFkZXJDaGVja2JveENvbnRleHQsXG4gIFRhYmxlSGVhZGVyQ29udGV4dCxcbiAgVGFibGVQYWdpbmF0aW9uU3RyYXRlZ3ksXG4gIFRhYmxlU3ViaGVhZGVyLFxuICBUYWJsZVZhcmlhbnQsXG4gIFRhYmxlU3ViaGVhZGVyQ29udGV4dCxcbn0gZnJvbSAnLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBpc1RhYmxlU3ViaGVhZGVyIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FyZC10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcmRpdW1UYWJsZUNvbXBvbmVudCBleHRlbmRzIF9Gb2N1c2FibGVDb21wb25lbnRCYXNlIGltcGxlbWVudHMgVGFibGVJdGVtU3RvcmFnZUhvc3QsIEFmdGVyQ29udGVudEluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IF9pdGVtU3RvcmFnZSA9IG5ldyBUYWJsZUl0ZW1TdG9yYWdlKHRoaXMpO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHJvd0Rpc2FibGVkRnJvbTogJ2Rpc2FibGVkJyxcbiAgICByb3dCb2xkRnJvbTogJ2JvbGQnLFxuICB9O1xuXG4gIEBJbnB1dCgpIHJvd0Rpc2FibGVkRnJvbT86IHN0cmluZztcbiAgQElucHV0KCkgcm93Qm9sZEZyb20/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfaW52ZXJ0Um93RGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGludmVydFJvd0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZlcnRSb3dEaXNhYmxlZDtcbiAgfVxuICBzZXQgaW52ZXJ0Um93RGlzYWJsZWQodjogYW55KSB7XG4gICAgdGhpcy5faW52ZXJ0Um93RGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9pbnZlcnRSb3dCb2xkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBpbnZlcnRSb3dCb2xkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZlcnRSb3dCb2xkO1xuICB9XG4gIHNldCBpbnZlcnRSb3dCb2xkKHY6IGFueSkge1xuICAgIHRoaXMuX2ludmVydFJvd0JvbGQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RhYmxlUm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0YWJsZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGVSb3dzO1xuICB9XG4gIHNldCBzZWxlY3RhYmxlUm93cyh2OiBhbnkpIHtcbiAgICB0aGlzLl9zZWxlY3RhYmxlUm93cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIEBJbnB1dCgpIGNhcHRpb24/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgbG9hZGluZ1Byb2dyZXNzPzogbnVtYmVyOyAvL1RPRE8gYWRkIHByb2dyZXNzIGJhclxuXG4gIC8vISBhcHBlYXJhbmNlXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IFRhYmxlQXBwZWFyYW5jZSA9IFRhYmxlQXBwZWFyYW5jZS5TdHJvbmc7XG4gIEBJbnB1dCgpIHZhcmlhbnQ6IFRhYmxlVmFyaWFudCA9IFRhYmxlVmFyaWFudC5Sb3VuZGVkO1xuICBASW5wdXQoKSBjb2xvcjogQ29tcG9uZW50Q29sb3IgPSBDb21wb25lbnRDb2xvci5QcmltYXJ5O1xuICBASW5wdXQoKSBhbGlnbjogVGFibGVBbGlnblR5cGUgPSBUYWJsZUFsaWduVHlwZS5DZW50ZXJMZWZ0O1xuICBASW5wdXQoKSBoZWFkZXJBbGlnbjogVGFibGVBbGlnblR5cGUgPSBUYWJsZUFsaWduVHlwZS5DZW50ZXJMZWZ0O1xuXG4gIHByaXZhdGUgX2NvbXBhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGNvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhY3Q7XG4gIH1cbiAgc2V0IGNvbXBhY3QodjogYW55KSB7XG4gICAgdGhpcy5fY29tcGFjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgX3plYnJhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCB6ZWJyYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5femVicmE7XG4gIH1cbiAgc2V0IHplYnJhKHY6IGFueSkge1xuICAgIHRoaXMuX3plYnJhID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RpY2t5SGVhZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBzdGlja3lIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0aWNreUhlYWRlcjtcbiAgfVxuICBzZXQgc3RpY2t5SGVhZGVyKHY6IGFueSkge1xuICAgIHRoaXMuX3N0aWNreUhlYWRlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIGdldCBuZ0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgYGFyZC1hcHBlYXJhbmNlLSR7dGhpcy5hcHBlYXJhbmNlfWAsXG4gICAgICBgYXJkLXZhcmlhbnQtJHt0aGlzLnZhcmlhbnR9YCxcbiAgICAgIGBhcmQtY29sb3ItJHt0aGlzLmNvbG9yfWAsXG4gICAgICBgYXJkLWFsaWduLSR7dGhpcy5hbGlnbn1gLFxuICAgICAgYGFyZC1oZWFkZXItYWxpZ24tJHt0aGlzLmhlYWRlckFsaWdufWAsXG4gICAgICB0aGlzLmNvbXBhY3QgPyAnYXJkLWNvbXBhY3QnIDogJycsXG4gICAgICB0aGlzLnplYnJhID8gJ2FyZC16ZWJyYS10YWJsZScgOiAnJyxcbiAgICAgIHRoaXMuc2VsZWN0YWJsZVJvd3MgPyAnYXJkLXNlbGVjdGFibGUtcm93cycgOiAnJyxcbiAgICAgIHRoaXMuc3RpY2t5SGVhZGVyID8gJ2FyZC1zdGlja3ktaGVhZGVyJyA6ICcnLFxuICAgICAgdGhpcy5pc0xvYWRpbmcgPyAnYXJkLXRhYmxlLWxvYWRpbmcnIDogJycsXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cblxuICAvLyEgcGFnaW5hdGlvblxuICBwcml2YXRlIF9wYWdpbmF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2luYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGVkO1xuICB9XG4gIHNldCBwYWdpbmF0ZWQodjogYW55KSB7XG4gICAgdGhpcy5fcGFnaW5hdGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgQElucHV0KCkgcGFnaW5hdGlvblN0cmF0ZWd5OiBUYWJsZVBhZ2luYXRpb25TdHJhdGVneSA9IFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5Lk5vb3A7XG5cbiAgQElucHV0KCkgcGFnaW5hdGlvbk9wdGlvbnM6IG51bWJlcltdIHwgeyB2YWx1ZTogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH1bXSA9IFsxMCwgMjUsIDUwXTtcbiAgQElucHV0KCkgdG90YWxJdGVtcz86IG51bWJlcjtcbiAgQElucHV0KCkgcGFnaW5hdGlvbkNvbG9yOiBDb21wb25lbnRDb2xvciA9IENvbXBvbmVudENvbG9yLk5vbmU7XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25BbGlnbjogUGFnaW5hdGlvbkFsaWduID0gUGFnaW5hdGlvbkFsaWduLlNwbGl0O1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VUZXh0OiBzdHJpbmcgPSAnSXRlbXMgcGVyIHBhZ2U6JztcbiAgQElucHV0KCkgY3VycmVudEl0ZW1zRm9ybWF0Rm46IEN1cnJlbnRJdGVtc0Zvcm1hdEZuID0gKHsgY3VycmVudEl0ZW1zRmlyc3QsIGN1cnJlbnRJdGVtc0xhc3QsIHRvdGFsSXRlbXMgfSkgPT4ge1xuICAgIHJldHVybiBgJHtjdXJyZW50SXRlbXNGaXJzdH0g4oCTICR7Y3VycmVudEl0ZW1zTGFzdH0gb2YgJHt0b3RhbEl0ZW1zfWA7XG4gIH07XG5cbiAgcHJpdmF0ZSBfcGFnZUZpbGxSZW1haW5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VGaWxsUmVtYWluaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlRmlsbFJlbWFpbmluZztcbiAgfVxuICBzZXQgcGFnZUZpbGxSZW1haW5pbmcodjogYW55KSB7XG4gICAgdGhpcy5fcGFnZUZpbGxSZW1haW5pbmcgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gIH1cblxuICBwcml2YXRlIF9wYWdpbmF0aW9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2luYXRpb25EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbkRpc2FibGVkO1xuICB9XG4gIHNldCBwYWdpbmF0aW9uRGlzYWJsZWQodjogYW55KSB7XG4gICAgdGhpcy5fcGFnaW5hdGlvbkRpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXNlRmlyc3RMYXN0QnV0dG9uczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgdXNlRmlyc3RMYXN0QnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlRmlyc3RMYXN0QnV0dG9ucztcbiAgfVxuICBzZXQgdXNlRmlyc3RMYXN0QnV0dG9ucyh2OiBhbnkpIHtcbiAgICB0aGlzLl91c2VGaXJzdExhc3RCdXR0b25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbXNQZXJQYWdlOiBudW1iZXIgPSA1MDtcbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zUGVyUGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc1BlclBhZ2U7XG4gIH1cbiAgc2V0IGl0ZW1zUGVyUGFnZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2KTtcbiAgfVxuICBAT3V0cHV0KCkgaXRlbXNQZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBfcGFnZTogbnVtYmVyID0gMTtcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuICBzZXQgcGFnZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9wYWdlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodik7XG4gIH1cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBnZXQgaXNEZWZpbmVkVG90YWxJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMucGFnaW5hdGlvblN0cmF0ZWd5ID09IFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5Lk5vb3AgJiYgaXNEZWZpbmVkKHRoaXMudG90YWxJdGVtcykpIHx8IHRoaXMucGFnaW5hdGlvblN0cmF0ZWd5ICE9IFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5Lk5vb3A7XG4gIH1cbiAgZ2V0IGNhbkRpc3BsYXlQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGVkICYmIHRoaXMuaXNEZWZpbmVkVG90YWxJdGVtcztcbiAgfVxuXG4gIC8vISBpdGVtIHN0b3JhZ2UgZ2V0dGVyc1xuICBnZXQgaGVhZGVyQ2VsbHMoKTogSGVhZGVyQ2VsbFtdW10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtU3RvcmFnZS5oZWFkZXJDZWxscztcbiAgfVxuICBnZXQgZGF0YVJvd3MoKTogQXJkVGFibGVSb3dbXSB7XG4gICAgY29uc3QgaXRlbXM6IEFyZFRhYmxlUm93W10gPSB0aGlzLl9pdGVtU3RvcmFnZS5wYWdpbmF0ZWRJdGVtcztcblxuICAgIGlmICghdGhpcy5wYWdlRmlsbFJlbWFpbmluZykgcmV0dXJuIGl0ZW1zO1xuICAgIGlmICghdGhpcy5pc0RlZmluZWRUb3RhbEl0ZW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJzxhcmQtdGFibGU+IHJlcXVpcmVzIFt0b3RhbEl0ZW1zXSB0byBiZSBkZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYWdlID09IDEpIHJldHVybiBpdGVtcztcbiAgICBmb3IgKGxldCBpID0gaXRlbXMubGVuZ3RoOyBpIDwgdGhpcy5pdGVtc1BlclBhZ2U7IGkrKykge1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGl0ZW1EYXRhOiBudWxsLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgZGF0YTogW10sXG4gICAgICAgIGRhdGFDb2x1bW5zOiBbXSxcbiAgICAgICAgaXNFbXB0eTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICAvLyEgY29sdW1ucy9kYXRhIHNldHRlcnNcbiAgQElucHV0KClcbiAgc2V0IGNvbHVtbnModjogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdKSB7XG4gICAgdGhpcy5faXRlbVN0b3JhZ2Uuc2V0Q29sdW1ucyh2KTtcbiAgfVxuICBwcml2YXRlIF9kYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKVxuICBzZXQgZGF0YSh2OiBhbnlbXSkge1xuICAgIHRoaXMuX2RhdGEgPSB2O1xuICAgIHRoaXMuX2l0ZW1TdG9yYWdlLnNldEl0ZW1zKHYpO1xuICB9XG4gIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyZWF0RGF0YVNvdXJjZUFzU3RyaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCB0cmVhdERhdGFTb3VyY2VBc1N0cmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdHJlYXREYXRhU291cmNlQXNTdHJpbmc7XG4gIH1cbiAgc2V0IHRyZWF0RGF0YVNvdXJjZUFzU3RyaW5nKHY6IGFueSkge1xuICAgIHRoaXMuX3RyZWF0RGF0YVNvdXJjZUFzU3RyaW5nID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy8hIHRlbXBsYXRlc1xuICBAQ29udGVudENoaWxkKEFyZGl1bVRhYmxlQ2hlY2tib3hUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBjaGVja2JveFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VGFibGVDaGVja2JveENvbnRleHQ+O1xuICBAQ29udGVudENoaWxkKEFyZGl1bVRhYmxlSGVhZGVyQ2hlY2tib3hUZW1wbGF0ZURpcmVjdGl2ZSwge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBoZWFkZXJDaGVja2JveFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VGFibGVIZWFkZXJDaGVja2JveENvbnRleHQ+O1xuICBAQ29udGVudENoaWxkKEFyZGl1bVRhYmxlQ2FwdGlvblRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGNhcHRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPFRhYmxlQ2FwdGlvbkNvbnRleHQ+O1xuXG4gIHByaXZhdGUgX2l0ZW1UZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9ID0ge307XG4gIEBDb250ZW50Q2hpbGRyZW4oQXJkaXVtVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgdGVtcGxhdGVDaGlsZHJlbiE6IFF1ZXJ5TGlzdDxBcmRpdW1UYWJsZVRlbXBsYXRlRGlyZWN0aXZlPjtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0gQXJyYXkuZnJvbSh0aGlzLnRlbXBsYXRlQ2hpbGRyZW4pO1xuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgdGVtcGxhdGVzKSB7XG4gICAgICBpZiAoIWluc3RhbmNlLm5hbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoJ1thcmQtdGFibGUtdG1wXSByZXF1aXJlcyBhIHZhbHVlIHRvIGJlIHNwZWNpZmllZC4nKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5faXRlbVRlbXBsYXRlc1tpbnN0YW5jZS5uYW1lXSA9IGluc3RhbmNlLnRlbXBsYXRlO1xuICAgIH1cbiAgfVxuXG4gIGdldEhlYWRlclRlbXBsYXRlKHRtcDogc3RyaW5nIHwgeyB0ZW1wbGF0ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB9KTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB0bXAgPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFRlbXBsYXRlKHRtcC50ZW1wbGF0ZSk7XG4gIH1cbiAgZ2V0SGVhZGVyQ2hlY2tib3hDb2xvcigpOiBTaW1wbGVDb21wb25lbnRDb2xvciB7XG4gICAgaWYgKHRoaXMuYXBwZWFyYW5jZSA9PSBUYWJsZUFwcGVhcmFuY2UuU3Ryb25nKSByZXR1cm4gU2ltcGxlQ29tcG9uZW50Q29sb3IuQ3VycmVudENvbG9yO1xuICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICB9XG4gIGdldENlbGxUZW1wbGF0ZSh0bXA/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgLy9yZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKCF0bXApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy9yZXR1cm4gdGVtcGxhdGUsIGlmIGl0IGlzIG9uZVxuICAgIGlmICh0bXAgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikgcmV0dXJuIHRtcDtcbiAgICAvL2NoZWNrIGlmIHRoZSBuYW1lIGNhbiBiZSBmb3VuZFxuICAgIGlmICghKHRtcCBpbiB0aGlzLl9pdGVtVGVtcGxhdGVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoYDxhcmQtdGFibGU+IGVycm9yOiBjYW5ub3QgZmluZCB0ZW1wbGF0ZSBuYW1lZCBcIiR7dG1wfVwiYCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy9yZXR1cm4gdGhlIHRlbXBsYXRlXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1UZW1wbGF0ZXNbdG1wXTtcbiAgfVxuICBnZXRDZWxsU3R5bGUoY2VsbDogVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpOiBzdHJpbmcge1xuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKGNlbGwpKSByZXR1cm4gJ3dpZHRoOnVuc2V0O21pbi13aWR0aDp1bnNldCc7XG4gICAgY29uc3Qgd2lkdGggPSB0eXBlb2YgY2VsbC53aWR0aCA9PSAnbnVtYmVyJyA/IGAke2NlbGwud2lkdGh9cHhgIDogY2VsbC53aWR0aDtcbiAgICBjb25zdCBtaW5XaWR0aCA9IHR5cGVvZiBjZWxsLm1pbldpZHRoID09ICdudW1iZXInID8gYCR7Y2VsbC5taW5XaWR0aH1weGAgOiBjZWxsLm1pbldpZHRoO1xuICAgIHJldHVybiBbYHdpZHRoOiR7d2lkdGggPz8gJ3Vuc2V0J31gLCBgbWluLXdpZHRoOiR7bWluV2lkdGggPz8gJ3Vuc2V0J31gXS5qb2luKCc7Jyk7XG4gIH1cblxuICAvLyEgY2xpY2sgJiBob3ZlciBoYW5kbGVyc1xuICBvbkNoZWNrYm94Q2xpY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlUm93U2VsZWN0ZWQoaW5kZXgpO1xuICB9XG4gIG9uUm93Q2xpY2soaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0YWJsZVJvd3MpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGVkKGluZGV4KTtcbiAgfVxuICBvblJvd01vdXNlT3ZlcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIG9uUm93TW91c2VFbnRlcihpbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RhYmxlUm93cykgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuX2l0ZW1TdG9yYWdlLmhpZ2hsaWdodFNpbmdsZUl0ZW0oaW5kZXgpO1xuICB9XG4gIG9uUm93TW91c2VMZWF2ZShpbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RhYmxlUm93cykgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuX2l0ZW1TdG9yYWdlLnVuaGlnaGxpZ2h0SXRlbShpbmRleCk7XG4gIH1cblxuICAvLyEgc2VsZWN0IGhhbmRsZXJzXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSByb3cgaW4gdGhlIHRhYmxlLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWQgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHJvdyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHJvdyBpbiB0aGUgdGFibGUuXG4gICAqL1xuICB0b2dnbGVSb3dTZWxlY3RlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2l0ZW1TdG9yYWdlLmlzSXRlbVNlbGVjdGVkKGluZGV4KSkge1xuICAgICAgY29uc3QgdW5zZWxlY3RlZCA9IHRoaXMuX2l0ZW1TdG9yYWdlLnVuc2VsZWN0SXRlbShpbmRleCk7XG4gICAgICB0aGlzLnVuc2VsZWN0Um93RXZlbnQuZW1pdCh1bnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3NlbGVjdGVkLCBmYWlsZWRdID0gdGhpcy5faXRlbVN0b3JhZ2Uuc2VsZWN0SXRlbShpbmRleCk7XG4gICAgICB0aGlzLnNlbGVjdFJvd0V2ZW50LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgdGhpcy5mYWlsZWRTZWxlY3RSb3dFdmVudC5lbWl0KGZhaWxlZCk7XG4gICAgfVxuICAgIHRoaXMuX2VtaXRTZWxlY3QoKTtcbiAgfVxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGFsbCByb3dzIGluIHRoZSB0YWJsZS5cbiAgICovXG4gIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXRlbVN0b3JhZ2UuYXJlQWxsU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IHVuc2VsZWN0ZWQgPSB0aGlzLl9pdGVtU3RvcmFnZS51bnNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy51bnNlbGVjdFJvd0V2ZW50LmVtaXQodW5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtzZWxlY3RlZCwgZmFpbGVkXSA9IHRoaXMuX2l0ZW1TdG9yYWdlLnNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5zZWxlY3RSb3dFdmVudC5lbWl0KHNlbGVjdGVkKTtcbiAgICAgIHRoaXMuZmFpbGVkU2VsZWN0Um93RXZlbnQuZW1pdChmYWlsZWQpO1xuICAgIH1cbiAgICB0aGlzLl9lbWl0U2VsZWN0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfZW1pdFNlbGVjdCgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5faXRlbVN0b3JhZ2UudmFsdWU7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2VFdmVudC5lbWl0KHYpO1xuICB9XG4gIGlzQ2VsbENoZWNrYm94KGNlbGw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgY2VsbCA9PSAnb2JqZWN0JyAmJiAnX2FyZENoZWNrYm94JyBpbiBjZWxsICYmICdpbmRleCcgaW4gY2VsbDtcbiAgfVxuICBpc0hlYWRlckNlbGxDaGVja2JveChjZWxsOiBIZWFkZXJDZWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YUNlbGwgPSBjZWxsLmNlbGw7XG4gICAgaWYgKGlzVGFibGVTdWJoZWFkZXIoZGF0YUNlbGwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBkYXRhQ2VsbC5kYXRhU291cmNlID09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRhdGFDZWxsLmRhdGFTb3VyY2UudHlwZSA9PSAnY2hlY2tib3gnO1xuICB9XG4gIGlzSGVhZGVyQ2VsbFNvcnRhYmxlKGNlbGw6IEhlYWRlckNlbGwpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhQ2VsbCA9IGNlbGwuY2VsbDtcbiAgICBpZiAoaXNUYWJsZVN1YmhlYWRlcihkYXRhQ2VsbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZGF0YUNlbGwuc29ydGFibGUgPz8gZmFsc2U7XG4gIH1cblxuICBAT3V0cHV0KCdzZWxlY3RlZFJvd3NDaGFuZ2UnKSBzZWxlY3RlZFJvd3NDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoJ2ZhaWxlZFNlbGVjdFJvdycpIGZhaWxlZFNlbGVjdFJvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0Um93Jykgc2VsZWN0Um93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCd1bnNlbGVjdFJvdycpIHVuc2VsZWN0Um93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8vISBjb250ZXh0c1xuICBnZXRIZWFkZXJDb250ZXh0KGNlbGw6IFRhYmxlRGF0YUNvbHVtbiwgaW5kZXg6IG51bWJlcik6IFRhYmxlSGVhZGVyQ29udGV4dCB8IG51bGw7XG4gIGdldEhlYWRlckNvbnRleHQoY2VsbDogVGFibGVTdWJoZWFkZXIsIGluZGV4OiBudW1iZXIpOiBUYWJsZVN1YmhlYWRlckNvbnRleHQgfCBudWxsO1xuICBnZXRIZWFkZXJDb250ZXh0KGNlbGw6IFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyLCBpbmRleDogbnVtYmVyKTogVGFibGVIZWFkZXJDb250ZXh0IHwgVGFibGVTdWJoZWFkZXJDb250ZXh0IHwgbnVsbDtcbiAgZ2V0SGVhZGVyQ29udGV4dChjZWxsOiBUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlciwgaW5kZXg6IG51bWJlcik6IFRhYmxlSGVhZGVyQ29udGV4dCB8IFRhYmxlU3ViaGVhZGVyQ29udGV4dCB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgY2VsbC5oZWFkZXIgIT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKGNlbGwpKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJGltcGxpY2l0OiBjZWxsLmhlYWRlcixcbiAgICAgICAgaGVhZGVyOiBjZWxsLmhlYWRlcixcbiAgICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY2VsbC5oZWFkZXIsXG4gICAgICBoZWFkZXI6IGNlbGwuaGVhZGVyLFxuICAgICAgc29ydGFibGU6IGNlbGwuc29ydGFibGUgPz8gZmFsc2UsXG4gICAgICBzb3J0VHlwZTogdGhpcy5faXRlbVN0b3JhZ2UuZ2V0Q29sdW1uU29ydFR5cGUoaW5kZXgpLFxuICAgICAgb25UcmlnZ2VyU29ydDogKGV2ZW50PzogRXZlbnQpID0+IHRoaXMuX2l0ZW1TdG9yYWdlLnRvZ2dsZUN1cnJlbnRTb3J0Q29sdW1uKGluZGV4KSxcbiAgICAgIG9uVHJpZ2dlclJlc2V0U29ydDogKGV2ZW50PzogRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5faXRlbVN0b3JhZ2UucmVzZXRTb3J0KCk7XG4gICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SGVhZGVyQ2hlY2tib3hDb250ZXh0KCk6IFRhYmxlSGVhZGVyQ2hlY2tib3hDb250ZXh0IHtcbiAgICBsZXQgc3RhdGU6IENoZWNrYm94U3RhdGUgPSBDaGVja2JveFN0YXRlLlVuc2VsZWN0ZWQ7XG4gICAgaWYgKHRoaXMuX2l0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKSB7XG4gICAgICBzdGF0ZSA9IENoZWNrYm94U3RhdGUuSW5kZXRlcm1pbmF0ZTtcbiAgICAgIGlmICh0aGlzLl9pdGVtU3RvcmFnZS5hcmVBbGxTZWxlY3RlZCkge1xuICAgICAgICBzdGF0ZSA9IENoZWNrYm94U3RhdGUuU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHN0YXRlLFxuICAgICAgc3RhdGUsXG4gICAgICBvbkNoYW5nZTogKCkgPT4ge1xuICAgICAgICB0aGlzLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIGdldENoZWNrYm94Q29udGV4dChpbmRleDogbnVtYmVyKTogVGFibGVDaGVja2JveENvbnRleHQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9pdGVtU3RvcmFnZS5pdGVtcy5maW5kKHYgPT4gdi5pbmRleCA9PSBpbmRleCkhO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaXRlbS5zZWxlY3RlZCA/PyBmYWxzZTtcbiAgICBjb25zdCBkaXNhYmxlZCA9IGl0ZW0uZGlzYWJsZWQgPz8gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogc2VsZWN0ZWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vbkNoZWNrYm94Q2xpY2soaW5kZXgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJhcmQtdGFibGVcIiBbbmdDbGFzc109XCJuZ0NsYXNzZXNcIj5cclxuICAgIDxjYXB0aW9uXHJcbiAgICAgICAgKm5nSWY9XCJjYXB0aW9uXCJcclxuICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9fY2FwdGlvblwiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC10YWJsZV9fY2FwdGlvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2FwdGlvblRlbXBsYXRlIGxldC1jYXB0aW9uVGV4dD5cclxuICAgICAgICAgICAgICAgIHt7IGNhcHRpb25UZXh0IH19XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2FwdGlvblRlbXBsYXRlID8/IGRlZmF1bHRDYXB0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjYXB0aW9uIH1cIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9jYXB0aW9uPlxyXG4gICAgPHRoZWFkIGNsYXNzPVwiYXJkLXRhYmxlX19oZWFkZXJcIj5cclxuICAgICAgICA8dHIgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci1yb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGhlYWRlckNlbGxzXCI+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgaW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY2VsbC5jZWxsLmNlbGxDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLXRhYmxlX19jaGVja2JveC1jZWxsXT1cImlzSGVhZGVyQ2VsbENoZWNrYm94KGNlbGwpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuXCJcclxuICAgICAgICAgICAgICAgIFtzY29wZV09XCJjZWxsLmNvbHNwYW4gPiAxID8gJ2NvbGdyb3VwJyA6ICdjb2wnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19jZWxsLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9fc29ydGFibGVdPVwiaXNIZWFkZXJDZWxsU29ydGFibGUoY2VsbClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjZWxsLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluV2lkdGhdPVwiY2VsbC5taW5XaWR0aFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSGVhZGVyQ2VsbENoZWNrYm94KGNlbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlckNoZWNrYm94VGVtcGxhdGUgbGV0LXN0YXRlIGxldC1vbkNoYW5nZT1cIm9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWNoZWNrYm94IFt0YWJJbmRleF09XCJpc0xvYWRpbmcgPyAtMSA6IHRhYkluZGV4XCIgW3N0YXRlXT1cInN0YXRlXCIgW2NvbG9yXT1cImdldEhlYWRlckNoZWNrYm94Q29sb3IoKVwiIHVuc2VsZWN0ZWRDb2xvcj1cImN1cnJlbnRDb2xvclwiIChjaGFuZ2UpPVwib25DaGFuZ2UoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyQ2hlY2tib3hUZW1wbGF0ZSA/PyBkZWZhdWx0SGVhZGVyQ2hlY2tib3hUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SGVhZGVyQ2hlY2tib3hDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNIZWFkZXJDZWxsQ2hlY2tib3goY2VsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVmYXVsdEhlYWRlckNlbGxUZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWNvbnRlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1zb3J0YWJsZT1cInNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1zb3J0VHlwZT1cInNvcnRUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1vblRyaWdnZXJTb3J0PVwib25UcmlnZ2VyU29ydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtb25UcmlnZ2VyUmVzZXRTb3J0PVwib25UcmlnZ2VyUmVzZXRTb3J0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19oZWFkZXItdGVtcGxhdGUtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLXNvcnRhYmxlXT1cInNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLW5vbnNvcnRhYmxlXT1cIiFzb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNvbnRlbnQtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRyaWdnZXJTb3J0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5Fc2MpPVwib25UcmlnZ2VyUmVzZXRTb3J0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNvbnRlbnRcIj57eyBjb250ZW50IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci1zb3J0LWljb25cIiAqbmdJZj1cInNvcnRUeXBlICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbiAqbmdJZj1cInNvcnRUeXBlID09ICdhc2NlbmRpbmcnXCI+c291dGg8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uICpuZ0lmPVwic29ydFR5cGUgPT0gJ2Rlc2NlbmRpbmcnXCI+bm9ydGg8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19oZWFkZXItY29udGVudC1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzb3J0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXRhYmxlX19oZWFkZXItY29udGVudFwiPnt7IGNvbnRlbnQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRIZWFkZXJUZW1wbGF0ZShjZWxsLmNlbGwuaGVhZGVyKSA/PyBkZWZhdWx0SGVhZGVyQ2VsbFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRIZWFkZXJDb250ZXh0KGNlbGwuY2VsbCwgaW5kZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L3RoZWFkPlxyXG4gICAgPHRib2R5IGNsYXNzPVwiYXJkLXRhYmxlX19ib2R5XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIGRhdGFSb3dzOyBsZXQgcm93SW5kZXggPSBpbmRleDtcIj5cclxuICAgICAgICAgICAgPHRyICpuZ0lmPVwicm93LmlzRW1wdHlcIiBjbGFzcz1cImFyZC10YWJsZV9fZW1wdHktcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhcmQtdGFibGVfX2VtcHR5LWNlbGxcIiBjb2xzcGFuPVwiOTk5OVwiPjwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhcm93LmlzRW1wdHlcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2JvZHktcm93XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX3NlbGVjdGVkLXJvd109XCJyb3cuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9faGlnaGxpZ2h0ZWQtcm93XT1cInJvdy5oaWdobGlnaHRlZFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLXRhYmxlX19kaXNhYmxlZC1yb3ddPVwicm93LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX2JvbGQtcm93XT1cInJvdy5ib2xkXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKHJvd0luZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25Sb3dNb3VzZU92ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvblJvd01vdXNlRW50ZXIocm93SW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25Sb3dNb3VzZUxlYXZlKHJvd0luZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3cuZGF0YTsgbGV0IGNlbGxJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVG1wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9fY2VsbC1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImdldENlbGxTdHlsZShyb3cuZGF0YUNvbHVtbnNbY2VsbEluZGV4XSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDZWxsQ2hlY2tib3goY2VsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDaGVja2JveFRlbXBsYXRlIGxldC1pc0NoZWNrZWQgbGV0LW9uQ2hhbmdlPVwib25DaGFuZ2VcIiBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWNoZWNrYm94IFt0YWJJbmRleF09XCJpc0xvYWRpbmcgPyAtMSA6IHRhYkluZGV4XCIgW3NlbGVjdGVkXT1cImlzQ2hlY2tlZFwiIFtjb2xvcl09XCJjb2xvclwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjaGFuZ2UpPVwib25DaGFuZ2UoKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGVja2JveFRlbXBsYXRlID8/IGRlZmF1bHRDaGVja2JveFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENoZWNrYm94Q29udGV4dChyb3dJbmRleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDZWxsQ2hlY2tib3goY2VsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVGVtcGxhdGUgbGV0LWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbnRlbnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q2VsbFRlbXBsYXRlKHJvdy5kYXRhQ29sdW1uc1tjZWxsSW5kZXhdLnRlbXBsYXRlKSA/PyBkZWZhdWx0Q2VsbFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjZWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcm93LmRhdGFDb2x1bW5zW2NlbGxJbmRleF0uaXNSb3dIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9fYm9keS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmRhdGFDb2x1bW5zW2NlbGxJbmRleF0uY2VsbENsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9fY2hlY2tib3gtY2VsbF09XCJpc0NlbGxDaGVja2JveChjZWxsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRtcFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cuZGF0YUNvbHVtbnNbY2VsbEluZGV4XS5pc1Jvd0hlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19ib2R5LWNlbGwgYXJkLXRhYmxlX19yb3ctaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuZGF0YUNvbHVtbnNbY2VsbEluZGV4XS5jZWxsQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLXRhYmxlX19jaGVja2JveC1jZWxsXT1cImlzQ2VsbENoZWNrYm94KGNlbGwpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVG1wXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3Rib2R5PlxyXG4gICAgPHRmb290IGNsYXNzPVwiYXJkLXRhYmxlX19mb290XCIgKm5nSWY9XCJjYW5EaXNwbGF5UGFnaW5hdGlvblwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cImFyZC10YWJsZV9fZm9vdC1yb3dcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXJkLXRhYmxlX19wYWdpbmF0aW9uLWNlbGxcIiBjb2xzcGFuPVwiOTk5OVwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC10YWJsZS1wYWdpbmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicGFnaW5hdGlvbk9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsocGFnZSldPVwicGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2luYXRpb25EaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhpdGVtc1BlclBhZ2UpXT1cIml0ZW1zUGVyUGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsaWduXT1cInBhZ2luYXRpb25BbGlnblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc1BlclBhZ2VUZXh0XT1cIml0ZW1zUGVyUGFnZVRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SXRlbXNGb3JtYXRGbl09XCJjdXJyZW50SXRlbXNGb3JtYXRGblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW1zUGVyUGFnZUNoYW5nZSk9XCJpdGVtc1BlclBhZ2VDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJwYWdlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9hcmQtdGFibGUtcGFnaW5hdGlvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC90Zm9vdD5cclxuPC90YWJsZT4iXX0=
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixZQUFZLEVBQ1osZUFBZSxFQUNmLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQXdCLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RSxPQUFPLEVBQUUsV0FBVyxFQUFjLGdCQUFnQixFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBQ3ZHLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsb0NBQW9DLEVBQ3BDLDBDQUEwQyxFQUMxQyw0QkFBNEIsR0FDN0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUNkLGVBQWUsRUFNZix1QkFBdUIsRUFHdkIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFB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Z0JBTUYsSUFBSTtzQkFEUCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIGNvbnRlbnRDaGlsZCxcbiAgY29udGVudENoaWxkcmVuLFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTnVtYmVyIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgX0ZvY3VzYWJsZUNvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvZm9jdXNhYmxlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveFN0YXRlIH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3gudHlwZXMnO1xuaW1wb3J0IHsgQ3VycmVudEl0ZW1zRm9ybWF0Rm4sIFBhZ2luYXRpb25BbGlnbiB9IGZyb20gJy4uL3RhYmxlLXBhZ2luYXRpb24vdGFibGUtcGFnaW5hdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRDb2xvciwgU2ltcGxlQ29tcG9uZW50Q29sb3IgfSBmcm9tICcuLi90eXBlcy9jb2xvcnMudHlwZXMnO1xuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy91dGlsaXR5LnR5cGVzJztcbmltcG9ydCB7IEFyZFRhYmxlUm93LCBIZWFkZXJDZWxsLCBUYWJsZUl0ZW1TdG9yYWdlLCBUYWJsZUl0ZW1TdG9yYWdlSG9zdCB9IGZyb20gJy4vdGFibGUtaXRlbS1zdG9yYWdlJztcbmltcG9ydCB7XG4gIEFyZGl1bVRhYmxlQ2FwdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRpdW1UYWJsZUNoZWNrYm94VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZGl1bVRhYmxlSGVhZGVyQ2hlY2tib3hUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkaXVtVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90YWJsZS5kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gIFRhYmxlQWxpZ25UeXBlLFxuICBUYWJsZUFwcGVhcmFuY2UsXG4gIFRhYmxlQ2FwdGlvbkNvbnRleHQsXG4gIFRhYmxlQ2hlY2tib3hDb250ZXh0LFxuICBUYWJsZURhdGFDb2x1bW4sXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hDb250ZXh0LFxuICBUYWJsZUhlYWRlckNvbnRleHQsXG4gIFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5LFxuICBUYWJsZVN1YmhlYWRlcixcbiAgVGFibGVTdWJoZWFkZXJDb250ZXh0LFxuICBUYWJsZVZhcmlhbnQsXG59IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgaXNUYWJsZVN1YmhlYWRlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcmQtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXJkaXVtVGFibGVDb21wb25lbnQgZXh0ZW5kcyBfRm9jdXNhYmxlQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIFRhYmxlSXRlbVN0b3JhZ2VIb3N0LCBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IF9pdGVtU3RvcmFnZSA9IG5ldyBUYWJsZUl0ZW1TdG9yYWdlKHRoaXMpO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHJvd0Rpc2FibGVkRnJvbTogJ2Rpc2FibGVkJyxcbiAgICByb3dCb2xkRnJvbTogJ2JvbGQnLFxuICB9O1xuXG4gIHJlYWRvbmx5IHJvd0Rpc2FibGVkRnJvbSA9IGlucHV0PE51bGxhYmxlPHN0cmluZz4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHJvd0JvbGRGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaW52ZXJ0Um93RGlzYWJsZWQgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGludmVydFJvd0JvbGQgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0YWJsZVJvd3MgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IG1heFNlbGVjdGVkSXRlbXMgPSBpbnB1dDxOdWxsYWJsZTxudW1iZXI+LCBhbnk+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgdW5kZWZpbmVkKSB9KTtcblxuICByZWFkb25seSBjbGlja2FibGVSb3dzID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IGNhcHRpb24gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgbG9hZGluZ1Byb2dyZXNzID0gaW5wdXQ8bnVtYmVyLCBhbnk+KDAsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIDApIH0pOyAvL1RPRE8gYWRkIHByb2dyZXNzIGJhclxuXG4gIC8vISBhcHBlYXJhbmNlXG4gIHJlYWRvbmx5IGFwcGVhcmFuY2UgPSBpbnB1dDxUYWJsZUFwcGVhcmFuY2U+KFRhYmxlQXBwZWFyYW5jZS5TdHJvbmcpO1xuICByZWFkb25seSB2YXJpYW50ID0gaW5wdXQ8VGFibGVWYXJpYW50PihUYWJsZVZhcmlhbnQuUm91bmRlZCk7XG4gIHJlYWRvbmx5IGNvbG9yID0gaW5wdXQ8Q29tcG9uZW50Q29sb3I+KENvbXBvbmVudENvbG9yLlByaW1hcnkpO1xuICByZWFkb25seSBhbGlnbiA9IGlucHV0PFRhYmxlQWxpZ25UeXBlPihUYWJsZUFsaWduVHlwZS5DZW50ZXJMZWZ0KTtcbiAgcmVhZG9ubHkgaGVhZGVyQWxpZ24gPSBpbnB1dDxUYWJsZUFsaWduVHlwZT4oVGFibGVBbGlnblR5cGUuQ2VudGVyTGVmdCk7XG5cbiAgcmVhZG9ubHkgY29tcGFjdCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgemVicmEgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IHN0aWNreUhlYWRlciA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcblxuICByZWFkb25seSBuZ0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIFtcbiAgICAgIGBhcmQtYXBwZWFyYW5jZS0ke3RoaXMuYXBwZWFyYW5jZSgpfWAsXG4gICAgICBgYXJkLXZhcmlhbnQtJHt0aGlzLnZhcmlhbnQoKX1gLFxuICAgICAgYGFyZC1jb2xvci0ke3RoaXMuY29sb3IoKX1gLFxuICAgICAgYGFyZC1hbGlnbi0ke3RoaXMuYWxpZ24oKX1gLFxuICAgICAgYGFyZC1oZWFkZXItYWxpZ24tJHt0aGlzLmhlYWRlckFsaWduKCl9YCxcbiAgICAgIHRoaXMuY29tcGFjdCgpID8gJ2FyZC1jb21wYWN0JyA6ICcnLFxuICAgICAgdGhpcy56ZWJyYSgpID8gJ2FyZC16ZWJyYS10YWJsZScgOiAnJyxcbiAgICAgIHRoaXMuc2VsZWN0YWJsZVJvd3MoKSA/ICdhcmQtc2VsZWN0YWJsZS1yb3dzJyA6ICcnLFxuICAgICAgdGhpcy5zdGlja3lIZWFkZXIoKSA/ICdhcmQtc3RpY2t5LWhlYWRlcicgOiAnJyxcbiAgICAgIHRoaXMuaXNMb2FkaW5nKCkgPyAnYXJkLXRhYmxlLWxvYWRpbmcnIDogJycsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICAvLyEgcGFnaW5hdGlvblxuICByZWFkb25seSBwYWdpbmF0ZWQgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TdHJhdGVneSA9IGlucHV0PFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5PihUYWJsZVBhZ2luYXRpb25TdHJhdGVneS5Ob29wKTtcbiAgcmVhZG9ubHkgcGFnaW5hdGlvbk9wdGlvbnMgPSBpbnB1dDxcbiAgICBudW1iZXJbXSB8IHsgdmFsdWU6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10sXG4gICAgbnVtYmVyW10gfCB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdXG4gID4oWzEwLCAyNSwgNTBdLCB7XG4gICAgdHJhbnNmb3JtOiB2ID0+IHtcbiAgICAgIHJldHVybiB2LmZpbHRlcihlbCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGlzTnVtYmVyKGVsKSA/IGVsIDogZWwudmFsdWU7XG4gICAgICAgIGlmIChvcHQgPD0gMCB8fCBvcHQgJSAxICE9PSAwKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFSRC1ORjUwNTI6IGVhY2ggaXRlbSBvZiA8YXJkLXRhYmxlPidzIFtwYWdpbmF0aW9uT3B0aW9uc10gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIFRoZSBcIiR7b3B0fVwiIG9wdGlvbiB3aWxsIGJlIGlnbm9yZWQuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSkgYXMgbnVtYmVyW10gfCB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdO1xuICAgIH0sXG4gIH0pO1xuICByZWFkb25seSB0b3RhbEl0ZW1zID0gaW5wdXQ8TnVsbGFibGU8bnVtYmVyPiwgYW55Pih1bmRlZmluZWQsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHVuZGVmaW5lZCkgfSk7XG4gIHJlYWRvbmx5IHBhZ2luYXRpb25Db2xvciA9IGlucHV0PENvbXBvbmVudENvbG9yPihDb21wb25lbnRDb2xvci5Ob25lKTtcbiAgcmVhZG9ubHkgcGFnaW5hdGlvbkFsaWduID0gaW5wdXQ8UGFnaW5hdGlvbkFsaWduPihQYWdpbmF0aW9uQWxpZ24uU3BsaXQpO1xuICByZWFkb25seSBpdGVtc1BlclBhZ2VUZXh0ID0gaW5wdXQ8c3RyaW5nPignSXRlbXMgcGVyIHBhZ2U6Jyk7XG4gIHJlYWRvbmx5IGN1cnJlbnRJdGVtc0Zvcm1hdEZuID0gaW5wdXQ8Q3VycmVudEl0ZW1zRm9ybWF0Rm4+KFxuICAgICh7IGN1cnJlbnRJdGVtc0ZpcnN0LCBjdXJyZW50SXRlbXNMYXN0LCB0b3RhbEl0ZW1zIH0pID0+IGAke2N1cnJlbnRJdGVtc0ZpcnN0fSDigJMgJHtjdXJyZW50SXRlbXNMYXN0fSBvZiAke3RvdGFsSXRlbXN9YFxuICApO1xuXG4gIHJlYWRvbmx5IHBhZ2VGaWxsUmVtYWluaW5nID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBwYWdpbmF0aW9uRGlzYWJsZWQgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IHVzZUZpcnN0TGFzdEJ1dHRvbnMgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgaXRlbXNQZXJQYWdlID0gbW9kZWw8bnVtYmVyPig1MCk7XG4gIHJlYWRvbmx5IHBhZ2UgPSBtb2RlbDxudW1iZXI+KDEpO1xuXG4gIHJlYWRvbmx5IGlzRGVmaW5lZFRvdGFsSXRlbXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLnBhZ2luYXRpb25TdHJhdGVneSgpICE9PSBUYWJsZVBhZ2luYXRpb25TdHJhdGVneS5Ob29wIHx8IGlzRGVmaW5lZCh0aGlzLnRvdGFsSXRlbXMoKSlcbiAgKTtcbiAgcmVhZG9ubHkgY2FuRGlzcGxheVBhZ2luYXRpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZ2luYXRlZCgpICYmIHRoaXMuaXNEZWZpbmVkVG90YWxJdGVtcygpKTtcblxuICAvLyEgcHJpbnQgZXJyb3JzIGlmIG5lZWRlZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zUGVyUGFnZSddKSB7XG4gICAgICBjb25zdCBpcHAgPSBjaGFuZ2VzWydpdGVtc1BlclBhZ2UnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBvcHRpb25zID1cbiAgICAgICAgKGNoYW5nZXNbJ3BhZ2luYXRpb25PcHRpb25zJ10/LmN1cnJlbnRWYWx1ZSBhcyBudW1iZXJbXSB8IHsgdmFsdWU6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10pIHx8XG4gICAgICAgICh0aGlzLnBhZ2luYXRpb25PcHRpb25zKCkgYXMgbnVtYmVyW10gfCB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdKTtcbiAgICAgIGlmICghb3B0aW9ucy5maW5kKHYgPT4gKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgPT09IGlwcCA6IHYudmFsdWUgPT09IGlwcCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFSRC1ORjUwNTE6IHZhbHVlIG9mIFwiJHtpcHB9XCIgaW4gPGFyZC10YWJsZT4ncyBbaXRlbXNQZXJQYWdlXSBkb2VzIG5vdCBhcHBlYXIgaW4gW3BhZ2luYXRpb25PcHRpb25zXSBhcnJheSBbJHtvcHRpb25zXG4gICAgICAgICAgICAgIC5tYXAodiA9PiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHYudmFsdWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1dYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3BhZ2UnXSkge1xuICAgICAgY29uc3QgcGFnZSA9IGNoYW5nZXNbJ3BhZ2UnXS5jdXJyZW50VmFsdWUgYXMgbnVtYmVyO1xuICAgICAgaWYgKHBhZ2UgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUkQtRlQ1MDUzYTogPGFyZC10YWJsZT4ncyBbcGFnZV0gdXNlcyAxLWluZGV4ZWQgbnVtYmVyaW5nIHN5c3RlbS4gVGhlIHZhbHVlIDAgaXMgbm90IGFjY2VwdGVkLmApO1xuICAgICAgfSBlbHNlIGlmIChwYWdlIDwgMCB8fCBwYWdlICUgMSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFSRC1GVDUwNTNiOiB2YWx1ZSBvZiA8YXJkLXRhYmxlPidzIFtwYWdlXSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290IFwiJHtwYWdlfVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vISBpdGVtIHN0b3JhZ2UgZ2V0dGVyc1xuICByZWFkb25seSBoZWFkZXJDZWxscyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2l0ZW1TdG9yYWdlLmhlYWRlckNlbGxzKCkpO1xuXG4gIHJlYWRvbmx5IGRhdGFSb3dzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1zOiBBcmRUYWJsZVJvd1tdID0gdGhpcy5faXRlbVN0b3JhZ2UucGFnaW5hdGVkSXRlbXMoKTtcblxuICAgIGlmICghdGhpcy5wYWdlRmlsbFJlbWFpbmluZygpKSByZXR1cm4gaXRlbXM7XG4gICAgaWYgKCF0aGlzLmlzRGVmaW5lZFRvdGFsSXRlbXMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBUkQtRlQ1MDUwOiA8YXJkLXRhYmxlPiByZXF1aXJlcyBbdG90YWxJdGVtc10gdG8gYmUgZGVmaW5lZCB3aGVuIHVzaW5nIFwic2xpY2VcIiBwYWdpbmF0aW9uIHN0cmF0ZWd5LicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYWdlKCkgPT09IDEpIHJldHVybiBpdGVtcztcblxuICAgIGNvbnN0IGlwcCA9IHRoaXMuaXRlbXNQZXJQYWdlKCk7XG4gICAgZm9yIChsZXQgaSA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlwcDsgaSsrKSB7XG4gICAgICBpdGVtcy5wdXNoKEFyZFRhYmxlUm93Lm5ld0VtcHR5Q2VsbChpKSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfSk7XG5cbiAgLy8hIGNvbHVtbnMvZGF0YSBzZXR0ZXJzXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5zKHY6IChUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcilbXSkge1xuICAgIHRoaXMuX2l0ZW1TdG9yYWdlLnNldENvbHVtbnModik7XG4gIH1cbiAgcHJpdmF0ZSBfZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KClcbiAgc2V0IGRhdGEodjogYW55W10pIHtcbiAgICB0aGlzLl9kYXRhID0gdjtcbiAgICB0aGlzLl9pdGVtU3RvcmFnZS5zZXRJdGVtcyh2KTtcbiAgfVxuICBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICByZWFkb25seSB0cmVhdERhdGFTb3VyY2VBc1N0cmluZyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgX3N1cHByZXNzRXJyb3JzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgcmVhZG9ubHkgY2hlY2tib3hUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZDxBcmRpdW1UYWJsZUNoZWNrYm94VGVtcGxhdGVEaXJlY3RpdmUsIFRlbXBsYXRlUmVmPFRhYmxlQ2hlY2tib3hDb250ZXh0Pj4oXG4gICAgQXJkaXVtVGFibGVDaGVja2JveFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIHtcbiAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmPFRhYmxlQ2hlY2tib3hDb250ZXh0PixcbiAgICB9XG4gICk7XG4gIHJlYWRvbmx5IGhlYWRlckNoZWNrYm94VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQ8XG4gICAgQXJkaXVtVGFibGVIZWFkZXJDaGVja2JveFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIFRlbXBsYXRlUmVmPFRhYmxlSGVhZGVyQ2hlY2tib3hDb250ZXh0PlxuICA+KEFyZGl1bVRhYmxlSGVhZGVyQ2hlY2tib3hUZW1wbGF0ZURpcmVjdGl2ZSwge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmPFRhYmxlSGVhZGVyQ2hlY2tib3hDb250ZXh0PixcbiAgfSk7XG4gIHJlYWRvbmx5IGNhcHRpb25UZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZDxBcmRpdW1UYWJsZUNhcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSwgVGVtcGxhdGVSZWY8VGFibGVDYXB0aW9uQ29udGV4dD4+KFxuICAgIEFyZGl1bVRhYmxlQ2FwdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIHtcbiAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmPFRhYmxlQ2FwdGlvbkNvbnRleHQ+LFxuICAgIH1cbiAgKTtcblxuICBwcml2YXRlIF9pdGVtVGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PiA9IHt9O1xuICByZWFkb25seSB0ZW1wbGF0ZUNoaWxkcmVuID0gY29udGVudENoaWxkcmVuPEFyZGl1bVRhYmxlVGVtcGxhdGVEaXJlY3RpdmU+KEFyZGl1bVRhYmxlVGVtcGxhdGVEaXJlY3RpdmUpO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBBcnJheS5mcm9tKHRoaXMudGVtcGxhdGVDaGlsZHJlbigpKTtcbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIHRlbXBsYXRlcykge1xuICAgICAgY29uc3QgbmFtZSA9IGluc3RhbmNlLm5hbWUoKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcignQVJELUZUNTA1NDogW2FyZC10YWJsZS10bXBdIHJlcXVpcmVzIGEgdmFsdWUgdG8gYmUgc3BlY2lmaWVkLicpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9pdGVtVGVtcGxhdGVzW25hbWVdID0gaW5zdGFuY2UudGVtcGxhdGU7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVhZGVyVGVtcGxhdGUodG1wOiBzdHJpbmcgfCB7IHRlbXBsYXRlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IH0pOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHRtcCA9PT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFRlbXBsYXRlKHRtcC50ZW1wbGF0ZSk7XG4gIH1cbiAgZ2V0SGVhZGVyQ2hlY2tib3hDb2xvcigpOiBTaW1wbGVDb21wb25lbnRDb2xvciB7XG4gICAgaWYgKHRoaXMuYXBwZWFyYW5jZSgpID09PSBUYWJsZUFwcGVhcmFuY2UuU3Ryb25nKSByZXR1cm4gU2ltcGxlQ29tcG9uZW50Q29sb3IuQ3VycmVudENvbG9yO1xuICAgIHJldHVybiB0aGlzLmNvbG9yKCk7XG4gIH1cbiAgZ2V0Q2VsbFRlbXBsYXRlKHRtcD86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAvL3JldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIXRtcCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvL3JldHVybiB0ZW1wbGF0ZSwgaWYgaXQgaXMgb25lXG4gICAgaWYgKHRtcCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSByZXR1cm4gdG1wO1xuICAgIC8vY2hlY2sgaWYgdGhlIG5hbWUgY2FuIGJlIGZvdW5kXG4gICAgaWYgKCEodG1wIGluIHRoaXMuX2l0ZW1UZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQVJELU5GNTA1NTogPGFyZC10YWJsZT4gZXJyb3I6IGNhbm5vdCBmaW5kIHRlbXBsYXRlIG5hbWVkIFwiJHt0bXB9XCJgKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvL3JldHVybiB0aGUgdGVtcGxhdGVcbiAgICByZXR1cm4gdGhpcy5faXRlbVRlbXBsYXRlc1t0bXBdO1xuICB9XG4gIGdldENlbGxTdHlsZShjZWxsOiBUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcik6IHN0cmluZyB7XG4gICAgaWYgKGlzVGFibGVTdWJoZWFkZXIoY2VsbCkpIHJldHVybiAnd2lkdGg6dW5zZXQ7bWluLXdpZHRoOnVuc2V0JztcbiAgICBjb25zdCB3aWR0aCA9IHR5cGVvZiBjZWxsLndpZHRoID09PSAnbnVtYmVyJyA/IGAke2NlbGwud2lkdGh9cHhgIDogY2VsbC53aWR0aDtcbiAgICBjb25zdCBtaW5XaWR0aCA9IHR5cGVvZiBjZWxsLm1pbldpZHRoID09PSAnbnVtYmVyJyA/IGAke2NlbGwubWluV2lkdGh9cHhgIDogY2VsbC5taW5XaWR0aDtcbiAgICByZXR1cm4gW2B3aWR0aDoke3dpZHRoID8/ICd1bnNldCd9YCwgYG1pbi13aWR0aDoke21pbldpZHRoID8/ICd1bnNldCd9YF0uam9pbignOycpO1xuICB9XG5cbiAgLy8hIGNsaWNrICYgaG92ZXIgaGFuZGxlcnNcbiAgb25DaGVja2JveENsaWNrKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGVkKGluZGV4KTtcbiAgfVxuICBvblJvd0NsaWNrKHJvdzogQXJkVGFibGVSb3csIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpY2thYmxlUm93cygpKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY2xpY2tSb3dFdmVudC5lbWl0KHJvdy5pdGVtRGF0YSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0YWJsZVJvd3MoKSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGVkKHJvdy5pbmRleCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgb25Sb3dNb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvblJvd01vdXNlRW50ZXIoaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0YWJsZVJvd3MoKSAmJiAhdGhpcy5jbGlja2FibGVSb3dzKCkpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9pdGVtU3RvcmFnZS5oaWdobGlnaHRTaW5nbGVJdGVtKGluZGV4KTtcbiAgfVxuICBvblJvd01vdXNlTGVhdmUoaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0YWJsZVJvd3MoKSAmJiAhdGhpcy5jbGlja2FibGVSb3dzKCkpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9pdGVtU3RvcmFnZS51bmhpZ2hsaWdodEl0ZW0oaW5kZXgpO1xuICB9XG5cbiAgLy8hIHNlbGVjdCBoYW5kbGVyc1xuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGEgcm93IGluIHRoZSB0YWJsZS5cbiAgICogQHBhcmFtIHNlbGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSByb3cgaXMgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSByb3cgaW4gdGhlIHRhYmxlLlxuICAgKi9cbiAgdG9nZ2xlUm93U2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pdGVtU3RvcmFnZS5pc0l0ZW1TZWxlY3RlZChpbmRleCkpIHtcbiAgICAgIGNvbnN0IHVuc2VsZWN0ZWQgPSB0aGlzLl9pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oaW5kZXgpO1xuICAgICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoKSB0aGlzLnVuc2VsZWN0Um93RXZlbnQuZW1pdCh1bnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3NlbGVjdGVkLCBmYWlsZWRdID0gdGhpcy5faXRlbVN0b3JhZ2Uuc2VsZWN0SXRlbShpbmRleCk7XG4gICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoKSB0aGlzLnNlbGVjdFJvd0V2ZW50LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgaWYgKGZhaWxlZC5sZW5ndGgpIHRoaXMuZmFpbGVkU2VsZWN0Um93RXZlbnQuZW1pdChmYWlsZWQpO1xuICAgIH1cbiAgICB0aGlzLl9lbWl0U2VsZWN0KCk7XG4gIH1cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBhbGwgcm93cyBpbiB0aGUgdGFibGUuXG4gICAqL1xuICB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2l0ZW1TdG9yYWdlLmFyZUFsbFNlbGVjdGVkKCkpIHtcbiAgICAgIGNvbnN0IHVuc2VsZWN0ZWQgPSB0aGlzLl9pdGVtU3RvcmFnZS51bnNlbGVjdEFsbCgpO1xuICAgICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoKSB0aGlzLnVuc2VsZWN0Um93RXZlbnQuZW1pdCh1bnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3NlbGVjdGVkLCBmYWlsZWRdID0gdGhpcy5faXRlbVN0b3JhZ2Uuc2VsZWN0QWxsKCk7XG4gICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoKSB0aGlzLnNlbGVjdFJvd0V2ZW50LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgaWYgKGZhaWxlZC5sZW5ndGgpIHRoaXMuZmFpbGVkU2VsZWN0Um93RXZlbnQuZW1pdChmYWlsZWQpO1xuICAgIH1cbiAgICB0aGlzLl9lbWl0U2VsZWN0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfZW1pdFNlbGVjdCgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5faXRlbVN0b3JhZ2UudmFsdWUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZUV2ZW50LmVtaXQodik7XG4gIH1cbiAgaXNDZWxsQ2hlY2tib3goY2VsbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBjZWxsID09PSAnb2JqZWN0JyAmJiAnX2FyZENoZWNrYm94JyBpbiBjZWxsICYmICdpbmRleCcgaW4gY2VsbDtcbiAgfVxuICBpc0hlYWRlckNlbGxDaGVja2JveChjZWxsOiBIZWFkZXJDZWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YUNlbGwgPSBjZWxsLmNlbGwoKTtcbiAgICBpZiAoaXNUYWJsZVN1YmhlYWRlcihkYXRhQ2VsbCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIGRhdGFDZWxsLmRhdGFTb3VyY2UgPT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRhdGFDZWxsLmRhdGFTb3VyY2UudHlwZSA9PT0gJ2NoZWNrYm94JztcbiAgfVxuICBpc0hlYWRlckNlbGxTb3J0YWJsZShjZWxsOiBIZWFkZXJDZWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YUNlbGwgPSBjZWxsLmNlbGwoKTtcbiAgICBpZiAoaXNUYWJsZVN1YmhlYWRlcihkYXRhQ2VsbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZGF0YUNlbGwuc29ydGFibGUgPz8gZmFsc2U7XG4gIH1cblxuICByZWFkb25seSBzZWxlY3RlZFJvd3NDaGFuZ2VFdmVudCA9IG91dHB1dDxhbnlbXT4oeyBhbGlhczogJ3NlbGVjdGVkUm93c0NoYW5nZScgfSk7XG4gIHJlYWRvbmx5IGZhaWxlZFNlbGVjdFJvd0V2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnZmFpbGVkU2VsZWN0Um93JyB9KTtcbiAgcmVhZG9ubHkgc2VsZWN0Um93RXZlbnQgPSBvdXRwdXQ8YW55W10+KHsgYWxpYXM6ICdzZWxlY3RSb3cnIH0pO1xuICByZWFkb25seSB1bnNlbGVjdFJvd0V2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAndW5zZWxlY3RSb3cnIH0pO1xuICByZWFkb25seSBjbGlja1Jvd0V2ZW50ID0gb3V0cHV0PGFueT4oeyBhbGlhczogJ2NsaWNrUm93JyB9KTtcblxuICAvLyEgY29udGV4dHNcbiAgZ2V0SGVhZGVyQ29udGV4dChjZWxsOiBUYWJsZURhdGFDb2x1bW4sIGluZGV4OiBudW1iZXIpOiBUYWJsZUhlYWRlckNvbnRleHQgfCBudWxsO1xuICBnZXRIZWFkZXJDb250ZXh0KGNlbGw6IFRhYmxlU3ViaGVhZGVyLCBpbmRleDogbnVtYmVyKTogVGFibGVTdWJoZWFkZXJDb250ZXh0IHwgbnVsbDtcbiAgZ2V0SGVhZGVyQ29udGV4dChjZWxsOiBUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlciwgaW5kZXg6IG51bWJlcik6IFRhYmxlSGVhZGVyQ29udGV4dCB8IFRhYmxlU3ViaGVhZGVyQ29udGV4dCB8IG51bGw7XG4gIGdldEhlYWRlckNvbnRleHQoY2VsbDogVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIsIGluZGV4OiBudW1iZXIpOiBUYWJsZUhlYWRlckNvbnRleHQgfCBUYWJsZVN1YmhlYWRlckNvbnRleHQgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGNlbGwuaGVhZGVyICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgaWYgKGlzVGFibGVTdWJoZWFkZXIoY2VsbCkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkaW1wbGljaXQ6IGNlbGwuaGVhZGVyLFxuICAgICAgICBoZWFkZXI6IGNlbGwuaGVhZGVyLFxuICAgICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBjZWxsLmhlYWRlcixcbiAgICAgIGhlYWRlcjogY2VsbC5oZWFkZXIsXG4gICAgICBzb3J0YWJsZTogY2VsbC5zb3J0YWJsZSA/PyBmYWxzZSxcbiAgICAgIHNvcnRUeXBlOiB0aGlzLl9pdGVtU3RvcmFnZS5nZXRDb2x1bW5Tb3J0VHlwZShpbmRleCksXG4gICAgICBvblRyaWdnZXJTb3J0OiAoKSA9PiB0aGlzLl9pdGVtU3RvcmFnZS50b2dnbGVDdXJyZW50U29ydENvbHVtbihpbmRleCksXG4gICAgICBvblRyaWdnZXJSZXNldFNvcnQ6IChldmVudD86IEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1TdG9yYWdlLnJlc2V0U29ydCgpO1xuICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJlYWRvbmx5IGdldEhlYWRlckNoZWNrYm94Q29udGV4dCA9IGNvbXB1dGVkPFRhYmxlSGVhZGVyQ2hlY2tib3hDb250ZXh0PigoKSA9PiB7XG4gICAgbGV0IHN0YXRlOiBDaGVja2JveFN0YXRlID0gQ2hlY2tib3hTdGF0ZS5VbnNlbGVjdGVkO1xuICAgIGlmICh0aGlzLl9pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpKSB7XG4gICAgICBzdGF0ZSA9IENoZWNrYm94U3RhdGUuSW5kZXRlcm1pbmF0ZTtcbiAgICAgIGlmICh0aGlzLl9pdGVtU3RvcmFnZS5hcmVBbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgIHN0YXRlID0gQ2hlY2tib3hTdGF0ZS5TZWxlY3RlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogc3RhdGUsXG4gICAgICBzdGF0ZSxcbiAgICAgIG9uQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlQWxsUm93c1NlbGVjdGVkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xuICBnZXRDaGVja2JveENvbnRleHQoaW5kZXg6IG51bWJlcik6IFRhYmxlQ2hlY2tib3hDb250ZXh0IHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5faXRlbVN0b3JhZ2UuaXRlbXMoKS5maW5kKHYgPT4gdi5pbmRleCgpID09PSBpbmRleCkhO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaXRlbS5zZWxlY3RlZCgpO1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkLFxuICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLFxuICAgICAgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQoKSxcbiAgICAgIG9uQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMub25DaGVja2JveENsaWNrKGluZGV4KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiPHRhYmxlXG4gIGNsYXNzPVwiYXJkLXRhYmxlXCJcbiAgW25nQ2xhc3NdPVwibmdDbGFzc2VzKClcIlxuPlxuICBAaWYgKGNhcHRpb24oKSkge1xuICAgIDxjYXB0aW9uIGNsYXNzPVwiYXJkLXRhYmxlX19jYXB0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXJkLXRhYmxlX19jYXB0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjZGVmYXVsdENhcHRpb25UZW1wbGF0ZVxuICAgICAgICAgIGxldC1jYXB0aW9uVGV4dFxuICAgICAgICA+XG4gICAgICAgICAge3sgY2FwdGlvblRleHQgfX1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjYXB0aW9uVGVtcGxhdGUoKSA/PyBkZWZhdWx0Q2FwdGlvblRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNhcHRpb24oKSB9XCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvY2FwdGlvbj5cbiAgfVxuICA8dGhlYWQgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlclwiPlxuICAgIEBmb3IgKHJvdyBvZiBoZWFkZXJDZWxscygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDx0ciBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLXJvd1wiPlxuICAgICAgICBAZm9yIChjZWxsIG9mIHJvdzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNlbGxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY2VsbC5jZWxsKCkuY2VsbENsYXNzXCJcbiAgICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX2NoZWNrYm94LWNlbGxdPVwiaXNIZWFkZXJDZWxsQ2hlY2tib3goY2VsbClcIlxuICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4oKVwiXG4gICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbigpXCJcbiAgICAgICAgICAgIFtzY29wZV09XCJjZWxsLmNvbHNwYW4oKSA+IDEgPyAnY29sZ3JvdXAnIDogJ2NvbCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2NlbGwtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9fc29ydGFibGVdPVwiaXNIZWFkZXJDZWxsU29ydGFibGUoY2VsbClcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY2VsbC53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5taW5XaWR0aF09XCJjZWxsLm1pbldpZHRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGlmIChpc0hlYWRlckNlbGxDaGVja2JveChjZWxsKSkge1xuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2RlZmF1bHRIZWFkZXJDaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBsZXQtc3RhdGVcbiAgICAgICAgICAgICAgICAgIGxldC1vbkNoYW5nZT1cIm9uQ2hhbmdlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YXJkLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJpc0xvYWRpbmcoKSA/IC0xIDogdGFiSW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJnZXRIZWFkZXJDaGVja2JveENvbG9yKClcIlxuICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdGVkQ29sb3I9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJDaGVja2JveFRlbXBsYXRlKCkgPz8gZGVmYXVsdEhlYWRlckNoZWNrYm94VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEhlYWRlckNoZWNrYm94Q29udGV4dCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNkZWZhdWx0SGVhZGVyQ2VsbFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBsZXQtY29udGVudFxuICAgICAgICAgICAgICAgICAgbGV0LXNvcnRhYmxlPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgbGV0LXNvcnRUeXBlPVwic29ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgbGV0LW9uVHJpZ2dlclNvcnQ9XCJvblRyaWdnZXJTb3J0XCJcbiAgICAgICAgICAgICAgICAgIGxldC1vblRyaWdnZXJSZXNldFNvcnQ9XCJvblRyaWdnZXJSZXNldFNvcnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci10ZW1wbGF0ZS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLXNvcnRhYmxlXT1cInNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1ub25zb3J0YWJsZV09XCIhc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci1jb250ZW50LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25UcmlnZ2VyU29ydCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLkVzYyk9XCJvblRyaWdnZXJSZXNldFNvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNvbnRlbnRcIj57eyBjb250ZW50IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNvcnRUeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci1zb3J0LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNvcnRUeXBlID09PSAnYXNjZW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPnNvdXRoPC9hcmQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChzb3J0VHlwZSA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24+bm9ydGg8L2FyZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtdGFibGVfX2hlYWRlci1jb250ZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC10YWJsZV9faGVhZGVyLWNvbnRlbnRcIj57eyBjb250ZW50IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldEhlYWRlclRlbXBsYXRlKGNlbGwuY2VsbCgpLmhlYWRlcikgPz8gZGVmYXVsdEhlYWRlckNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SGVhZGVyQ29udGV4dChjZWxsLmNlbGwoKSwgJGluZGV4KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICB9XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keSBjbGFzcz1cImFyZC10YWJsZV9fYm9keVwiPlxuICAgIEBmb3IgKHJvdyBvZiBkYXRhUm93cygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIEBpZiAocm93LmlzRW1wdHkoKSkge1xuICAgICAgICA8dHIgY2xhc3M9XCJhcmQtdGFibGVfX2VtcHR5LXJvd1wiPlxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2VtcHR5LWNlbGxcIlxuICAgICAgICAgICAgY29sc3Bhbj1cIjk5OTlcIlxuICAgICAgICAgID48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0clxuICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19ib2R5LXJvd1wiXG4gICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9fc2VsZWN0ZWQtcm93XT1cInJvdy5zZWxlY3RlZCgpXCJcbiAgICAgICAgICBbY2xhc3MuYXJkLXRhYmxlX19oaWdobGlnaHRlZC1yb3ddPVwicm93LmhpZ2hsaWdodGVkKClcIlxuICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX2Rpc2FibGVkLXJvd109XCJyb3cuZGlzYWJsZWQoKVwiXG4gICAgICAgICAgW2NsYXNzLmFyZC10YWJsZV9fYm9sZC1yb3ddPVwicm93LmJvbGQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2socm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAobW91c2VvdmVyKT1cIm9uUm93TW91c2VPdmVyKCRldmVudClcIlxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uUm93TW91c2VFbnRlcihyb3cuaW5kZXgoKSwgJGV2ZW50KVwiXG4gICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25Sb3dNb3VzZUxlYXZlKHJvdy5pbmRleCgpLCAkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBmb3IgKGNlbGwgb2Ygcm93LmRhdGEoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGxUbXA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9fY2VsbC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJnZXRDZWxsU3R5bGUocm93LmRhdGFDb2x1bW5zKClbJGluZGV4XSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChpc0NlbGxDaGVja2JveChjZWxsKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICNkZWZhdWx0Q2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQtaXNDaGVja2VkXG4gICAgICAgICAgICAgICAgICAgIGxldC1vbkNoYW5nZT1cIm9uQ2hhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YXJkLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImlzTG9hZGluZygpID8gLTEgOiB0YWJJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiaXNDaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiY29sb3IoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoZWNrYm94VGVtcGxhdGUoKSA/PyBkZWZhdWx0Q2hlY2tib3hUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDaGVja2JveENvbnRleHQocm93LmluZGV4KCkpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgI2RlZmF1bHRDZWxsVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgbGV0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgY29udGVudCB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldENlbGxUZW1wbGF0ZShyb3cuZGF0YUNvbHVtbnMoKVskaW5kZXhdLnRlbXBsYXRlKSA/PyBkZWZhdWx0Q2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjZWxsIH1cIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIEBpZiAoIXJvdy5kYXRhQ29sdW1ucygpWyRpbmRleF0uaXNSb3dIZWFkZXIpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtdGFibGVfX2JvZHktY2VsbFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmRhdGFDb2x1bW5zKClbJGluZGV4XS5jZWxsQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX2NoZWNrYm94LWNlbGxdPVwiaXNDZWxsQ2hlY2tib3goY2VsbClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUbXBcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLXRhYmxlX19ib2R5LWNlbGwgYXJkLXRhYmxlX19yb3ctaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBzY29wZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmRhdGFDb2x1bW5zKClbJGluZGV4XS5jZWxsQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtdGFibGVfX2NoZWNrYm94LWNlbGxdPVwiaXNDZWxsQ2hlY2tib3goY2VsbClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUbXBcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIH1cbiAgICB9XG4gIDwvdGJvZHk+XG4gIEBpZiAoY2FuRGlzcGxheVBhZ2luYXRpb24oKSkge1xuICAgIDx0Zm9vdCBjbGFzcz1cImFyZC10YWJsZV9fZm9vdFwiPlxuICAgICAgPHRyIGNsYXNzPVwiYXJkLXRhYmxlX19mb290LXJvd1wiPlxuICAgICAgICA8dGRcbiAgICAgICAgICBjbGFzcz1cImFyZC10YWJsZV9fcGFnaW5hdGlvbi1jZWxsXCJcbiAgICAgICAgICBjb2xzcGFuPVwiOTk5OVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXJkLXRhYmxlLXBhZ2luYXRpb25cbiAgICAgICAgICAgIFtvcHRpb25zXT1cInBhZ2luYXRpb25PcHRpb25zKClcIlxuICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtcygpIVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnaW5hdGlvbkRpc2FibGVkKClcIlxuICAgICAgICAgICAgWyhpdGVtc1BlclBhZ2UpXT1cIml0ZW1zUGVyUGFnZVwiXG4gICAgICAgICAgICBbKHBhZ2UpXT1cInBhZ2VcIlxuICAgICAgICAgICAgW2FsaWduXT1cInBhZ2luYXRpb25BbGlnbigpXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nKClcIlxuICAgICAgICAgICAgW2l0ZW1zUGVyUGFnZVRleHRdPVwiaXRlbXNQZXJQYWdlVGV4dCgpXCJcbiAgICAgICAgICAgIFtjdXJyZW50SXRlbXNGb3JtYXRGbl09XCJjdXJyZW50SXRlbXNGb3JtYXRGbigpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L3Rmb290PlxuICB9XG48L3RhYmxlPlxuIl19