pdm-ui-kit 0.4.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/accordion/accordion.module.d.ts +8 -0
  2. package/accordion/index.d.ts +2 -0
  3. package/accordion/index.mjs +2 -0
  4. package/alert/alert.module.d.ts +9 -0
  5. package/alert/index.d.ts +3 -0
  6. package/alert/index.mjs +3 -0
  7. package/aspect-ratio/aspect-ratio.module.d.ts +8 -0
  8. package/aspect-ratio/index.d.ts +2 -0
  9. package/aspect-ratio/index.mjs +2 -0
  10. package/avatar/avatar.module.d.ts +8 -0
  11. package/avatar/index.d.ts +2 -0
  12. package/avatar/index.mjs +2 -0
  13. package/badge/badge.module.d.ts +8 -0
  14. package/badge/index.d.ts +2 -0
  15. package/badge/index.mjs +2 -0
  16. package/breadcrumb/breadcrumb.module.d.ts +8 -0
  17. package/breadcrumb/index.d.ts +2 -0
  18. package/breadcrumb/index.mjs +2 -0
  19. package/button/button.module.d.ts +9 -0
  20. package/button/index.d.ts +3 -0
  21. package/button/index.mjs +3 -0
  22. package/calendar/calendar.module.d.ts +11 -0
  23. package/{lib/components/date-picker → calendar}/date-picker.component.d.ts +1 -1
  24. package/calendar/index.d.ts +3 -0
  25. package/calendar/index.mjs +3 -0
  26. package/card/card.module.d.ts +8 -0
  27. package/card/index.d.ts +2 -0
  28. package/card/index.mjs +2 -0
  29. package/carousel/carousel.module.d.ts +8 -0
  30. package/carousel/index.d.ts +2 -0
  31. package/carousel/index.mjs +2 -0
  32. package/chart/chart.module.d.ts +8 -0
  33. package/chart/index.d.ts +2 -0
  34. package/chart/index.mjs +2 -0
  35. package/checkbox/checkbox.module.d.ts +8 -0
  36. package/checkbox/index.d.ts +2 -0
  37. package/checkbox/index.mjs +2 -0
  38. package/collapsible/collapsible.module.d.ts +8 -0
  39. package/collapsible/index.d.ts +2 -0
  40. package/collapsible/index.mjs +2 -0
  41. package/combobox/combobox.module.d.ts +9 -0
  42. package/combobox/index.d.ts +2 -0
  43. package/combobox/index.mjs +2 -0
  44. package/command/command.module.d.ts +9 -0
  45. package/command/index.d.ts +2 -0
  46. package/command/index.mjs +2 -0
  47. package/context-menu/context-menu.module.d.ts +9 -0
  48. package/context-menu/index.d.ts +2 -0
  49. package/context-menu/index.mjs +2 -0
  50. package/{lib/components/data-table → data-table}/data-table.component.d.ts +1 -1
  51. package/data-table/data-table.module.d.ts +10 -0
  52. package/{lib/components/draggable-table → data-table}/draggable-table.component.d.ts +2 -2
  53. package/data-table/index.d.ts +4 -0
  54. package/data-table/index.mjs +4 -0
  55. package/{lib/components/table → data-table}/table.component.d.ts +1 -1
  56. package/dialog/dialog.module.d.ts +8 -0
  57. package/dialog/index.d.ts +2 -0
  58. package/dialog/index.mjs +2 -0
  59. package/drawer/drawer.module.d.ts +10 -0
  60. package/drawer/index.d.ts +3 -0
  61. package/drawer/index.mjs +3 -0
  62. package/{lib/components/dropdown-menu → dropdown-menu}/dropdown-menu.component.d.ts +1 -1
  63. package/dropdown-menu/dropdown-menu.module.d.ts +9 -0
  64. package/dropdown-menu/index.d.ts +2 -0
  65. package/dropdown-menu/index.mjs +2 -0
  66. package/empty/empty.module.d.ts +10 -0
  67. package/empty/index.d.ts +2 -0
  68. package/empty/index.mjs +2 -0
  69. package/esm2020/{lib/components/accordion → accordion}/accordion.component.mjs +1 -1
  70. package/esm2020/accordion/accordion.module.mjs +21 -0
  71. package/esm2020/{lib/components/alert-dialog → alert}/alert-dialog.component.mjs +1 -1
  72. package/esm2020/{lib/components/alert → alert}/alert.component.mjs +1 -1
  73. package/esm2020/alert/alert.module.mjs +25 -0
  74. package/esm2020/{lib/components/aspect-ratio → aspect-ratio}/aspect-ratio.component.mjs +1 -1
  75. package/esm2020/aspect-ratio/aspect-ratio.module.mjs +21 -0
  76. package/esm2020/{lib/components/avatar → avatar}/avatar.component.mjs +1 -1
  77. package/esm2020/avatar/avatar.module.mjs +21 -0
  78. package/esm2020/{lib/components/badge → badge}/badge.component.mjs +1 -1
  79. package/esm2020/badge/badge.module.mjs +21 -0
  80. package/esm2020/{lib/components/breadcrumb → breadcrumb}/breadcrumb.component.mjs +1 -1
  81. package/esm2020/breadcrumb/breadcrumb.module.mjs +21 -0
  82. package/esm2020/button/button-group.component.mjs +236 -0
  83. package/esm2020/button/button.component.mjs +114 -0
  84. package/esm2020/button/button.module.mjs +25 -0
  85. package/esm2020/calendar/calendar.component.mjs +529 -0
  86. package/esm2020/calendar/calendar.module.mjs +22 -0
  87. package/esm2020/{lib/components/date-picker → calendar}/date-picker.component.mjs +6 -6
  88. package/esm2020/{lib/components/card → card}/card.component.mjs +1 -1
  89. package/esm2020/card/card.module.mjs +21 -0
  90. package/esm2020/carousel/carousel.component.mjs +102 -0
  91. package/esm2020/carousel/carousel.module.mjs +21 -0
  92. package/esm2020/{lib/components/chart → chart}/chart.component.mjs +1 -1
  93. package/esm2020/chart/chart.module.mjs +21 -0
  94. package/esm2020/{lib/components/checkbox → checkbox}/checkbox.component.mjs +1 -1
  95. package/esm2020/checkbox/checkbox.module.mjs +21 -0
  96. package/esm2020/{lib/components/collapsible → collapsible}/collapsible.component.mjs +1 -1
  97. package/esm2020/collapsible/collapsible.module.mjs +21 -0
  98. package/esm2020/combobox/combobox.component.mjs +173 -0
  99. package/esm2020/combobox/combobox.module.mjs +22 -0
  100. package/esm2020/command/command.component.mjs +75 -0
  101. package/esm2020/command/command.module.mjs +20 -0
  102. package/esm2020/context-menu/context-menu.component.mjs +165 -0
  103. package/esm2020/context-menu/context-menu.module.mjs +22 -0
  104. package/esm2020/data-table/data-table.component.mjs +299 -0
  105. package/esm2020/data-table/data-table.module.mjs +29 -0
  106. package/esm2020/data-table/draggable-table.component.mjs +300 -0
  107. package/esm2020/data-table/table.component.mjs +182 -0
  108. package/esm2020/{lib/components/dialog → dialog}/dialog.component.mjs +3 -3
  109. package/esm2020/dialog/dialog.module.mjs +21 -0
  110. package/esm2020/{lib/components/drawer → drawer}/drawer.component.mjs +2 -2
  111. package/esm2020/drawer/drawer.module.mjs +21 -0
  112. package/esm2020/drawer/sheet.component.mjs +116 -0
  113. package/esm2020/dropdown-menu/dropdown-menu.component.mjs +192 -0
  114. package/esm2020/dropdown-menu/dropdown-menu.module.mjs +22 -0
  115. package/esm2020/{lib/components/empty → empty}/empty.component.mjs +1 -1
  116. package/esm2020/empty/empty.module.mjs +21 -0
  117. package/esm2020/{lib/components/field → field}/field.component.mjs +1 -1
  118. package/esm2020/field/field.module.mjs +21 -0
  119. package/esm2020/hover-card/hover-card.component.mjs +205 -0
  120. package/esm2020/hover-card/hover-card.module.mjs +22 -0
  121. package/esm2020/icon/icon.component.mjs +144 -0
  122. package/esm2020/icon/icon.module.mjs +21 -0
  123. package/esm2020/{lib/components/input-group → input}/input-group.component.mjs +1 -1
  124. package/esm2020/input/input-otp.component.mjs +144 -0
  125. package/esm2020/{lib/components/input-password → input}/input-password.component.mjs +1 -1
  126. package/esm2020/{lib/components/input → input}/input.component.mjs +1 -1
  127. package/esm2020/input/input.module.mjs +38 -0
  128. package/esm2020/{lib/components/textarea → input}/textarea.component.mjs +1 -1
  129. package/esm2020/{lib/components/item → item}/item.component.mjs +1 -1
  130. package/esm2020/item/item.module.mjs +21 -0
  131. package/esm2020/{lib/components/kbd → kbd}/kbd.component.mjs +1 -1
  132. package/esm2020/kbd/kbd.module.mjs +21 -0
  133. package/esm2020/{lib/components/label → label}/label.component.mjs +1 -1
  134. package/esm2020/label/label.module.mjs +21 -0
  135. package/esm2020/menubar/menubar.component.mjs +144 -0
  136. package/esm2020/menubar/menubar.module.mjs +22 -0
  137. package/esm2020/{lib/components/native-select → native-select}/native-select.component.mjs +1 -1
  138. package/esm2020/native-select/native-select.module.mjs +20 -0
  139. package/esm2020/{lib/components/navigation-menu → navigation-menu}/navigation-menu.component.mjs +1 -1
  140. package/esm2020/navigation-menu/navigation-menu.module.mjs +21 -0
  141. package/esm2020/overlay/create-flexible-position-strategy.mjs +54 -0
  142. package/esm2020/overlay/pdm-outside-click.directive.mjs +86 -0
  143. package/esm2020/overlay/pdm-outside-click.module.mjs +18 -0
  144. package/esm2020/overlay/pdm-overlay-options.mjs +2 -0
  145. package/esm2020/overlay/z-index-helper.mjs +69 -0
  146. package/esm2020/{lib/components/pagination → pagination}/pagination.component.mjs +1 -1
  147. package/esm2020/pagination/pagination.module.mjs +21 -0
  148. package/esm2020/pdm-ui-kit.module.mjs +260 -0
  149. package/esm2020/popover/popover.component.mjs +162 -0
  150. package/esm2020/popover/popover.module.mjs +22 -0
  151. package/esm2020/{lib/components/progress → progress}/progress.component.mjs +1 -1
  152. package/esm2020/progress/progress.module.mjs +21 -0
  153. package/esm2020/public-api.mjs +117 -67
  154. package/esm2020/{lib/components/radio-group → radio-group}/radio-group.component.mjs +1 -1
  155. package/esm2020/radio-group/radio-group.module.mjs +21 -0
  156. package/esm2020/{lib/components/scroll-area → scroll-area}/scroll-area.component.mjs +1 -1
  157. package/esm2020/scroll-area/scroll-area.module.mjs +21 -0
  158. package/esm2020/select/select-option.directive.mjs +55 -0
  159. package/esm2020/select/select.component.mjs +164 -0
  160. package/esm2020/select/select.module.mjs +22 -0
  161. package/esm2020/{lib/components/separator → separator}/separator.component.mjs +1 -1
  162. package/esm2020/separator/separator.module.mjs +21 -0
  163. package/esm2020/{lib/components/sidebar → sidebar}/sidebar.component.mjs +1 -1
  164. package/esm2020/sidebar/sidebar.module.mjs +21 -0
  165. package/esm2020/{lib/components/skeleton → skeleton}/skeleton.component.mjs +1 -1
  166. package/esm2020/skeleton/skeleton.module.mjs +21 -0
  167. package/esm2020/{lib/components/slider → slider}/slider.component.mjs +1 -1
  168. package/esm2020/slider/slider.module.mjs +21 -0
  169. package/esm2020/{lib/components/sonner → sonner}/sonner.component.mjs +1 -1
  170. package/esm2020/sonner/sonner.module.mjs +20 -0
  171. package/esm2020/{lib/components/spinner → spinner}/spinner.component.mjs +1 -1
  172. package/esm2020/spinner/spinner.module.mjs +21 -0
  173. package/esm2020/switch/switch.component.mjs +58 -0
  174. package/esm2020/switch/switch.module.mjs +21 -0
  175. package/esm2020/{lib/components/tabs → tabs}/tabs.component.mjs +1 -1
  176. package/esm2020/tabs/tabs.module.mjs +21 -0
  177. package/esm2020/{lib/components/toggle-group → toggle}/toggle-group.component.mjs +1 -1
  178. package/esm2020/{lib/components/toggle → toggle}/toggle.component.mjs +1 -1
  179. package/esm2020/toggle/toggle.module.mjs +25 -0
  180. package/esm2020/tooltip/tooltip.component.mjs +176 -0
  181. package/esm2020/tooltip/tooltip.module.mjs +22 -0
  182. package/esm2020/utils/responsive.mjs +143 -0
  183. package/esm2020/utils/z-index.mjs +90 -0
  184. package/fesm2015/pdm-ui-kit.mjs +3333 -2493
  185. package/fesm2015/pdm-ui-kit.mjs.map +1 -1
  186. package/fesm2020/pdm-ui-kit.mjs +2669 -1829
  187. package/fesm2020/pdm-ui-kit.mjs.map +1 -1
  188. package/field/field.module.d.ts +8 -0
  189. package/field/index.d.ts +2 -0
  190. package/field/index.mjs +2 -0
  191. package/hover-card/hover-card.module.d.ts +9 -0
  192. package/hover-card/index.d.ts +2 -0
  193. package/hover-card/index.mjs +2 -0
  194. package/icon/icon.module.d.ts +8 -0
  195. package/icon/index.d.ts +2 -0
  196. package/icon/index.mjs +2 -0
  197. package/input/index.d.ts +6 -0
  198. package/input/index.mjs +6 -0
  199. package/input/input.module.d.ts +13 -0
  200. package/item/index.d.ts +2 -0
  201. package/item/index.mjs +2 -0
  202. package/item/item.module.d.ts +8 -0
  203. package/kbd/index.d.ts +2 -0
  204. package/kbd/index.mjs +2 -0
  205. package/kbd/kbd.module.d.ts +8 -0
  206. package/label/index.d.ts +2 -0
  207. package/label/index.mjs +2 -0
  208. package/label/label.module.d.ts +8 -0
  209. package/menubar/index.d.ts +2 -0
  210. package/menubar/index.mjs +2 -0
  211. package/menubar/menubar.module.d.ts +9 -0
  212. package/native-select/index.d.ts +2 -0
  213. package/native-select/index.mjs +2 -0
  214. package/native-select/native-select.module.d.ts +9 -0
  215. package/navigation-menu/index.d.ts +2 -0
  216. package/navigation-menu/index.mjs +2 -0
  217. package/navigation-menu/navigation-menu.module.d.ts +8 -0
  218. package/overlay/index.d.ts +8 -0
  219. package/overlay/index.mjs +8 -0
  220. package/overlay/pdm-outside-click.module.d.ts +8 -0
  221. package/package.json +198 -2
  222. package/pagination/index.d.ts +2 -0
  223. package/pagination/index.mjs +2 -0
  224. package/pagination/pagination.module.d.ts +10 -0
  225. package/pdm-ui-kit.module.d.ts +60 -0
  226. package/popover/index.d.ts +2 -0
  227. package/popover/index.mjs +2 -0
  228. package/popover/popover.module.d.ts +9 -0
  229. package/progress/index.d.ts +2 -0
  230. package/progress/index.mjs +2 -0
  231. package/progress/progress.module.d.ts +8 -0
  232. package/public-api.d.ts +114 -66
  233. package/radio-group/index.d.ts +2 -0
  234. package/radio-group/index.mjs +2 -0
  235. package/radio-group/radio-group.module.d.ts +8 -0
  236. package/scroll-area/index.d.ts +2 -0
  237. package/scroll-area/index.mjs +2 -0
  238. package/scroll-area/scroll-area.module.d.ts +8 -0
  239. package/select/index.d.ts +3 -0
  240. package/select/index.mjs +3 -0
  241. package/{lib/components/select → select}/select.component.d.ts +1 -1
  242. package/select/select.module.d.ts +11 -0
  243. package/separator/index.d.ts +2 -0
  244. package/separator/index.mjs +2 -0
  245. package/separator/separator.module.d.ts +8 -0
  246. package/sidebar/index.d.ts +2 -0
  247. package/sidebar/index.mjs +2 -0
  248. package/sidebar/sidebar.module.d.ts +8 -0
  249. package/skeleton/index.d.ts +2 -0
  250. package/skeleton/index.mjs +2 -0
  251. package/skeleton/skeleton.module.d.ts +8 -0
  252. package/slider/index.d.ts +2 -0
  253. package/slider/index.mjs +2 -0
  254. package/slider/slider.module.d.ts +8 -0
  255. package/sonner/index.d.ts +2 -0
  256. package/sonner/index.mjs +2 -0
  257. package/sonner/sonner.module.d.ts +9 -0
  258. package/spinner/index.d.ts +2 -0
  259. package/spinner/index.mjs +2 -0
  260. package/spinner/spinner.module.d.ts +8 -0
  261. package/switch/index.d.ts +2 -0
  262. package/switch/index.mjs +2 -0
  263. package/switch/switch.module.d.ts +8 -0
  264. package/tabs/index.d.ts +2 -0
  265. package/tabs/index.mjs +2 -0
  266. package/tabs/tabs.module.d.ts +8 -0
  267. package/toggle/index.d.ts +3 -0
  268. package/toggle/index.mjs +3 -0
  269. package/toggle/toggle.module.d.ts +9 -0
  270. package/tooltip/index.d.ts +2 -0
  271. package/tooltip/index.mjs +2 -0
  272. package/tooltip/tooltip.module.d.ts +9 -0
  273. package/utils/index.d.ts +3 -0
  274. package/utils/index.mjs +3 -0
  275. package/esm2020/lib/components/button/button.component.mjs +0 -114
  276. package/esm2020/lib/components/button-group/button-group.component.mjs +0 -236
  277. package/esm2020/lib/components/calendar/calendar.component.mjs +0 -529
  278. package/esm2020/lib/components/carousel/carousel.component.mjs +0 -102
  279. package/esm2020/lib/components/combobox/combobox.component.mjs +0 -173
  280. package/esm2020/lib/components/command/command.component.mjs +0 -75
  281. package/esm2020/lib/components/context-menu/context-menu.component.mjs +0 -165
  282. package/esm2020/lib/components/data-table/data-table.component.mjs +0 -299
  283. package/esm2020/lib/components/draggable-table/draggable-table.component.mjs +0 -300
  284. package/esm2020/lib/components/dropdown-menu/dropdown-menu.component.mjs +0 -192
  285. package/esm2020/lib/components/hover-card/hover-card.component.mjs +0 -205
  286. package/esm2020/lib/components/icon/icon.component.mjs +0 -144
  287. package/esm2020/lib/components/input-otp/input-otp.component.mjs +0 -144
  288. package/esm2020/lib/components/menubar/menubar.component.mjs +0 -144
  289. package/esm2020/lib/components/popover/popover.component.mjs +0 -162
  290. package/esm2020/lib/components/select/select-option.directive.mjs +0 -55
  291. package/esm2020/lib/components/select/select.component.mjs +0 -164
  292. package/esm2020/lib/components/sheet/sheet.component.mjs +0 -116
  293. package/esm2020/lib/components/switch/switch.component.mjs +0 -58
  294. package/esm2020/lib/components/table/table.component.mjs +0 -182
  295. package/esm2020/lib/components/tooltip/tooltip.component.mjs +0 -176
  296. package/esm2020/lib/overlay/create-flexible-position-strategy.mjs +0 -54
  297. package/esm2020/lib/overlay/pdm-outside-click.directive.mjs +0 -86
  298. package/esm2020/lib/overlay/pdm-overlay-options.mjs +0 -2
  299. package/esm2020/lib/overlay/z-index-helper.mjs +0 -69
  300. package/esm2020/lib/pdm-ui-kit.module.mjs +0 -258
  301. package/esm2020/lib/utils/responsive.mjs +0 -143
  302. package/esm2020/lib/utils/z-index.mjs +0 -90
  303. package/lib/pdm-ui-kit.module.d.ts +0 -68
  304. /package/{lib/components/accordion → accordion}/accordion.component.d.ts +0 -0
  305. /package/{lib/components/alert-dialog → alert}/alert-dialog.component.d.ts +0 -0
  306. /package/{lib/components/alert → alert}/alert.component.d.ts +0 -0
  307. /package/{lib/components/aspect-ratio → aspect-ratio}/aspect-ratio.component.d.ts +0 -0
  308. /package/{lib/components/avatar → avatar}/avatar.component.d.ts +0 -0
  309. /package/{lib/components/badge → badge}/badge.component.d.ts +0 -0
  310. /package/{lib/components/breadcrumb → breadcrumb}/breadcrumb.component.d.ts +0 -0
  311. /package/{lib/components/button-group → button}/button-group.component.d.ts +0 -0
  312. /package/{lib/components/button → button}/button.component.d.ts +0 -0
  313. /package/{lib/components/calendar → calendar}/calendar.component.d.ts +0 -0
  314. /package/{lib/components/card → card}/card.component.d.ts +0 -0
  315. /package/{lib/components/carousel → carousel}/carousel.component.d.ts +0 -0
  316. /package/{lib/components/chart → chart}/chart.component.d.ts +0 -0
  317. /package/{lib/components/checkbox → checkbox}/checkbox.component.d.ts +0 -0
  318. /package/{lib/components/collapsible → collapsible}/collapsible.component.d.ts +0 -0
  319. /package/{lib/components/combobox → combobox}/combobox.component.d.ts +0 -0
  320. /package/{lib/components/command → command}/command.component.d.ts +0 -0
  321. /package/{lib/components/context-menu → context-menu}/context-menu.component.d.ts +0 -0
  322. /package/{lib/components/dialog → dialog}/dialog.component.d.ts +0 -0
  323. /package/{lib/components/drawer → drawer}/drawer.component.d.ts +0 -0
  324. /package/{lib/components/sheet → drawer}/sheet.component.d.ts +0 -0
  325. /package/{lib/components/empty → empty}/empty.component.d.ts +0 -0
  326. /package/{lib/components/field → field}/field.component.d.ts +0 -0
  327. /package/{lib/components/hover-card → hover-card}/hover-card.component.d.ts +0 -0
  328. /package/{lib/components/icon → icon}/icon.component.d.ts +0 -0
  329. /package/{lib/components/input-group → input}/input-group.component.d.ts +0 -0
  330. /package/{lib/components/input-otp → input}/input-otp.component.d.ts +0 -0
  331. /package/{lib/components/input-password → input}/input-password.component.d.ts +0 -0
  332. /package/{lib/components/input → input}/input.component.d.ts +0 -0
  333. /package/{lib/components/textarea → input}/textarea.component.d.ts +0 -0
  334. /package/{lib/components/item → item}/item.component.d.ts +0 -0
  335. /package/{lib/components/kbd → kbd}/kbd.component.d.ts +0 -0
  336. /package/{lib/components/label → label}/label.component.d.ts +0 -0
  337. /package/{lib/components/menubar → menubar}/menubar.component.d.ts +0 -0
  338. /package/{lib/components/native-select → native-select}/native-select.component.d.ts +0 -0
  339. /package/{lib/components/navigation-menu → navigation-menu}/navigation-menu.component.d.ts +0 -0
  340. /package/{lib/overlay → overlay}/create-flexible-position-strategy.d.ts +0 -0
  341. /package/{lib/overlay → overlay}/pdm-outside-click.directive.d.ts +0 -0
  342. /package/{lib/overlay → overlay}/pdm-overlay-options.d.ts +0 -0
  343. /package/{lib/overlay → overlay}/z-index-helper.d.ts +0 -0
  344. /package/{lib/components/pagination → pagination}/pagination.component.d.ts +0 -0
  345. /package/{lib/components/popover → popover}/popover.component.d.ts +0 -0
  346. /package/{lib/components/progress → progress}/progress.component.d.ts +0 -0
  347. /package/{lib/components/radio-group → radio-group}/radio-group.component.d.ts +0 -0
  348. /package/{lib/components/scroll-area → scroll-area}/scroll-area.component.d.ts +0 -0
  349. /package/{lib/components/select → select}/select-option.directive.d.ts +0 -0
  350. /package/{lib/components/separator → separator}/separator.component.d.ts +0 -0
  351. /package/{lib/components/sidebar → sidebar}/sidebar.component.d.ts +0 -0
  352. /package/{lib/components/skeleton → skeleton}/skeleton.component.d.ts +0 -0
  353. /package/{lib/components/slider → slider}/slider.component.d.ts +0 -0
  354. /package/{lib/components/sonner → sonner}/sonner.component.d.ts +0 -0
  355. /package/{lib/components/spinner → spinner}/spinner.component.d.ts +0 -0
  356. /package/src/{lib/styles → styles}/tokens.css +0 -0
  357. /package/{lib/components/switch → switch}/switch.component.d.ts +0 -0
  358. /package/{lib/components/tabs → tabs}/tabs.component.d.ts +0 -0
  359. /package/{lib/components/toggle-group → toggle}/toggle-group.component.d.ts +0 -0
  360. /package/{lib/components/toggle → toggle}/toggle.component.d.ts +0 -0
  361. /package/{lib/components/tooltip → tooltip}/tooltip.component.d.ts +0 -0
  362. /package/{lib/utils → utils}/responsive.d.ts +0 -0
  363. /package/{lib/utils → utils}/z-index.d.ts +0 -0
@@ -0,0 +1,165 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, } from "@angular/core";
2
+ import { TemplatePortal } from "@angular/cdk/portal";
3
+ import { mergeOverlayPanelClass, OVERLAY_BASE_Z_INDEX, } from "../overlay/z-index-helper";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/overlay";
6
+ import * as i2 from "@angular/common";
7
+ export class PdmContextMenuComponent {
8
+ constructor(overlay, viewContainerRef, _elementRef, cdr) {
9
+ this.overlay = overlay;
10
+ this.viewContainerRef = viewContainerRef;
11
+ this._elementRef = _elementRef;
12
+ this.cdr = cdr;
13
+ this.items = [
14
+ { type: "item", label: "Back", value: "back", inset: true, shortcut: "⌘[" },
15
+ {
16
+ type: "item",
17
+ label: "Forward",
18
+ value: "forward",
19
+ inset: true,
20
+ shortcut: "⌘]",
21
+ disabled: true,
22
+ },
23
+ {
24
+ type: "item",
25
+ label: "Reload",
26
+ value: "reload",
27
+ inset: true,
28
+ shortcut: "⌘R",
29
+ },
30
+ {
31
+ type: "item",
32
+ label: "More Tools",
33
+ value: "more-tools",
34
+ inset: true,
35
+ showChevron: true,
36
+ },
37
+ { type: "separator" },
38
+ {
39
+ type: "item",
40
+ label: "Show Bookmarks Bar",
41
+ value: "show-bookmarks",
42
+ checked: true,
43
+ },
44
+ { type: "item", label: "Show Full URLs", value: "show-urls", inset: true },
45
+ { type: "separator" },
46
+ { type: "label", label: "People" },
47
+ { type: "separator" },
48
+ { type: "item", label: "Pedro Duarte", value: "pedro", selectedDot: true },
49
+ { type: "item", label: "Colm Tuite", value: "colm", inset: true },
50
+ ];
51
+ this.className = "";
52
+ this.triggerLabel = "Right click here";
53
+ this.width = 300;
54
+ this.height = 150;
55
+ this.panelClassName = "";
56
+ this.itemSelect = new EventEmitter();
57
+ this.open = false;
58
+ this.x = 0;
59
+ this.y = 0;
60
+ this.overlayRef = null;
61
+ this.outsideClickSub = null;
62
+ }
63
+ ngOnInit() { }
64
+ ngOnDestroy() {
65
+ this.destroyOverlay();
66
+ }
67
+ onContextMenu(event) {
68
+ event.preventDefault();
69
+ event.stopPropagation();
70
+ this.x = event.clientX;
71
+ this.y = event.clientY;
72
+ this.open = true;
73
+ this.cdr.markForCheck();
74
+ this.createOverlay();
75
+ }
76
+ select(item) {
77
+ if (item.disabled ||
78
+ item.type === "separator" ||
79
+ item.type === "label" ||
80
+ !item.value)
81
+ return;
82
+ this.itemSelect.emit(item.value);
83
+ this.open = false;
84
+ this.cdr.markForCheck();
85
+ this.destroyOverlay();
86
+ }
87
+ onDocumentClick(event) {
88
+ if (this.open && event.type === "click") {
89
+ // Don't close on click inside the menu
90
+ if (this.overlayRef &&
91
+ this.overlayRef.overlayElement.contains(event.target)) {
92
+ return;
93
+ }
94
+ this.close();
95
+ }
96
+ }
97
+ createOverlay() {
98
+ this.destroyOverlay();
99
+ // Create global position strategy at cursor position
100
+ const positionStrategy = this.overlay
101
+ .position()
102
+ .global()
103
+ .left(`${this.x}px`)
104
+ .top(`${this.y}px`);
105
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
106
+ this.overlayRef = this.overlay.create({
107
+ positionStrategy,
108
+ panelClass,
109
+ });
110
+ const portal = new TemplatePortal(this.menuTemplateRef, this.viewContainerRef);
111
+ this.overlayRef.attach(portal);
112
+ // Close on click outside
113
+ this.outsideClickSub = this.overlayRef
114
+ .outsidePointerEvents()
115
+ .subscribe(() => {
116
+ this.close();
117
+ });
118
+ }
119
+ close() {
120
+ this.open = false;
121
+ this.cdr.markForCheck();
122
+ this.destroyOverlay();
123
+ }
124
+ destroyOverlay() {
125
+ if (this.outsideClickSub) {
126
+ this.outsideClickSub.unsubscribe();
127
+ this.outsideClickSub = null;
128
+ }
129
+ if (this.overlayRef) {
130
+ this.overlayRef.detach();
131
+ this.overlayRef.dispose();
132
+ this.overlayRef = null;
133
+ }
134
+ }
135
+ }
136
+ PdmContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
137
+ PdmContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmContextMenuComponent, selector: "pdm-context-menu", inputs: { items: "items", className: "className", triggerLabel: "triggerLabel", width: "width", height: "height", panelClassName: "panelClassName" }, outputs: { itemSelect: "itemSelect" }, host: { listeners: { "document:keydown.escape": "onDocumentClick()", "document:click": "onDocumentClick()" } }, viewQueries: [{ propertyName: "menuTemplateRef", first: true, predicate: ["menuTemplate"], descendants: true }], ngImport: i0, template: "<div\n class=\"relative\"\n [ngClass]=\"className\"\n (contextmenu)=\"onContextMenu($event)\"\n>\n <div\n class=\"flex items-center justify-center rounded-md border border-solid border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-48 max-w-xs rounded-md border border-solid border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div\n *ngIf=\"item.type === 'separator'\"\n class=\"-mx-1 my-1 h-px bg-muted\"\n ></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n class=\"px-2 py-1.5 text-sm font-semibold text-foreground\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none box-border cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span\n class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\"\n >\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n <span\n *ngIf=\"item.selectedDot\"\n class=\"h-2 w-2 rounded-full bg-foreground\"\n ></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{\n item.label\n }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{\n item.shortcut\n }}</span>\n <svg\n *ngIf=\"item.showChevron\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
138
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuComponent, decorators: [{
139
+ type: Component,
140
+ args: [{ selector: "pdm-context-menu", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"relative\"\n [ngClass]=\"className\"\n (contextmenu)=\"onContextMenu($event)\"\n>\n <div\n class=\"flex items-center justify-center rounded-md border border-solid border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-48 max-w-xs rounded-md border border-solid border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div\n *ngIf=\"item.type === 'separator'\"\n class=\"-mx-1 my-1 h-px bg-muted\"\n ></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n class=\"px-2 py-1.5 text-sm font-semibold text-foreground\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none box-border cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span\n class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\"\n >\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n <span\n *ngIf=\"item.selectedDot\"\n class=\"h-2 w-2 rounded-full bg-foreground\"\n ></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{\n item.label\n }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{\n item.shortcut\n }}</span>\n <svg\n *ngIf=\"item.showChevron\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"] }]
141
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { items: [{
142
+ type: Input
143
+ }], className: [{
144
+ type: Input
145
+ }], triggerLabel: [{
146
+ type: Input
147
+ }], width: [{
148
+ type: Input
149
+ }], height: [{
150
+ type: Input
151
+ }], panelClassName: [{
152
+ type: Input
153
+ }], itemSelect: [{
154
+ type: Output
155
+ }], menuTemplateRef: [{
156
+ type: ViewChild,
157
+ args: ["menuTemplate"]
158
+ }], onDocumentClick: [{
159
+ type: HostListener,
160
+ args: ["document:keydown.escape"]
161
+ }, {
162
+ type: HostListener,
163
+ args: ["document:click"]
164
+ }] } });
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsb0JBQW9CLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFjbkMsTUFBTSxPQUFPLHVCQUF1QjtJQXdEbkMsWUFDa0IsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFdBQW9DLEVBQ3BDLEdBQXNCO1FBSHRCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzRC9CLFVBQUssR0FBeUI7WUFDdEMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDM0U7Z0JBQ0MsSUFBSSxFQUFFLE1BQU07Z0JBQ1osS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEtBQUssRUFBRSxTQUFTO2dCQUNoQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxRQUFRLEVBQUUsSUFBSTthQUNkO1lBQ0Q7Z0JBQ0MsSUFBSSxF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QUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLGNBQWM7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO0lBQ0YsQ0FBQzs7b0hBL0pXLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLHNkQ2pDcEMsd3dHQTBGQTsyRkR6RGEsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNDLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNO3NMQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBc0NHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFNb0IsZUFBZTtzQkFBekMsU0FBUzt1QkFBQyxjQUFjO2dCQTZDekIsZUFBZTtzQkFGZCxZQUFZO3VCQUFDLHlCQUF5Qjs7c0JBQ3RDLFlBQVk7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENoYW5nZURldGVjdG9yUmVmLFxuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdExpc3RlbmVyLFxuXHRJbnB1dCxcblx0T25EZXN0cm95LFxuXHRPbkluaXQsXG5cdE91dHB1dCxcblx0Vmlld0NoaWxkLFxuXHRWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3BvcnRhbFwiO1xuaW1wb3J0IHtcblx0bWVyZ2VPdmVybGF5UGFuZWxDbGFzcyxcblx0T1ZFUkxBWV9CQVNFX1pfSU5ERVgsXG59IGZyb20gXCIuLi9vdmVybGF5L3otaW5kZXgtaGVscGVyXCI7XG5pbXBvcnQgeyBQZG1NZW51SXRlbSB9IGZyb20gXCIuLi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGRtQ29udGV4dE1lbnVJdGVtIGV4dGVuZHMgUGRtTWVudUl0ZW0ge1xuXHRjaGVja2VkPzogYm9vbGVhbjtcblx0c2VsZWN0ZWREb3Q/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwicGRtLWNvbnRleHQtbWVudVwiLFxuXHR0ZW1wbGF0ZVVybDogXCIuL2NvbnRleHQtbWVudS5jb21wb25lbnQuaHRtbFwiLFxuXHRzdHlsZXM6IFtcIjpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cIl0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQZG1Db250ZXh0TWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblx0QElucHV0KCkgaXRlbXM6IFBkbUNvbnRleHRNZW51SXRlbVtdID0gW1xuXHRcdHsgdHlwZTogXCJpdGVtXCIsIGxhYmVsOiBcIkJhY2tcIiwgdmFsdWU6IFwiYmFja1wiLCBpbnNldDogdHJ1ZSwgc2hvcnRjdXQ6IFwi4oyYW1wiIH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJpdGVtXCIsXG5cdFx0XHRsYWJlbDogXCJGb3J3YXJkXCIsXG5cdFx0XHR2YWx1ZTogXCJmb3J3YXJkXCIsXG5cdFx0XHRpbnNldDogdHJ1ZSxcblx0XHRcdHNob3J0Y3V0OiBcIuKMmF1cIixcblx0XHRcdGRpc2FibGVkOiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJpdGVtXCIsXG5cdFx0XHRsYWJlbDogXCJSZWxvYWRcIixcblx0XHRcdHZhbHVlOiBcInJlbG9hZFwiLFxuXHRcdFx0aW5zZXQ6IHRydWUsXG5cdFx0XHRzaG9ydGN1dDogXCLijJhSXCIsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIml0ZW1cIixcblx0XHRcdGxhYmVsOiBcIk1vcmUgVG9vbHNcIixcblx0XHRcdHZhbHVlOiBcIm1vcmUtdG9vbHNcIixcblx0XHRcdGluc2V0OiB0cnVlLFxuXHRcdFx0c2hvd0NoZXZyb246IHRydWUsXG5cdFx0fSxcblx0XHR7IHR5cGU6IFwic2VwYXJhdG9yXCIgfSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIml0ZW1cIixcblx0XHRcdGxhYmVsOiBcIlNob3cgQm9va21hcmtzIEJhclwiLFxuXHRcdFx0dmFsdWU6IFwic2hvdy1ib29rbWFya3NcIixcblx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0fSxcblx0XHR7IHR5cGU6IFwiaXRlbVwiLCBsYWJlbDogXCJTaG93IEZ1bGwgVVJMc1wiLCB2YWx1ZTogXCJzaG93LXVybHNcIiwgaW5zZXQ6IHRydWUgfSxcblx0XHR7IHR5cGU6IFwic2VwYXJhdG9yXCIgfSxcblx0XHR7IHR5cGU6IFwibGFiZWxcIiwgbGFiZWw6IFwiUGVvcGxlXCIgfSxcblx0XHR7IHR5cGU6IFwic2VwYXJhdG9yXCIgfSxcblx0XHR7IHR5cGU6IFwiaXRlbVwiLCBsYWJlbDogXCJQZWRybyBEdWFydGVcIiwgdmFsdWU6IFwicGVkcm9cIiwgc2VsZWN0ZWREb3Q6IHRydWUgfSxcblx0XHR7IHR5cGU6IFwiaXRlbVwiLCBsYWJlbDogXCJDb2xtIFR1aXRlXCIsIHZhbHVlOiBcImNvbG1cIiwgaW5zZXQ6IHRydWUgfSxcblx0XTtcblx0QElucHV0KCkgY2xhc3NOYW1lID0gXCJcIjtcblx0QElucHV0KCkgdHJpZ2dlckxhYmVsID0gXCJSaWdodCBjbGljayBoZXJlXCI7XG5cdEBJbnB1dCgpIHdpZHRoID0gMzAwO1xuXHRASW5wdXQoKSBoZWlnaHQgPSAxNTA7XG5cdEBJbnB1dCgpIHBhbmVsQ2xhc3NOYW1lID0gXCJcIjtcblxuXHRAT3V0cHV0KCkgaXRlbVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG5cdG9wZW4gPSBmYWxzZTtcblx0eCA9IDA7XG5cdHkgPSAwO1xuXG5cdEBWaWV3Q2hpbGQoXCJtZW51VGVtcGxhdGVcIikgbWVudVRlbXBsYXRlUmVmOiBhbnk7XG5cblx0cHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgb3V0c2lkZUNsaWNrU3ViOiBhbnkgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSxcblx0XHRwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG5cdFx0cHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuXHQpIHt9XG5cblx0bmdPbkluaXQoKTogdm9pZCB7fVxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLmRlc3Ryb3lPdmVybGF5KCk7XG5cdH1cblxuXHRvbkNvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMueCA9IGV2ZW50LmNsaWVudFg7XG5cdFx0dGhpcy55ID0gZXZlbnQuY2xpZW50WTtcblx0XHR0aGlzLm9wZW4gPSB0cnVlO1xuXHRcdHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG5cdFx0dGhpcy5jcmVhdGVPdmVybGF5KCk7XG5cdH1cblxuXHRzZWxlY3QoaXRlbTogUGRtQ29udGV4dE1lbnVJdGVtKTogdm9pZCB7XG5cdFx0aWYgKFxuXHRcdFx0aXRlbS5kaXNhYmxlZCB8fFxuXHRcdFx0aXRlbS50eXBlID09PSBcInNlcGFyYXRvclwiIHx8XG5cdFx0XHRpdGVtLnR5cGUgPT09IFwibGFiZWxcIiB8fFxuXHRcdFx0IWl0ZW0udmFsdWVcblx0XHQpXG5cdFx0XHRyZXR1cm47XG5cdFx0dGhpcy5pdGVtU2VsZWN0LmVtaXQoaXRlbS52YWx1ZSk7XG5cdFx0dGhpcy5vcGVuID0gZmFsc2U7XG5cdFx0dGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cdFx0dGhpcy5kZXN0cm95T3ZlcmxheSgpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmtleWRvd24uZXNjYXBlXCIpXG5cdEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiKVxuXHRvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vcGVuICYmIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIikge1xuXHRcdFx0Ly8gRG9uJ3QgY2xvc2Ugb24gY2xpY2sgaW5zaWRlIHRoZSBtZW51XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMub3ZlcmxheVJlZiAmJlxuXHRcdFx0XHR0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcblx0XHR0aGlzLmRlc3Ryb3lPdmVybGF5KCk7XG5cblx0XHQvLyBDcmVhdGUgZ2xvYmFsIHBvc2l0aW9uIHN0cmF0ZWd5IGF0IGN1cnNvciBwb3NpdGlvblxuXHRcdGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcblx0XHRcdC5wb3NpdGlvbigpXG5cdFx0XHQuZ2xvYmFsKClcblx0XHRcdC5sZWZ0KGAke3RoaXMueH1weGApXG5cdFx0XHQudG9wKGAke3RoaXMueX1weGApO1xuXG5cdFx0Y29uc3QgcGFuZWxDbGFzcyA9IG1lcmdlT3ZlcmxheVBhbmVsQ2xhc3MoXG5cdFx0XHRPVkVSTEFZX0JBU0VfWl9JTkRFWCxcblx0XHRcdHRoaXMucGFuZWxDbGFzc05hbWUsXG5cdFx0KTtcblxuXHRcdHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuXHRcdFx0cG9zaXRpb25TdHJhdGVneSxcblx0XHRcdHBhbmVsQ2xhc3MsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwoXG5cdFx0XHR0aGlzLm1lbnVUZW1wbGF0ZVJlZixcblx0XHRcdHRoaXMudmlld0NvbnRhaW5lclJlZixcblx0XHQpO1xuXHRcdHRoaXMub3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcblxuXHRcdC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGVcblx0XHR0aGlzLm91dHNpZGVDbGlja1N1YiA9IHRoaXMub3ZlcmxheVJlZlxuXHRcdFx0Lm91dHNpZGVQb2ludGVyRXZlbnRzKClcblx0XHRcdC5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgY2xvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5vcGVuID0gZmFsc2U7XG5cdFx0dGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cdFx0dGhpcy5kZXN0cm95T3ZlcmxheSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBkZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vdXRzaWRlQ2xpY2tTdWIpIHtcblx0XHRcdHRoaXMub3V0c2lkZUNsaWNrU3ViLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHR0aGlzLm91dHNpZGVDbGlja1N1YiA9IG51bGw7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcblx0XHRcdHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcblx0XHRcdHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG5cdFx0XHR0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xuXHRcdH1cblx0fVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInJlbGF0aXZlXCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50KVwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZGFzaGVkIGJvcmRlci1ib3JkZXJcIlxuICAgIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHRcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IHRyaWdnZXJMYWJlbCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUZW1wbGF0ZSBmb3IgQ0RLIE92ZXJsYXkgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjbWVudVRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibWluLXctNDggbWF4LXcteHMgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBwLTEgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kIHNtOm1pbi13LTUyXCJcbiAgICA+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdzZXBhcmF0b3InXCJcbiAgICAgICAgICAgIGNsYXNzPVwiLW14LTEgbXktMSBoLXB4IGJnLW11dGVkXCJcbiAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2xhYmVsJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMS41IHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW0udHlwZSB8fCBpdGVtLnR5cGUgPT09ICdpdGVtJ1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgYXBwZWFyYW5jZS1ub25lIGJveC1ib3JkZXIgY3Vyc29yLWRlZmF1bHQgc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcHktMS41IHByLTIgdGV4dC1sZWZ0IHRleHQtc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6YmctYWNjZW50IGZvY3VzLXZpc2libGU6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5pbnNldCA/ICdwbC04JyA6ICdweC0yJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0KGl0ZW0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cIm1yLTIgaW5saW5lLWZsZXggdy00IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC0zLjUgdy0zLjVcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBkPVwiTTUgMTIuNUw5LjIgMTYuN0wxOSA3XCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjhcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnNlbGVjdGVkRG90XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW4tdy0wIGZsZXgtMSB0cnVuY2F0ZSB0ZXh0LWZvcmVncm91bmRcIj57e1xuICAgICAgICAgICAgICBpdGVtLmxhYmVsXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5zaG9ydGN1dFwiIGNsYXNzPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57e1xuICAgICAgICAgICAgICBpdGVtLnNob3J0Y3V0XG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnNob3dDaGV2cm9uXCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC0zLjUgdy0zLjUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTkgNkwxNSAxMkw5IDE4XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { OverlayModule } from '@angular/cdk/overlay';
4
+ import { PdmContextMenuComponent } from './context-menu.component';
5
+ import * as i0 from "@angular/core";
6
+ const COMPONENTS = [
7
+ PdmContextMenuComponent,
8
+ ];
9
+ export class PdmContextMenuModule {
10
+ }
11
+ PdmContextMenuModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ PdmContextMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuModule, declarations: [PdmContextMenuComponent], imports: [CommonModule, OverlayModule], exports: [PdmContextMenuComponent] });
13
+ PdmContextMenuModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuModule, imports: [CommonModule, OverlayModule] });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuModule, decorators: [{
15
+ type: NgModule,
16
+ args: [{
17
+ imports: [CommonModule, OverlayModule],
18
+ declarations: COMPONENTS,
19
+ exports: COMPONENTS
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRW5FLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLHVCQUF1QjtDQUN4QixDQUFDO0FBT0YsTUFBTSxPQUFPLG9CQUFvQjs7aUhBQXBCLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGlCQVIvQix1QkFBdUIsYUFJYixZQUFZLEVBQUUsYUFBYSxhQUpyQyx1QkFBdUI7a0hBUVosb0JBQW9CLFlBSnJCLFlBQVksRUFBRSxhQUFhOzJGQUkxQixvQkFBb0I7a0JBTGhDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztvQkFDdEMsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLE9BQU8sRUFBRSxVQUFVO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBkbUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0LW1lbnUuY29tcG9uZW50JztcblxuY29uc3QgQ09NUE9ORU5UUyA9IFtcbiAgUGRtQ29udGV4dE1lbnVDb21wb25lbnQsXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBPdmVybGF5TW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBDT01QT05FTlRTLFxuICBleHBvcnRzOiBDT01QT05FTlRTXG59KVxuZXhwb3J0IGNsYXNzIFBkbUNvbnRleHRNZW51TW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,299 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "./table.component";
5
+ /**
6
+ * Data-table genérico con paginación, filtrado y selección
7
+ *
8
+ * NUEVO: Ahora es genérico y configurable via columnas
9
+ *
10
+ * @example
11
+ * // Definir columnas
12
+ * columns: PdmDataTableColumn<User>[] = [
13
+ * { key: 'name', label: 'Name', sortable: true },
14
+ * { key: 'email', label: 'Email', sortable: true },
15
+ * { key: 'role', label: 'Role', hideOnMobile: true },
16
+ * { key: 'createdAt', label: 'Created', render: (val) => formatDate(val) }
17
+ * ];
18
+ *
19
+ * // En el template
20
+ * <pdm-data-table
21
+ * [columns]="columns"
22
+ * [rows]="users"
23
+ * [selectable]="true"
24
+ * (selectionChange)="onSelect($event)">
25
+ * </pdm-data-table>
26
+ */
27
+ export class PdmDataTableComponent {
28
+ constructor() {
29
+ this.className = '';
30
+ /**
31
+ * Columnas a mostrar
32
+ * Si no se provee, intenta inferir del primer row (legacy mode)
33
+ */
34
+ this.columns = [];
35
+ /**
36
+ * Estrategia responsive de la tabla
37
+ */
38
+ this.responsiveStrategy = 'scroll';
39
+ /**
40
+ * Si es true, muestra checkbox de selección en cada fila
41
+ */
42
+ this.selectable = false;
43
+ /**
44
+ * Si es true, muestra botón de acciones (tres puntos) en cada fila
45
+ */
46
+ this.showActions = false;
47
+ /**
48
+ * Si es true, muestra filtro de búsqueda
49
+ */
50
+ this.showFilter = true;
51
+ /**
52
+ * Si es true, muestra controles de paginación
53
+ */
54
+ this.showPagination = true;
55
+ /**
56
+ * Si es true, muestra selector de columnas
57
+ */
58
+ this.showColumnSelector = false;
59
+ // Labels i18n
60
+ this.filterPlaceholder = 'Filter...';
61
+ this.columnsLabel = 'Columns';
62
+ this.previousLabel = 'Previous';
63
+ this.nextLabel = 'Next';
64
+ this.emptyLabel = 'No results.';
65
+ this.rowsSelectedLabel = 'row(s) selected';
66
+ // DEPRECATED: Labels hardcodeados para backward compatibility
67
+ /**
68
+ * @deprecated Use columns configuration instead
69
+ */
70
+ this.statusLabel = 'Status';
71
+ /**
72
+ * @deprecated Use columns configuration instead
73
+ */
74
+ this.emailLabel = 'Email';
75
+ /**
76
+ * @deprecated Use columns configuration instead
77
+ */
78
+ this.amountLabel = 'Amount';
79
+ /**
80
+ * Datos a mostrar
81
+ */
82
+ this.rows = [];
83
+ /**
84
+ * Página actual (1-indexed)
85
+ */
86
+ this.page = 1;
87
+ /**
88
+ * Cantidad de filas por página
89
+ */
90
+ this.pageSize = 10;
91
+ /**
92
+ * Query de filtrado
93
+ */
94
+ this.query = '';
95
+ this.queryChange = new EventEmitter();
96
+ this.rowAction = new EventEmitter();
97
+ this.pageChange = new EventEmitter();
98
+ this.selectionChange = new EventEmitter();
99
+ this.columnSort = new EventEmitter();
100
+ // Estado interno
101
+ this.selectedRows = new Set();
102
+ this.sortDirection = 'asc';
103
+ }
104
+ /**
105
+ * Backward compatibility: si no hay columnas definidas, inferir del primer row
106
+ */
107
+ get effectiveColumns() {
108
+ if (this.columns.length > 0) {
109
+ return this.columns;
110
+ }
111
+ // Legacy mode: inferir columnas del primer row (solo para PdmDataTableRow)
112
+ if (this.rows.length > 0) {
113
+ const firstRow = this.rows[0];
114
+ return Object.keys(firstRow)
115
+ .filter(key => key !== 'selected')
116
+ .map(key => ({
117
+ key: key,
118
+ label: this.getLegacyLabel(key),
119
+ align: key === 'amount' ? 'right' : 'left'
120
+ }));
121
+ }
122
+ return [];
123
+ }
124
+ /**
125
+ * LEGACY: mapeo de keys a labels hardcodeados
126
+ */
127
+ getLegacyLabel(key) {
128
+ const map = {
129
+ status: this.statusLabel,
130
+ email: this.emailLabel,
131
+ amount: this.amountLabel
132
+ };
133
+ return map[key] || key.charAt(0).toUpperCase() + key.slice(1);
134
+ }
135
+ get filteredRows() {
136
+ const q = this.query.trim().toLowerCase();
137
+ if (!q)
138
+ return this.rows;
139
+ if (this.filterFn) {
140
+ return this.rows.filter(row => this.filterFn(row, q));
141
+ }
142
+ // Filtrado default: buscar en todos los campos string
143
+ return this.rows.filter(row => {
144
+ return Object.values(row).some(val => typeof val === 'string' && val.toLowerCase().includes(q));
145
+ });
146
+ }
147
+ get pagedRows() {
148
+ const start = (this.page - 1) * this.pageSize;
149
+ return this.filteredRows.slice(start, start + this.pageSize);
150
+ }
151
+ get totalPages() {
152
+ return Math.max(1, Math.ceil(this.filteredRows.length / this.pageSize));
153
+ }
154
+ get selectedCount() {
155
+ return this.selectedRows.size;
156
+ }
157
+ onQueryInput(event) {
158
+ const value = event.target.value;
159
+ this.queryChange.emit(value);
160
+ }
161
+ onToggleRow(row, event) {
162
+ const checked = event.target.checked;
163
+ if (checked) {
164
+ this.selectedRows.add(row);
165
+ }
166
+ else {
167
+ this.selectedRows.delete(row);
168
+ }
169
+ this.selectionChange.emit({ row, selected: checked });
170
+ }
171
+ onToggleAll(event) {
172
+ const checked = event.target.checked;
173
+ if (checked) {
174
+ this.pagedRows.forEach(row => this.selectedRows.add(row));
175
+ }
176
+ else {
177
+ this.pagedRows.forEach(row => this.selectedRows.delete(row));
178
+ }
179
+ }
180
+ isSelected(row) {
181
+ return this.selectedRows.has(row);
182
+ }
183
+ previous() {
184
+ if (this.page <= 1)
185
+ return;
186
+ this.pageChange.emit(this.page - 1);
187
+ }
188
+ next() {
189
+ if (this.page >= this.totalPages)
190
+ return;
191
+ this.pageChange.emit(this.page + 1);
192
+ }
193
+ onAction(row) {
194
+ this.rowAction.emit(row);
195
+ }
196
+ onSort(column) {
197
+ if (!column.sortable)
198
+ return;
199
+ if (this.sortColumn === column) {
200
+ this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
201
+ }
202
+ else {
203
+ this.sortColumn = column;
204
+ this.sortDirection = 'asc';
205
+ }
206
+ this.columnSort.emit({ column, direction: this.sortDirection });
207
+ }
208
+ getCellValue(row, column) {
209
+ const value = row[column.key];
210
+ if (column.render) {
211
+ return column.render(value, row);
212
+ }
213
+ return value != null ? String(value) : '';
214
+ }
215
+ getCellClass(column) {
216
+ const classes = ['px-2', 'py-2'];
217
+ if (column.align === 'center')
218
+ classes.push('text-center');
219
+ if (column.align === 'right')
220
+ classes.push('text-right');
221
+ if (column.hideOnMobile)
222
+ classes.push('hidden', 'md:table-cell');
223
+ if (column.cellClass)
224
+ classes.push(column.cellClass);
225
+ return classes.join(' ');
226
+ }
227
+ getHeaderClass(column) {
228
+ const classes = ['px-2', 'py-2', 'text-left', 'font-medium'];
229
+ if (column.hideOnMobile)
230
+ classes.push('hidden', 'md:table-cell');
231
+ if (column.headerClass)
232
+ classes.push(column.headerClass);
233
+ return classes.join(' ');
234
+ }
235
+ getColumnStyle(column) {
236
+ return column.width ? { width: column.width } : {};
237
+ }
238
+ }
239
+ PdmDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
240
+ PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", columns: "columns", responsiveStrategy: "responsiveStrategy", selectable: "selectable", showActions: "showActions", showFilter: "showFilter", showPagination: "showPagination", showColumnSelector: "showColumnSelector", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", previousLabel: "previousLabel", nextLabel: "nextLabel", emptyLabel: "emptyLabel", rowsSelectedLabel: "rowsSelectedLabel", statusLabel: "statusLabel", emailLabel: "emailLabel", amountLabel: "amountLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query", filterFn: "filterFn" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange", columnSort: "columnSort" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 appearance-none box-border rounded-md border border-solid border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none box-border items-center gap-2 rounded-md border border-solid border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 box-border rounded-sm border border-solid border-input accent-primary\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none box-border items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 box-border rounded-sm border border-solid border-input accent-primary\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none box-border items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none box-border rounded-md border border-solid border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none box-border rounded-md border border-solid border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\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: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.PdmTableComponent, selector: "pdm-table", inputs: ["variant", "responsiveStrategy", "className", "fullBleed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, decorators: [{
242
+ type: Component,
243
+ args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 appearance-none box-border rounded-md border border-solid border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none box-border items-center gap-2 rounded-md border border-solid border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 box-border rounded-sm border border-solid border-input accent-primary\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none box-border items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 box-border rounded-sm border border-solid border-input accent-primary\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none box-border items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none box-border rounded-md border border-solid border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none box-border rounded-md border border-solid border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n" }]
244
+ }], propDecorators: { className: [{
245
+ type: Input
246
+ }], columns: [{
247
+ type: Input
248
+ }], responsiveStrategy: [{
249
+ type: Input
250
+ }], selectable: [{
251
+ type: Input
252
+ }], showActions: [{
253
+ type: Input
254
+ }], showFilter: [{
255
+ type: Input
256
+ }], showPagination: [{
257
+ type: Input
258
+ }], showColumnSelector: [{
259
+ type: Input
260
+ }], filterPlaceholder: [{
261
+ type: Input
262
+ }], columnsLabel: [{
263
+ type: Input
264
+ }], previousLabel: [{
265
+ type: Input
266
+ }], nextLabel: [{
267
+ type: Input
268
+ }], emptyLabel: [{
269
+ type: Input
270
+ }], rowsSelectedLabel: [{
271
+ type: Input
272
+ }], statusLabel: [{
273
+ type: Input
274
+ }], emailLabel: [{
275
+ type: Input
276
+ }], amountLabel: [{
277
+ type: Input
278
+ }], rows: [{
279
+ type: Input
280
+ }], page: [{
281
+ type: Input
282
+ }], pageSize: [{
283
+ type: Input
284
+ }], query: [{
285
+ type: Input
286
+ }], filterFn: [{
287
+ type: Input
288
+ }], queryChange: [{
289
+ type: Output
290
+ }], rowAction: [{
291
+ type: Output
292
+ }], pageChange: [{
293
+ type: Output
294
+ }], selectionChange: [{
295
+ type: Output
296
+ }], columnSort: [{
297
+ type: Output
298
+ }] } });
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7OztBQTJFN0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQU1ILE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXhCOzs7V0FHRztRQUNNLFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBRS9DOztXQUVHO1FBQ00sdUJBQWtCLEdBQTRCLFFBQVEsQ0FBQztRQUVoRTs7V0FFRztRQUNNLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFNUI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7V0FFRztRQUNNLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0I7O1dBRUc7UUFDTSxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUUvQjs7V0FFRztRQUNNLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUVwQyxjQUFjO1FBQ0wsc0JBQWlCLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1FBQzNCLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsZUFBVSxHQUFHLGFBQWEsQ0FBQztRQUMzQixzQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUUvQyw4REFBOEQ7UUFDOUQ7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUNoQzs7V0FFRztRQUNNLGVBQVUsR0FBRyxPQUFP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QkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgfSBmcm9tICcuLi91dGlscy9yZXNwb25zaXZlJztcblxuLyoqXG4gKiBERVBSRUNBVEVEOiBFc3RhIGludGVyZmF6IGVzIHBhcmEgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogVXNhciBQZG1EYXRhVGFibGVDb2x1bW48VD4gY29uIHRpcG8gZ2Vuw6lyaWNvIGVuIHN1IGx1Z2FyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmaW5pY2nDs24gZGUgY29sdW1uYSBwYXJhIGRhdGEtdGFibGUgZ2Vuw6lyaWNvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlQ29sdW1uPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEtleSBkZWwgY2FtcG8gZW4gZWwgb2JqZXRvIGRlIGRhdG9zXG4gICAqIFVzYWRvIHBhcmEgYWNjZWRlciBhbCB2YWxvcjogcm93W2tleV1cbiAgICovXG4gIGtleToga2V5b2YgVDtcbiAgXG4gIC8qKlxuICAgKiBMYWJlbCBhIG1vc3RyYXIgZW4gZWwgaGVhZGVyXG4gICAqL1xuICBsYWJlbDogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIEFuY2hvIGRlIGxhIGNvbHVtbmEgKENTUyB3aWR0aClcbiAgICogRWo6ICcxMDBweCcsICcyMCUnLCAnYXV0bydcbiAgICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIFNpIGxhIGNvbHVtbmEgZXMgc29ydGFibGVcbiAgICovXG4gIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgXG4gIC8qKlxuICAgKiBBbGluZWFjacOzbiBkZWwgY29udGVuaWRvXG4gICAqL1xuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcbiAgXG4gIC8qKlxuICAgKiBGdW5jacOzbiBjdXN0b20gcGFyYSByZW5kZXJpemFyIGVsIHZhbG9yXG4gICAqIFNpIG5vIHNlIHByb3ZlZSwgc2UgdXNhIHRvU3RyaW5nKCkgZGVsIHZhbG9yXG4gICAqL1xuICByZW5kZXI/OiAodmFsdWU6IGFueSwgcm93OiBUKSA9PiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogVGVtcGxhdGUgcGVyc29uYWxpemFkbyBwYXJhIGxhIGNlbGRhXG4gICAqIFRpZW5lIHByaW9yaWRhZCBzb2JyZSByZW5kZXIoKVxuICAgKi9cbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IFQ7IHZhbHVlOiBhbnkgfT47XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbGEgY29sdW1uYSBzZSBvY3VsdGEgZW4gbW9iaWxlXG4gICAqIFNvbG8gc2UgbXVlc3RyYSBlbiBicmVha3BvaW50IG1kKyAoNzY4cHgpXG4gICAqL1xuICBoaWRlT25Nb2JpbGU/OiBib29sZWFuO1xuICBcbiAgLyoqXG4gICAqIENTUyBjbGFzc2VzIGFkaWNpb25hbGVzIHBhcmEgbGFzIGNlbGRhcyBkZSBlc3RhIGNvbHVtbmFcbiAgICovXG4gIGNlbGxDbGFzcz86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBDU1MgY2xhc3NlcyBhZGljaW9uYWxlcyBwYXJhIGVsIGhlYWRlciBkZSBlc3RhIGNvbHVtbmFcbiAgICovXG4gIGhlYWRlckNsYXNzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERhdGEtdGFibGUgZ2Vuw6lyaWNvIGNvbiBwYWdpbmFjacOzbiwgZmlsdHJhZG8geSBzZWxlY2Npw7NuXG4gKiBcbiAqIE5VRVZPOiBBaG9yYSBlcyBnZW7DqXJpY28geSBjb25maWd1cmFibGUgdmlhIGNvbHVtbmFzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmlyIGNvbHVtbmFzXG4gKiBjb2x1bW5zOiBQZG1EYXRhVGFibGVDb2x1bW48VXNlcj5bXSA9IFtcbiAqICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgc29ydGFibGU6IHRydWUgfSxcbiAqICAgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICogICB7IGtleTogJ3JvbGUnLCBsYWJlbDogJ1JvbGUnLCBoaWRlT25Nb2JpbGU6IHRydWUgfSxcbiAqICAgeyBrZXk6ICdjcmVhdGVkQXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCByZW5kZXI6ICh2YWwpID0+IGZvcm1hdERhdGUodmFsKSB9XG4gKiBdO1xuICogXG4gKiAvLyBFbiBlbCB0ZW1wbGF0ZVxuICogPHBkbS1kYXRhLXRhYmxlXG4gKiAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICogICBbcm93c109XCJ1c2Vyc1wiXG4gKiAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICogICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0KCRldmVudClcIj5cbiAqIDwvcGRtLWRhdGEtdGFibGU+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EYXRhVGFibGVDb21wb25lbnQ8VCA9IGFueT4ge1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgXG4gIC8qKlxuICAgKiBDb2x1bW5hcyBhIG1vc3RyYXJcbiAgICogU2kgbm8gc2UgcHJvdmVlLCBpbnRlbnRhIGluZmVyaXIgZGVsIHByaW1lciByb3cgKGxlZ2FjeSBtb2RlKVxuICAgKi9cbiAgQElucHV0KCkgY29sdW1uczogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+W10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBFc3RyYXRlZ2lhIHJlc3BvbnNpdmUgZGUgbGEgdGFibGFcbiAgICovXG4gIEBJbnB1dCgpIHJlc3BvbnNpdmVTdHJhdGVneTogVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgPSAnc2Nyb2xsJztcbiAgXG4gIC8qKlxuICAgKiBTaSBlcyB0cnVlLCBtdWVzdHJhIGNoZWNrYm94IGRlIHNlbGVjY2nDs24gZW4gY2FkYSBmaWxhXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RhYmxlID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbXVlc3RyYSBib3TDs24gZGUgYWNjaW9uZXMgKHRyZXMgcHVudG9zKSBlbiBjYWRhIGZpbGFcbiAgICovXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbXVlc3RyYSBmaWx0cm8gZGUgYsO6c3F1ZWRhXG4gICAqL1xuICBASW5wdXQoKSBzaG93RmlsdGVyID0gdHJ1ZTtcbiAgXG4gIC8qKlxuICAgKiBTaSBlcyB0cnVlLCBtdWVzdHJhIGNvbnRyb2xlcyBkZSBwYWdpbmFjacOzblxuICAgKi9cbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xuICBcbiAgLyoqXG4gICAqIFNpIGVzIHRydWUsIG11ZXN0cmEgc2VsZWN0b3IgZGUgY29sdW1uYXNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dDb2x1bW5TZWxlY3RvciA9IGZhbHNlO1xuICBcbiAgLy8gTGFiZWxzIGkxOG5cbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJztcbiAgQElucHV0KCkgY29sdW1uc0xhYmVsID0gJ0NvbHVtbnMnO1xuICBASW5wdXQoKSBwcmV2aW91c0xhYmVsID0gJ1ByZXZpb3VzJztcbiAgQElucHV0KCkgbmV4dExhYmVsID0gJ05leHQnO1xuICBASW5wdXQoKSBlbXB0eUxhYmVsID0gJ05vIHJlc3VsdHMuJztcbiAgQElucHV0KCkgcm93c1NlbGVjdGVkTGFiZWwgPSAncm93KHMpIHNlbGVjdGVkJztcbiAgXG4gIC8vIERFUFJFQ0FURUQ6IExhYmVscyBoYXJkY29kZWFkb3MgcGFyYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY29sdW1ucyBjb25maWd1cmF0aW9uIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVsID0gJ1N0YXR1cyc7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY29sdW1ucyBjb25maWd1cmF0aW9uIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpIGVtYWlsTGFiZWwgPSAnRW1haWwnO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbHVtbnMgY29uZmlndXJhdGlvbiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBhbW91bnRMYWJlbCA9ICdBbW91bnQnO1xuICBcbiAgLyoqXG4gICAqIERhdG9zIGEgbW9zdHJhclxuICAgKi9cbiAgQElucHV0KCkgcm93czogVFtdID0gW107XG4gIFxuICAvKipcbiAgICogUMOhZ2luYSBhY3R1YWwgKDEtaW5kZXhlZClcbiAgICovXG4gIEBJbnB1dCgpIHBhZ2UgPSAxO1xuICBcbiAgLyoqXG4gICAqIENhbnRpZGFkIGRlIGZpbGFzIHBvciBww6FnaW5hXG4gICAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuICBcbiAgLyoqXG4gICAqIFF1ZXJ5IGRlIGZpbHRyYWRvXG4gICAqL1xuICBASW5wdXQoKSBxdWVyeSA9ICcnO1xuICBcbiAgLyoqXG4gICAqIEZ1bmNpw7NuIGN1c3RvbSBkZSBmaWx0cmFkb1xuICAgKiBTaSBubyBzZSBwcm92ZWUsIGJ1c2NhIGVuIHRvZG9zIGxvcyBjYW1wb3Mgc3RyaW5nXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJGbj86IChyb3c6IFQsIHF1ZXJ5OiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByb3dBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcm93OiBUOyBzZWxlY3RlZDogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgY29sdW1uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPjsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB9PigpO1xuXG4gIC8vIEVzdGFkbyBpbnRlcm5vXG4gIHNlbGVjdGVkUm93cyA9IG5ldyBTZXQ8VD4oKTtcbiAgc29ydENvbHVtbj86IFBkbURhdGFUYWJsZUNvbHVtbjxUPjtcbiAgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogQmFja3dhcmQgY29tcGF0aWJpbGl0eTogc2kgbm8gaGF5IGNvbHVtbmFzIGRlZmluaWRhcywgaW5mZXJpciBkZWwgcHJpbWVyIHJvd1xuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUNvbHVtbnMoKTogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+W10ge1xuICAgIGlmICh0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucztcbiAgICB9XG4gICAgXG4gICAgLy8gTGVnYWN5IG1vZGU6IGluZmVyaXIgY29sdW1uYXMgZGVsIHByaW1lciByb3cgKHNvbG8gcGFyYSBQZG1EYXRhVGFibGVSb3cpXG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRoaXMucm93c1swXSBhcyBhbnk7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlyc3RSb3cpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3NlbGVjdGVkJylcbiAgICAgICAgLm1hcChrZXkgPT4gKHtcbiAgICAgICAgICBrZXk6IGtleSBhcyBrZXlvZiBULFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmdldExlZ2FjeUxhYmVsKGtleSksXG4gICAgICAgICAgYWxpZ246IGtleSA9PT0gJ2Ftb3VudCcgPyAncmlnaHQnIDogJ2xlZnQnXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIExFR0FDWTogbWFwZW8gZGUga2V5cyBhIGxhYmVscyBoYXJkY29kZWFkb3NcbiAgICovXG4gIHByaXZhdGUgZ2V0TGVnYWN5TGFiZWwoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNMYWJlbCxcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsTGFiZWwsXG4gICAgICBhbW91bnQ6IHRoaXMuYW1vdW50TGFiZWxcbiAgICB9O1xuICAgIHJldHVybiBtYXBba2V5XSB8fCBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRSb3dzKCk6IFRbXSB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSByZXR1cm4gdGhpcy5yb3dzO1xuICAgIFxuICAgIGlmICh0aGlzLmZpbHRlckZuKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyb3cgPT4gdGhpcy5maWx0ZXJGbiEocm93LCBxKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbHRyYWRvIGRlZmF1bHQ6IGJ1c2NhciBlbiB0b2RvcyBsb3MgY2FtcG9zIHN0cmluZ1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHJvdyA9PiB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyb3cgYXMgYW55KS5zb21lKHZhbCA9PiBcbiAgICAgICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcGFnZWRSb3dzKCk6IFRbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93cy5zaXplO1xuICB9XG5cbiAgb25RdWVyeUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Ub2dnbGVSb3cocm93OiBULCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIFxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5hZGQocm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyByb3csIHNlbGVjdGVkOiBjaGVja2VkIH0pO1xuICB9XG5cbiAgb25Ub2dnbGVBbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICBcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3RlZFJvd3MuYWRkKHJvdykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VkUm93cy5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGVkUm93cy5kZWxldGUocm93KSk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3MuaGFzKHJvdyk7XG4gIH1cblxuICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYWdlIDw9IDEpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgLSAxKTtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnZSA+PSB0aGlzLnRvdGFsUGFnZXMpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgKyAxKTtcbiAgfVxuXG4gIG9uQWN0aW9uKHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMucm93QWN0aW9uLmVtaXQocm93KTtcbiAgfVxuXG4gIG9uU29ydChjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IHZvaWQge1xuICAgIGlmICghY29sdW1uLnNvcnRhYmxlKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydENvbHVtbiA9IGNvbHVtbjtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNvbHVtblNvcnQuZW1pdCh7IGNvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLnNvcnREaXJlY3Rpb24gfSk7XG4gIH1cblxuICBnZXRDZWxsVmFsdWUocm93OiBULCBjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uLmtleV07XG4gICAgXG4gICAgaWYgKGNvbHVtbi5yZW5kZXIpIHtcbiAgICAgIHJldHVybiBjb2x1bW4ucmVuZGVyKHZhbHVlLCByb3cpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJztcbiAgfVxuXG4gIGdldENlbGxDbGFzcyhjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsncHgtMicsICdweS0yJ107XG4gICAgXG4gICAgaWYgKGNvbHVtbi5hbGlnbiA9PT0gJ2NlbnRlcicpIGNsYXNzZXMucHVzaCgndGV4dC1jZW50ZXInKTtcbiAgICBpZiAoY29sdW1uLmFsaWduID09PSAncmlnaHQnKSBjbGFzc2VzLnB1c2goJ3RleHQtcmlnaHQnKTtcbiAgICBpZiAoY29sdW1uLmhpZGVPbk1vYmlsZSkgY2xhc3Nlcy5wdXNoKCdoaWRkZW4nLCAnbWQ6dGFibGUtY2VsbCcpO1xuICAgIGlmIChjb2x1bW4uY2VsbENsYXNzKSBjbGFzc2VzLnB1c2goY29sdW1uLmNlbGxDbGFzcyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2xhc3MoY29sdW1uOiBQZG1EYXRhVGFibGVDb2x1bW48VD4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ3B4LTInLCAncHktMicsICd0ZXh0LWxlZnQnLCAnZm9udC1tZWRpdW0nXTtcbiAgICBcbiAgICBpZiAoY29sdW1uLmhpZGVPbk1vYmlsZSkgY2xhc3Nlcy5wdXNoKCdoaWRkZW4nLCAnbWQ6dGFibGUtY2VsbCcpO1xuICAgIGlmIChjb2x1bW4uaGVhZGVyQ2xhc3MpIGNsYXNzZXMucHVzaChjb2x1bW4uaGVhZGVyQ2xhc3MpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldENvbHVtblN0eWxlKGNvbHVtbjogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+KTogYW55IHtcbiAgICByZXR1cm4gY29sdW1uLndpZHRoID8geyB3aWR0aDogY29sdW1uLndpZHRoIH0gOiB7fTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gW25nQ2xhc3NdPVwiWydmbGV4IHctZnVsbCBmbGV4LWNvbCcsIGNsYXNzTmFtZV1cIj5cbiAgPCEtLSBUb29sYmFyOiBGaWx0cm8gKyBTZWxlY3RvciBkZSBjb2x1bW5hcyAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd0ZpbHRlciB8fCBzaG93Q29sdW1uU2VsZWN0b3JcIlxuICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTIgcHktNCBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXJcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICAqbmdJZj1cInNob3dGaWx0ZXJcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlclBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJxdWVyeVwiXG4gICAgICAoaW5wdXQpPVwib25RdWVyeUlucHV0KCRldmVudClcIlxuICAgICAgY2xhc3M9XCJoLTkgZmxleC0xIGFwcGVhcmFuY2Utbm9uZSBib3gtYm9yZGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItaW5wdXQgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0xIHRleHQtc20gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmRcIlxuICAgIC8+XG5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNob3dDb2x1bW5TZWxlY3RvclwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC05IGFwcGVhcmFuY2Utbm9uZSBib3gtYm9yZGVyIGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgPlxuICAgICAgPHNwYW4+e3sgY29sdW1uc0xhYmVsIH19PC9zcGFuPlxuICAgICAgPHN2Z1xuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgY2xhc3M9XCJoLTQgdy00IHRleHQtZm9yZWdyb3VuZFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICA+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk03IDEwTDEyIDE1TDE3IDEwXCJcbiAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICA+PC9wYXRoPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGFibGEgY29uIHJlc3BvbnNpdmUgLS0+XG4gIDxwZG0tdGFibGVcbiAgICB2YXJpYW50PVwiZGF0YVwiXG4gICAgW3Jlc3BvbnNpdmVTdHJhdGVneV09XCJyZXNwb25zaXZlU3RyYXRlZ3lcIlxuICAgIFtmdWxsQmxlZWRdPVwiZmFsc2VcIlxuICA+XG4gICAgPHRoZWFkPlxuICAgICAgPHRyPlxuICAgICAgICA8IS0tIENvbHVtbmEgZGUgc2VsZWNjacOzbiAtLT5cbiAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0YWJsZVwiIGNsYXNzPVwidy0xMCBweC0yIHB5LTIgdGV4dC1sZWZ0IGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZUFsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCBib3gtYm9yZGVyIHJvdW5kZWQtc20gYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItaW5wdXQgYWNjZW50LXByaW1hcnlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvdGg+XG5cbiAgICAgICAgPCEtLSBDb2x1bW5hcyBkaW7DoW1pY2FzIC0tPlxuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGVmZmVjdGl2ZUNvbHVtbnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEhlYWRlckNsYXNzKGNvbHVtbilcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbHVtblN0eWxlKGNvbHVtbilcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBIZWFkZXIgc29ydGFibGUgLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Tb3J0KGNvbHVtbilcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBhcHBlYXJhbmNlLW5vbmUgYm94LWJvcmRlciBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXItMCBiZy10cmFuc3BhcmVudCBweC0zIHB5LTIgdGV4dC1zbSBob3Zlcjp1bmRlcmxpbmVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPnt7IGNvbHVtbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk04IDZMNCAxMEw4IDE0TTE2IDE4TDIwIDE0TDE2IDEwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEhlYWRlciBubyBzb3J0YWJsZSAtLT5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb2x1bW4uc29ydGFibGVcIj57eyBjb2x1bW4ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvdGg+XG5cbiAgICAgICAgPCEtLSBDb2x1bW5hIGRlIGFjY2lvbmVzIC0tPlxuICAgICAgICA8dGggKm5nSWY9XCJzaG93QWN0aW9uc1wiIGNsYXNzPVwidy0xMCBweC0yIHB5LTJcIj48L3RoPlxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuXG4gICAgPHRib2R5PlxuICAgICAgPCEtLSBGaWxhcyBjb24gZGF0b3MgLS0+XG4gICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlZFJvd3NcIj5cbiAgICAgICAgPCEtLSBDZWxkYSBkZSBzZWxlY2Npw7NuIC0tPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3RhYmxlXCIgY2xhc3M9XCJweC0yIHB5LTJcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00IGJveC1ib3JkZXIgcm91bmRlZC1zbSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1pbnB1dCBhY2NlbnQtcHJpbWFyeVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIENlbGRhcyBkaW7DoW1pY2FzIC0tPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGVmZmVjdGl2ZUNvbHVtbnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENlbGxDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gVGVtcGxhdGUgcGVyc29uYWxpemFkbyBzaSBleGlzdGUgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5jZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBjb2x1bW4uY2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIHZhbHVlOiByb3dbY29sdW1uLmtleV0gfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFJlbmRlcml6YWRvIGRlZmF1bHQgLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbD5cbiAgICAgICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3csIGNvbHVtbikgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuXG4gICAgICAgIDwhLS0gQ2VsZGEgZGUgYWNjaW9uZXMgLS0+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dBY3Rpb25zXCIgY2xhc3M9XCJweC0yIHB5LTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC04IHctOCBhcHBlYXJhbmNlLW5vbmUgYm94LWJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0wIGhvdmVyOnRleHQtZm9yZWdyb3VuZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25BY3Rpb24ocm93KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00XCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjZcIiBjeT1cIjEyXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxOFwiIGN5PVwiMTJcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuXG4gICAgICA8IS0tIEZpbGEgdmFjw61hIC0tPlxuICAgICAgPHRyICpuZ0lmPVwicGFnZWRSb3dzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8dGRcbiAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cIlxuICAgICAgICAgICAgZWZmZWN0aXZlQ29sdW1ucy5sZW5ndGggK1xuICAgICAgICAgICAgKHNlbGVjdGFibGUgPyAxIDogMCkgK1xuICAgICAgICAgICAgKHNob3dBY3Rpb25zID8gMSA6IDApXG4gICAgICAgICAgXCJcbiAgICAgICAgICBjbGFzcz1cInB4LTMgcHktNiB0ZXh0LWNlbnRlciB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBlbXB0eUxhYmVsIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG4gIDwvcGRtLXRhYmxlPlxuXG4gIDwhLS0gRm9vdGVyOiBJbmZvICsgUGFnaW5hY2nDs24gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dQYWdpbmF0aW9uIHx8IHNlbGVjdGFibGVcIlxuICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMiBweS00IHNtOmZsZXgtbm93cmFwXCJcbiAgPlxuICAgIDxwXG4gICAgICAqbmdJZj1cInNlbGVjdGFibGVcIlxuICAgICAgY2xhc3M9XCJtLTAgZmxleC0xIHByLTIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgID5cbiAgICAgIHt7IHNlbGVjdGVkQ291bnQgfX0gb2Yge3sgcm93cy5sZW5ndGggfX0ge3sgcm93c1NlbGVjdGVkTGFiZWwgfX1cbiAgICA8L3A+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd1BhZ2luYXRpb25cIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1sLWF1dG9cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgUGFnZSB7eyBwYWdlIH19IG9mIHt7IHRvdGFsUGFnZXMgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaC05IGFwcGVhcmFuY2Utbm9uZSBib3gtYm9yZGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJwYWdlIDw9IDFcIlxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXMoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHByZXZpb3VzTGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJoLTkgYXBwZWFyYW5jZS1ub25lIGJveC1ib3JkZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPj0gdG90YWxQYWdlc1wiXG4gICAgICAgIChjbGljayk9XCJuZXh0KClcIlxuICAgICAgPlxuICAgICAgICB7eyBuZXh0TGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==