@ng-nest/ui 17.0.11 → 18.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 (923) hide show
  1. package/README.md +1 -1
  2. package/affix/affix.component.d.ts +0 -2
  3. package/affix/affix.property.d.ts +12 -7
  4. package/alert/alert.component.d.ts +12 -11
  5. package/alert/alert.property.d.ts +36 -35
  6. package/anchor/anchor.component.d.ts +15 -18
  7. package/anchor/anchor.property.d.ts +17 -8
  8. package/api/api.component.d.ts +2 -7
  9. package/auto-complete/auto-complete-portal.component.d.ts +20 -25
  10. package/auto-complete/auto-complete.component.d.ts +17 -34
  11. package/auto-complete/auto-complete.property.d.ts +282 -20
  12. package/avatar/avatar.component.d.ts +29 -19
  13. package/avatar/avatar.property.d.ts +78 -12
  14. package/back-top/back-top.component.d.ts +12 -17
  15. package/back-top/back-top.property.d.ts +12 -8
  16. package/badge/badge.component.d.ts +9 -16
  17. package/badge/badge.property.d.ts +95 -13
  18. package/base-form/base-form.component.d.ts +53 -26
  19. package/base-form/base-form.module.d.ts +1 -2
  20. package/base-form/base-form.property.d.ts +173 -45
  21. package/button/button.component.d.ts +16 -14
  22. package/button/button.property.d.ts +242 -100
  23. package/button/buttons.component.d.ts +8 -10
  24. package/calendar/calendar.component.d.ts +41 -27
  25. package/calendar/calendar.property.d.ts +69 -10
  26. package/card/card.component.d.ts +4 -6
  27. package/card/card.property.d.ts +50 -9
  28. package/carousel/carousel-panel.component.d.ts +15 -14
  29. package/carousel/carousel.component.d.ts +18 -19
  30. package/carousel/carousel.property.d.ts +168 -28
  31. package/cascade/cascade-portal.component.d.ts +28 -28
  32. package/cascade/cascade.component.d.ts +24 -30
  33. package/cascade/cascade.property.d.ts +292 -20
  34. package/checkbox/checkbox.component.d.ts +17 -17
  35. package/checkbox/checkbox.property.d.ts +274 -35
  36. package/collapse/collapse-panel.component.d.ts +5 -2
  37. package/collapse/collapse.component.d.ts +3 -7
  38. package/collapse/collapse.property.d.ts +113 -20
  39. package/color/color.component.d.ts +4 -9
  40. package/color/color.property.d.ts +36 -8
  41. package/color-picker/color-picker-portal.component.d.ts +40 -52
  42. package/color-picker/color-picker.component.d.ts +19 -28
  43. package/color-picker/color-picker.property.d.ts +260 -10
  44. package/comment/comment-reply.component.d.ts +1 -8
  45. package/comment/comment.component.d.ts +4 -14
  46. package/comment/comment.property.d.ts +21 -15
  47. package/container/aside.component.d.ts +3 -8
  48. package/container/container.component.d.ts +5 -9
  49. package/container/container.property.d.ts +33 -19
  50. package/container/footer.component.d.ts +2 -5
  51. package/container/header.component.d.ts +2 -5
  52. package/container/main.component.d.ts +2 -7
  53. package/core/animation/badge.d.ts +8 -0
  54. package/core/animation/connect.d.ts +8 -1
  55. package/core/animation/consts.d.ts +4 -0
  56. package/core/animation/drop.d.ts +4 -0
  57. package/core/animation/fade.d.ts +4 -0
  58. package/core/animation/move.d.ts +4 -0
  59. package/core/animation/opacity.d.ts +4 -0
  60. package/core/animation/slide.d.ts +4 -1
  61. package/core/config/config.d.ts +174 -108
  62. package/core/config/config.service.d.ts +5 -5
  63. package/core/config/index.d.ts +1 -0
  64. package/core/functions/chunk.d.ts +12 -1
  65. package/core/functions/clone-deep.d.ts +16 -0
  66. package/core/functions/convert.d.ts +77 -4
  67. package/core/functions/csspx.d.ts +5 -0
  68. package/core/functions/date.d.ts +59 -3
  69. package/core/functions/drop.d.ts +13 -1
  70. package/core/functions/flex.d.ts +4 -0
  71. package/core/functions/group-by.d.ts +5 -1
  72. package/core/functions/guid.d.ts +2 -1
  73. package/core/functions/has-in.d.ts +4 -0
  74. package/core/functions/order-by.d.ts +5 -1
  75. package/core/functions/parent-path.d.ts +8 -0
  76. package/core/functions/property.d.ts +12 -6
  77. package/core/functions/public-api.d.ts +1 -0
  78. package/core/functions/remove.d.ts +5 -1
  79. package/core/functions/resize.d.ts +13 -1
  80. package/core/interfaces/data.type.d.ts +172 -3
  81. package/core/interfaces/identify.type.d.ts +60 -0
  82. package/core/interfaces/layout.type.d.ts +88 -37
  83. package/core/interfaces/result-list.type.d.ts +91 -3
  84. package/core/services/http.service.d.ts +0 -22
  85. package/core/services/repository.service.d.ts +1 -1
  86. package/core/services/reuse-strategy.service.d.ts +0 -22
  87. package/core/services/storage.service.d.ts +0 -21
  88. package/core/theme/theme.d.ts +45 -1
  89. package/core/theme/theme.service.d.ts +46 -11
  90. package/core/util/animation.d.ts +1 -1
  91. package/core/util/camel-to-kebab.d.ts +13 -0
  92. package/core/util/check.d.ts +10 -2
  93. package/core/util/computed-style.d.ts +8 -0
  94. package/core/util/host.d.ts +3 -2
  95. package/core/util/html.d.ts +3 -2
  96. package/core/util/kebab-to-camel.d.ts +13 -0
  97. package/core/util/log.d.ts +10 -2
  98. package/core/util/option.d.ts +3 -4
  99. package/core/util/public-api.d.ts +2 -0
  100. package/crumb/crumb.component.d.ts +1 -10
  101. package/crumb/crumb.property.d.ts +12 -8
  102. package/date-picker/date-picker-portal.component.d.ts +80 -33
  103. package/date-picker/date-picker.component.d.ts +74 -32
  104. package/date-picker/date-picker.property.d.ts +662 -214
  105. package/date-picker/date-range-portal.component.d.ts +102 -49
  106. package/date-picker/date-range.component.d.ts +87 -43
  107. package/date-picker/picker-date.component.d.ts +63 -17
  108. package/date-picker/picker-month.component.d.ts +59 -13
  109. package/date-picker/picker-quarter.component.d.ts +61 -15
  110. package/date-picker/picker-year.component.d.ts +8 -11
  111. package/description/description-item.component.d.ts +1 -1
  112. package/description/description.component.d.ts +6 -10
  113. package/description/description.property.d.ts +135 -16
  114. package/dialog/dialog-portal.component.d.ts +4 -4
  115. package/dialog/dialog-portal.directives.d.ts +1 -1
  116. package/dialog/dialog.component.d.ts +30 -23
  117. package/dialog/dialog.property.d.ts +77 -134
  118. package/doc/doc.component.d.ts +2 -5
  119. package/drag/drag.directive.d.ts +1 -1
  120. package/drag/drag.property.d.ts +4 -5
  121. package/drawer/drawer-container.component.d.ts +1 -1
  122. package/drawer/drawer-portal.component.d.ts +1 -1
  123. package/drawer/drawer.component.d.ts +15 -14
  124. package/drawer/drawer.property.d.ts +26 -18
  125. package/dropdown/dropdown-portal.component.d.ts +36 -45
  126. package/dropdown/dropdown.component.d.ts +17 -21
  127. package/dropdown/dropdown.property.d.ts +24 -21
  128. package/empty/empty.component.d.ts +0 -7
  129. package/empty/empty.property.d.ts +27 -4
  130. package/esm2022/affix/affix.component.mjs +6 -11
  131. package/esm2022/affix/affix.module.mjs +4 -4
  132. package/esm2022/affix/affix.property.mjs +22 -20
  133. package/esm2022/alert/alert.component.mjs +39 -44
  134. package/esm2022/alert/alert.module.mjs +4 -4
  135. package/esm2022/alert/alert.property.mjs +102 -107
  136. package/esm2022/anchor/anchor-inner.component.mjs +3 -3
  137. package/esm2022/anchor/anchor.component.mjs +73 -95
  138. package/esm2022/anchor/anchor.module.mjs +4 -4
  139. package/esm2022/anchor/anchor.property.mjs +45 -35
  140. package/esm2022/api/api.component.mjs +11 -14
  141. package/esm2022/api/api.module.mjs +4 -4
  142. package/esm2022/auto-complete/auto-complete-portal.component.mjs +36 -47
  143. package/esm2022/auto-complete/auto-complete.component.mjs +122 -162
  144. package/esm2022/auto-complete/auto-complete.module.mjs +4 -4
  145. package/esm2022/auto-complete/auto-complete.property.mjs +142 -55
  146. package/esm2022/avatar/avatar-group.component.mjs +3 -3
  147. package/esm2022/avatar/avatar.component.mjs +75 -81
  148. package/esm2022/avatar/avatar.module.mjs +4 -4
  149. package/esm2022/avatar/avatar.property.mjs +116 -45
  150. package/esm2022/back-top/back-top.component.mjs +57 -73
  151. package/esm2022/back-top/back-top.module.mjs +4 -4
  152. package/esm2022/back-top/back-top.property.mjs +37 -29
  153. package/esm2022/badge/badge.component.mjs +51 -59
  154. package/esm2022/badge/badge.module.mjs +4 -4
  155. package/esm2022/badge/badge.property.mjs +111 -38
  156. package/esm2022/base-form/base-form.component.mjs +89 -81
  157. package/esm2022/base-form/base-form.module.mjs +7 -8
  158. package/esm2022/base-form/base-form.property.mjs +200 -89
  159. package/esm2022/button/button.component.mjs +50 -59
  160. package/esm2022/button/button.module.mjs +4 -4
  161. package/esm2022/button/button.property.mjs +293 -98
  162. package/esm2022/button/buttons.component.mjs +35 -21
  163. package/esm2022/calendar/calendar.component.mjs +56 -84
  164. package/esm2022/calendar/calendar.module.mjs +4 -4
  165. package/esm2022/calendar/calendar.property.mjs +78 -24
  166. package/esm2022/card/card.component.mjs +10 -14
  167. package/esm2022/card/card.module.mjs +4 -4
  168. package/esm2022/card/card.property.mjs +57 -22
  169. package/esm2022/carousel/carousel-panel.component.mjs +98 -76
  170. package/esm2022/carousel/carousel.component.mjs +55 -65
  171. package/esm2022/carousel/carousel.module.mjs +4 -4
  172. package/esm2022/carousel/carousel.property.mjs +215 -85
  173. package/esm2022/cascade/cascade-portal.component.mjs +77 -69
  174. package/esm2022/cascade/cascade.component.mjs +107 -135
  175. package/esm2022/cascade/cascade.module.mjs +4 -4
  176. package/esm2022/cascade/cascade.property.mjs +137 -48
  177. package/esm2022/checkbox/checkbox.component.mjs +68 -83
  178. package/esm2022/checkbox/checkbox.module.mjs +4 -4
  179. package/esm2022/checkbox/checkbox.property.mjs +136 -73
  180. package/esm2022/collapse/collapse-panel.component.mjs +31 -21
  181. package/esm2022/collapse/collapse.component.mjs +16 -21
  182. package/esm2022/collapse/collapse.module.mjs +4 -4
  183. package/esm2022/collapse/collapse.property.mjs +156 -66
  184. package/esm2022/color/color.component.mjs +25 -26
  185. package/esm2022/color/color.module.mjs +4 -4
  186. package/esm2022/color/color.property.mjs +47 -27
  187. package/esm2022/color-picker/color-picker-portal.component.mjs +120 -130
  188. package/esm2022/color-picker/color-picker.component.mjs +76 -117
  189. package/esm2022/color-picker/color-picker.module.mjs +4 -4
  190. package/esm2022/color-picker/color-picker.property.mjs +123 -27
  191. package/esm2022/comment/comment-reply.component.mjs +9 -24
  192. package/esm2022/comment/comment.component.mjs +11 -40
  193. package/esm2022/comment/comment.module.mjs +4 -4
  194. package/esm2022/comment/comment.property.mjs +27 -50
  195. package/esm2022/container/aside.component.mjs +12 -15
  196. package/esm2022/container/container.component.mjs +21 -24
  197. package/esm2022/container/container.module.mjs +4 -4
  198. package/esm2022/container/container.property.mjs +55 -51
  199. package/esm2022/container/footer.component.mjs +14 -16
  200. package/esm2022/container/header.component.mjs +14 -16
  201. package/esm2022/container/main.component.mjs +10 -13
  202. package/esm2022/core/animation/badge.mjs +17 -3
  203. package/esm2022/core/animation/connect.mjs +17 -99
  204. package/esm2022/core/animation/consts.mjs +5 -1
  205. package/esm2022/core/animation/drop.mjs +5 -1
  206. package/esm2022/core/animation/fade.mjs +13 -3
  207. package/esm2022/core/animation/move.mjs +5 -1
  208. package/esm2022/core/animation/opacity.mjs +5 -1
  209. package/esm2022/core/animation/slide.mjs +5 -23
  210. package/esm2022/core/config/config.mjs +1 -1
  211. package/esm2022/core/config/config.service.mjs +11 -59
  212. package/esm2022/core/config/index.mjs +2 -0
  213. package/esm2022/core/functions/chunk.mjs +12 -1
  214. package/esm2022/core/functions/clone-deep.mjs +17 -1
  215. package/esm2022/core/functions/convert.mjs +110 -13
  216. package/esm2022/core/functions/csspx.mjs +17 -0
  217. package/esm2022/core/functions/date.mjs +80 -4
  218. package/esm2022/core/functions/drop.mjs +13 -1
  219. package/esm2022/core/functions/flex.mjs +5 -1
  220. package/esm2022/core/functions/group-by.mjs +5 -1
  221. package/esm2022/core/functions/guid.mjs +3 -2
  222. package/esm2022/core/functions/has-in.mjs +5 -1
  223. package/esm2022/core/functions/order-by.mjs +5 -1
  224. package/esm2022/core/functions/parent-path.mjs +9 -1
  225. package/esm2022/core/functions/property.mjs +16 -8
  226. package/esm2022/core/functions/public-api.mjs +2 -1
  227. package/esm2022/core/functions/remove.mjs +5 -1
  228. package/esm2022/core/functions/resize.mjs +7 -5
  229. package/esm2022/core/interfaces/data.type.mjs +97 -8
  230. package/esm2022/core/interfaces/identify.type.mjs +5 -2
  231. package/esm2022/core/interfaces/layout.type.mjs +1 -1
  232. package/esm2022/core/interfaces/result-list.type.mjs +1 -1
  233. package/esm2022/core/services/http.service.mjs +4 -33
  234. package/esm2022/core/services/preloading-strategy.service.mjs +4 -6
  235. package/esm2022/core/services/repository.service.mjs +1 -1
  236. package/esm2022/core/services/reuse-strategy.service.mjs +1 -26
  237. package/esm2022/core/services/storage.service.mjs +4 -26
  238. package/esm2022/core/theme/theme.mjs +55 -11
  239. package/esm2022/core/theme/theme.service.mjs +92 -20
  240. package/esm2022/core/util/animation.mjs +2 -23
  241. package/esm2022/core/util/camel-to-kebab.mjs +16 -0
  242. package/esm2022/core/util/check.mjs +11 -3
  243. package/esm2022/core/util/computed-style.mjs +9 -1
  244. package/esm2022/core/util/host.mjs +4 -3
  245. package/esm2022/core/util/html.mjs +5 -4
  246. package/esm2022/core/util/kebab-to-camel.mjs +16 -0
  247. package/esm2022/core/util/log.mjs +11 -3
  248. package/esm2022/core/util/option.mjs +4 -5
  249. package/esm2022/core/util/public-api.mjs +3 -1
  250. package/esm2022/crumb/crumb.component.mjs +6 -29
  251. package/esm2022/crumb/crumb.module.mjs +4 -4
  252. package/esm2022/crumb/crumb.property.mjs +21 -26
  253. package/esm2022/date-picker/date-picker-portal.component.mjs +86 -102
  254. package/esm2022/date-picker/date-picker.component.mjs +157 -191
  255. package/esm2022/date-picker/date-picker.module.mjs +4 -4
  256. package/esm2022/date-picker/date-picker.property.mjs +440 -462
  257. package/esm2022/date-picker/date-quarter.pipe.mjs +3 -3
  258. package/esm2022/date-picker/date-range-portal.component.mjs +172 -186
  259. package/esm2022/date-picker/date-range.component.mjs +224 -266
  260. package/esm2022/date-picker/picker-date.component.mjs +150 -150
  261. package/esm2022/date-picker/picker-month.component.mjs +115 -118
  262. package/esm2022/date-picker/picker-quarter.component.mjs +120 -119
  263. package/esm2022/date-picker/picker-year.component.mjs +121 -108
  264. package/esm2022/description/description-item.component.mjs +12 -11
  265. package/esm2022/description/description.component.mjs +33 -48
  266. package/esm2022/description/description.module.mjs +4 -4
  267. package/esm2022/description/description.property.mjs +175 -52
  268. package/esm2022/dialog/dialog-container.component.mjs +3 -3
  269. package/esm2022/dialog/dialog-portal.component.mjs +14 -20
  270. package/esm2022/dialog/dialog-portal.directives.mjs +20 -20
  271. package/esm2022/dialog/dialog-ref.mjs +1 -1
  272. package/esm2022/dialog/dialog.component.mjs +117 -131
  273. package/esm2022/dialog/dialog.module.mjs +4 -4
  274. package/esm2022/dialog/dialog.property.mjs +149 -139
  275. package/esm2022/dialog/dialog.service.mjs +7 -7
  276. package/esm2022/doc/doc.component.mjs +11 -12
  277. package/esm2022/doc/doc.module.mjs +4 -4
  278. package/esm2022/drag/drag.directive.mjs +8 -21
  279. package/esm2022/drag/drag.module.mjs +4 -4
  280. package/esm2022/drag/drag.property.mjs +10 -16
  281. package/esm2022/drawer/drawer-container.component.mjs +9 -9
  282. package/esm2022/drawer/drawer-portal.component.mjs +11 -13
  283. package/esm2022/drawer/drawer-portal.directives.mjs +9 -9
  284. package/esm2022/drawer/drawer.component.mjs +40 -59
  285. package/esm2022/drawer/drawer.module.mjs +4 -4
  286. package/esm2022/drawer/drawer.property.mjs +47 -54
  287. package/esm2022/drawer/drawer.service.mjs +6 -6
  288. package/esm2022/dropdown/dropdown-portal.component.mjs +90 -91
  289. package/esm2022/dropdown/dropdown.component.mjs +75 -91
  290. package/esm2022/dropdown/dropdown.module.mjs +4 -4
  291. package/esm2022/dropdown/dropdown.property.mjs +62 -59
  292. package/esm2022/empty/empty.component.mjs +6 -26
  293. package/esm2022/empty/empty.module.mjs +4 -4
  294. package/esm2022/empty/empty.property.mjs +41 -20
  295. package/esm2022/examples/examples.component.mjs +11 -12
  296. package/esm2022/examples/examples.module.mjs +4 -4
  297. package/esm2022/find/find.component.mjs +188 -232
  298. package/esm2022/find/find.module.mjs +4 -4
  299. package/esm2022/find/find.property.mjs +234 -193
  300. package/esm2022/form/control.component.mjs +138 -116
  301. package/esm2022/form/form.component.mjs +28 -36
  302. package/esm2022/form/form.module.mjs +4 -4
  303. package/esm2022/form/form.property.mjs +57 -55
  304. package/esm2022/highlight/highlight.component.mjs +54 -59
  305. package/esm2022/highlight/highlight.module.mjs +4 -4
  306. package/esm2022/highlight/highlight.property.mjs +25 -21
  307. package/esm2022/highlight/highlight.service.mjs +17 -0
  308. package/esm2022/highlight/public-api.mjs +2 -1
  309. package/esm2022/i18n/i18n.directive.mjs +17 -31
  310. package/esm2022/i18n/i18n.module.mjs +4 -4
  311. package/esm2022/i18n/i18n.pipe.mjs +4 -4
  312. package/esm2022/i18n/i18n.property.mjs +2 -2
  313. package/esm2022/i18n/i18n.service.mjs +4 -4
  314. package/esm2022/i18n/languages/ar_EG.mjs +122 -77
  315. package/esm2022/i18n/languages/bg_BG.mjs +135 -87
  316. package/esm2022/i18n/languages/ca_ES.mjs +130 -82
  317. package/esm2022/i18n/languages/cs_CZ.mjs +127 -79
  318. package/esm2022/i18n/languages/da_DK.mjs +129 -81
  319. package/esm2022/i18n/languages/de_DE.mjs +125 -77
  320. package/esm2022/i18n/languages/el_GR.mjs +132 -84
  321. package/esm2022/i18n/languages/en_GB.mjs +5 -2
  322. package/esm2022/i18n/languages/en_US.mjs +5 -2
  323. package/esm2022/i18n/languages/es_ES.mjs +131 -83
  324. package/esm2022/i18n/languages/et_EE.mjs +130 -82
  325. package/esm2022/i18n/languages/fa_IR.mjs +109 -61
  326. package/esm2022/i18n/languages/fi_FI.mjs +134 -86
  327. package/esm2022/i18n/languages/fr_BE.mjs +128 -80
  328. package/esm2022/i18n/languages/fr_FR.mjs +127 -79
  329. package/esm2022/i18n/languages/he_IL.mjs +119 -74
  330. package/esm2022/i18n/languages/hi_IN.mjs +104 -56
  331. package/esm2022/i18n/languages/hr_HR.mjs +133 -85
  332. package/esm2022/i18n/languages/hu_HU.mjs +132 -84
  333. package/esm2022/i18n/languages/hy_AM.mjs +133 -85
  334. package/esm2022/i18n/languages/id_ID.mjs +119 -71
  335. package/esm2022/i18n/languages/is_IS.mjs +125 -77
  336. package/esm2022/i18n/languages/it_IT.mjs +127 -79
  337. package/esm2022/i18n/languages/ja_JP.mjs +95 -47
  338. package/esm2022/i18n/languages/ka_GE.mjs +106 -58
  339. package/esm2022/i18n/languages/kn_IN.mjs +110 -62
  340. package/esm2022/i18n/languages/ko_KR.mjs +126 -70
  341. package/esm2022/i18n/languages/ku_IQ.mjs +117 -85
  342. package/esm2022/i18n/languages/lv_LV.mjs +128 -72
  343. package/esm2022/i18n/languages/mn_MN.mjs +138 -82
  344. package/esm2022/i18n/languages/ms_MY.mjs +124 -68
  345. package/esm2022/i18n/languages/nb_NO.mjs +133 -77
  346. package/esm2022/i18n/languages/ne_NP.mjs +117 -61
  347. package/esm2022/i18n/languages/nl_BE.mjs +134 -78
  348. package/esm2022/i18n/languages/nl_NL.mjs +134 -78
  349. package/esm2022/i18n/languages/pl_PL.mjs +132 -76
  350. package/esm2022/i18n/languages/pt_BR.mjs +133 -77
  351. package/esm2022/i18n/languages/pt_PT.mjs +133 -77
  352. package/esm2022/i18n/languages/ro_RO.mjs +130 -74
  353. package/esm2022/i18n/languages/ru_RU.mjs +131 -75
  354. package/esm2022/i18n/languages/sk_SK.mjs +130 -83
  355. package/esm2022/i18n/languages/sl_SI.mjs +121 -73
  356. package/esm2022/i18n/languages/sr_RS.mjs +138 -90
  357. package/esm2022/i18n/languages/sv_SE.mjs +132 -84
  358. package/esm2022/i18n/languages/ta_IN.mjs +117 -61
  359. package/esm2022/i18n/languages/th_TH.mjs +99 -43
  360. package/esm2022/i18n/languages/tr_TR.mjs +126 -70
  361. package/esm2022/i18n/languages/uk_UA.mjs +124 -68
  362. package/esm2022/i18n/languages/vi_VN.mjs +133 -77
  363. package/esm2022/i18n/languages/zh_CN.mjs +5 -2
  364. package/esm2022/i18n/languages/zh_TW.mjs +5 -2
  365. package/esm2022/icon/icon.component.mjs +46 -77
  366. package/esm2022/icon/icon.module.mjs +4 -4
  367. package/esm2022/icon/icon.property.mjs +52 -30
  368. package/esm2022/icon/icon.service.mjs +15 -14
  369. package/esm2022/image/image-group.component.mjs +15 -15
  370. package/esm2022/image/image-preview.component.mjs +47 -46
  371. package/esm2022/image/image.component.mjs +34 -53
  372. package/esm2022/image/image.module.mjs +4 -4
  373. package/esm2022/image/image.property.mjs +152 -38
  374. package/esm2022/index.mjs +1 -3
  375. package/esm2022/inner/inner.component.mjs +15 -20
  376. package/esm2022/inner/inner.module.mjs +4 -4
  377. package/esm2022/inner/inner.property.mjs +17 -15
  378. package/esm2022/input/input-group.component.mjs +5 -7
  379. package/esm2022/input/input.component.mjs +130 -143
  380. package/esm2022/input/input.module.mjs +4 -4
  381. package/esm2022/input/input.property.mjs +205 -143
  382. package/esm2022/input-number/input-number.component.mjs +68 -86
  383. package/esm2022/input-number/input-number.module.mjs +4 -4
  384. package/esm2022/input-number/input-number.property.mjs +130 -60
  385. package/esm2022/keyword/keyword.directive.mjs +46 -54
  386. package/esm2022/keyword/keyword.module.mjs +4 -4
  387. package/esm2022/keyword/keyword.property.mjs +32 -28
  388. package/esm2022/layout/col.component.mjs +48 -51
  389. package/esm2022/layout/layout.module.mjs +4 -4
  390. package/esm2022/layout/layout.property.mjs +71 -63
  391. package/esm2022/layout/row.component.mjs +36 -27
  392. package/esm2022/link/link.component.mjs +18 -45
  393. package/esm2022/link/link.module.mjs +4 -4
  394. package/esm2022/link/link.property.mjs +101 -41
  395. package/esm2022/list/list-drop-group.directive.mjs +9 -18
  396. package/esm2022/list/list-option.component.mjs +16 -33
  397. package/esm2022/list/list.component.mjs +160 -164
  398. package/esm2022/list/list.module.mjs +4 -4
  399. package/esm2022/list/list.property.mjs +195 -188
  400. package/esm2022/loading/loading.component.mjs +44 -45
  401. package/esm2022/loading/loading.module.mjs +4 -4
  402. package/esm2022/loading/loading.property.mjs +50 -52
  403. package/esm2022/menu/menu-node.component.mjs +21 -21
  404. package/esm2022/menu/menu.component.mjs +57 -76
  405. package/esm2022/menu/menu.module.mjs +4 -4
  406. package/esm2022/menu/menu.property.mjs +56 -73
  407. package/esm2022/message/message.component.mjs +8 -8
  408. package/esm2022/message/message.module.mjs +4 -4
  409. package/esm2022/message/message.property.mjs +1 -1
  410. package/esm2022/message/message.service.mjs +7 -7
  411. package/esm2022/message-box/message-box.component.mjs +5 -5
  412. package/esm2022/message-box/message-box.module.mjs +4 -4
  413. package/esm2022/message-box/message-box.service.mjs +6 -6
  414. package/esm2022/notification/notification.component.mjs +8 -8
  415. package/esm2022/notification/notification.module.mjs +4 -4
  416. package/esm2022/notification/notification.property.mjs +1 -1
  417. package/esm2022/notification/notification.service.mjs +8 -8
  418. package/esm2022/outlet/outlet.directive.mjs +12 -14
  419. package/esm2022/outlet/outlet.module.mjs +4 -4
  420. package/esm2022/outlet/outlet.property.mjs +2 -2
  421. package/esm2022/page-header/page-header.component.mjs +12 -28
  422. package/esm2022/page-header/page-header.module.mjs +4 -4
  423. package/esm2022/page-header/page-header.property.mjs +31 -27
  424. package/esm2022/pagination/pagination.component.mjs +74 -100
  425. package/esm2022/pagination/pagination.module.mjs +4 -4
  426. package/esm2022/pagination/pagination.property.mjs +99 -136
  427. package/esm2022/pattern/pattern.component.mjs +12 -13
  428. package/esm2022/pattern/pattern.module.mjs +4 -4
  429. package/esm2022/pattern/pattern.property.mjs +2 -2
  430. package/esm2022/popconfirm/popconfirm.component.mjs +35 -47
  431. package/esm2022/popconfirm/popconfirm.module.mjs +4 -4
  432. package/esm2022/popconfirm/popconfirm.property.mjs +76 -62
  433. package/esm2022/popover/popover-portal.component.mjs +24 -75
  434. package/esm2022/popover/popover.directive.mjs +70 -86
  435. package/esm2022/popover/popover.module.mjs +4 -4
  436. package/esm2022/popover/popover.property.mjs +71 -58
  437. package/esm2022/portal/portal.module.mjs +4 -4
  438. package/esm2022/portal/portal.property.mjs +1 -1
  439. package/esm2022/portal/portal.service.mjs +4 -4
  440. package/esm2022/progress/progress.component.mjs +173 -167
  441. package/esm2022/progress/progress.module.mjs +4 -4
  442. package/esm2022/progress/progress.property.mjs +67 -71
  443. package/esm2022/radio/radio.component.mjs +45 -61
  444. package/esm2022/radio/radio.module.mjs +4 -4
  445. package/esm2022/radio/radio.property.mjs +139 -66
  446. package/esm2022/rate/rate.component.mjs +61 -79
  447. package/esm2022/rate/rate.module.mjs +4 -4
  448. package/esm2022/rate/rate.property.mjs +121 -29
  449. package/esm2022/resizable/resizable.directive.mjs +30 -45
  450. package/esm2022/resizable/resizable.module.mjs +4 -4
  451. package/esm2022/resizable/resizable.property.mjs +16 -46
  452. package/esm2022/result/result.component.mjs +13 -17
  453. package/esm2022/result/result.module.mjs +4 -4
  454. package/esm2022/result/result.property.mjs +25 -17
  455. package/esm2022/ripple/ripple.directive.mjs +38 -27
  456. package/esm2022/ripple/ripple.module.mjs +4 -4
  457. package/esm2022/ripple/ripple.property.mjs +27 -20
  458. package/esm2022/select/select-portal.component.mjs +52 -67
  459. package/esm2022/select/select.component.mjs +301 -289
  460. package/esm2022/select/select.module.mjs +4 -4
  461. package/esm2022/select/select.property.mjs +195 -102
  462. package/esm2022/skeleton/skeleton.component.mjs +12 -23
  463. package/esm2022/skeleton/skeleton.module.mjs +4 -4
  464. package/esm2022/skeleton/skeleton.property.mjs +31 -28
  465. package/esm2022/slider/slider.component.mjs +103 -149
  466. package/esm2022/slider/slider.module.mjs +4 -4
  467. package/esm2022/slider/slider.property.mjs +60 -79
  468. package/esm2022/slider-select/slider-select.component.mjs +201 -220
  469. package/esm2022/slider-select/slider-select.module.mjs +4 -4
  470. package/esm2022/slider-select/slider-select.property.mjs +143 -70
  471. package/esm2022/statistic/countdown.component.mjs +13 -16
  472. package/esm2022/statistic/statistic.component.mjs +23 -21
  473. package/esm2022/statistic/statistic.module.mjs +4 -4
  474. package/esm2022/statistic/statistic.property.mjs +68 -34
  475. package/esm2022/steps/steps.component.mjs +33 -63
  476. package/esm2022/steps/steps.module.mjs +4 -4
  477. package/esm2022/steps/steps.property.mjs +28 -39
  478. package/esm2022/switch/switch.component.mjs +22 -37
  479. package/esm2022/switch/switch.module.mjs +4 -4
  480. package/esm2022/switch/switch.property.mjs +122 -32
  481. package/esm2022/table/table-body.component.mjs +134 -139
  482. package/esm2022/table/table-foot.component.mjs +15 -18
  483. package/esm2022/table/table-head.component.mjs +60 -91
  484. package/esm2022/table/table.component.mjs +192 -222
  485. package/esm2022/table/table.module.mjs +4 -4
  486. package/esm2022/table/table.property.mjs +396 -341
  487. package/esm2022/tabs/tab-content.component.mjs +13 -16
  488. package/esm2022/tabs/tab-link.directive.mjs +6 -6
  489. package/esm2022/tabs/tab.component.mjs +9 -17
  490. package/esm2022/tabs/tabs.component.mjs +83 -135
  491. package/esm2022/tabs/tabs.module.mjs +4 -4
  492. package/esm2022/tabs/tabs.property.mjs +80 -91
  493. package/esm2022/tag/tag.component.mjs +19 -33
  494. package/esm2022/tag/tag.module.mjs +4 -4
  495. package/esm2022/tag/tag.property.mjs +44 -68
  496. package/esm2022/text-retract/text-retract.component.mjs +29 -46
  497. package/esm2022/text-retract/text-retract.module.mjs +4 -4
  498. package/esm2022/text-retract/text-retract.property.mjs +22 -18
  499. package/esm2022/textarea/textarea.component.mjs +49 -79
  500. package/esm2022/textarea/textarea.module.mjs +4 -4
  501. package/esm2022/textarea/textarea.property.mjs +124 -47
  502. package/esm2022/theme/theme.component.mjs +86 -81
  503. package/esm2022/theme/theme.module.mjs +4 -4
  504. package/esm2022/theme/theme.property.mjs +35 -46
  505. package/esm2022/time-ago/time-ago.module.mjs +4 -4
  506. package/esm2022/time-ago/time-ago.pipe.mjs +12 -11
  507. package/esm2022/time-ago/time-ago.property.mjs +2 -2
  508. package/esm2022/time-picker/time-picker-frame.component.mjs +173 -188
  509. package/esm2022/time-picker/time-picker-portal.component.mjs +35 -42
  510. package/esm2022/time-picker/time-picker.component.mjs +139 -170
  511. package/esm2022/time-picker/time-picker.module.mjs +4 -4
  512. package/esm2022/time-picker/time-picker.property.mjs +158 -70
  513. package/esm2022/time-range/time-range.module.mjs +4 -4
  514. package/esm2022/time-range/time-range.pipe.mjs +10 -10
  515. package/esm2022/time-range/time-range.property.mjs +2 -2
  516. package/esm2022/timeline/timeline.component.mjs +14 -38
  517. package/esm2022/timeline/timeline.module.mjs +4 -4
  518. package/esm2022/timeline/timeline.property.mjs +30 -30
  519. package/esm2022/tooltip/tooltip-portal.component.mjs +51 -65
  520. package/esm2022/tooltip/tooltip.directive.mjs +65 -62
  521. package/esm2022/tooltip/tooltip.module.mjs +4 -4
  522. package/esm2022/tooltip/tooltip.property.mjs +53 -47
  523. package/esm2022/transfer/transfer.component.mjs +225 -184
  524. package/esm2022/transfer/transfer.module.mjs +4 -4
  525. package/esm2022/transfer/transfer.property.mjs +84 -76
  526. package/esm2022/tree/tree-node.component.mjs +142 -132
  527. package/esm2022/tree/tree.component.mjs +236 -232
  528. package/esm2022/tree/tree.module.mjs +4 -4
  529. package/esm2022/tree/tree.property.mjs +228 -226
  530. package/esm2022/tree/tree.service.mjs +4 -4
  531. package/esm2022/tree-file/tree-file.component.mjs +34 -43
  532. package/esm2022/tree-file/tree-file.module.mjs +4 -4
  533. package/esm2022/tree-file/tree-file.property.mjs +45 -56
  534. package/esm2022/tree-select/tree-select-portal.component.mjs +45 -78
  535. package/esm2022/tree-select/tree-select.component.mjs +283 -296
  536. package/esm2022/tree-select/tree-select.module.mjs +4 -4
  537. package/esm2022/tree-select/tree-select.property.mjs +203 -125
  538. package/esm2022/typography/typography.component.mjs +13 -10
  539. package/esm2022/typography/typography.module.mjs +4 -4
  540. package/esm2022/typography/typography.property.mjs +12 -11
  541. package/esm2022/upload/upload-portal.component.mjs +54 -57
  542. package/esm2022/upload/upload.component.mjs +79 -98
  543. package/esm2022/upload/upload.module.mjs +4 -4
  544. package/esm2022/upload/upload.property.mjs +73 -68
  545. package/examples/examples.component.d.ts +2 -5
  546. package/fesm2022/ng-nest-ui-affix.mjs +30 -32
  547. package/fesm2022/ng-nest-ui-affix.mjs.map +1 -1
  548. package/fesm2022/ng-nest-ui-alert.mjs +142 -152
  549. package/fesm2022/ng-nest-ui-alert.mjs.map +1 -1
  550. package/fesm2022/ng-nest-ui-anchor.mjs +121 -133
  551. package/fesm2022/ng-nest-ui-anchor.mjs.map +1 -1
  552. package/fesm2022/ng-nest-ui-api.mjs +14 -17
  553. package/fesm2022/ng-nest-ui-api.mjs.map +1 -1
  554. package/fesm2022/ng-nest-ui-auto-complete.mjs +296 -260
  555. package/fesm2022/ng-nest-ui-auto-complete.mjs.map +1 -1
  556. package/fesm2022/ng-nest-ui-avatar.mjs +195 -130
  557. package/fesm2022/ng-nest-ui-avatar.mjs.map +1 -1
  558. package/fesm2022/ng-nest-ui-back-top.mjs +95 -103
  559. package/fesm2022/ng-nest-ui-back-top.mjs.map +1 -1
  560. package/fesm2022/ng-nest-ui-badge.mjs +161 -96
  561. package/fesm2022/ng-nest-ui-badge.mjs.map +1 -1
  562. package/fesm2022/ng-nest-ui-base-form.mjs +286 -166
  563. package/fesm2022/ng-nest-ui-base-form.mjs.map +1 -1
  564. package/fesm2022/ng-nest-ui-button.mjs +376 -175
  565. package/fesm2022/ng-nest-ui-button.mjs.map +1 -1
  566. package/fesm2022/ng-nest-ui-calendar.mjs +134 -108
  567. package/fesm2022/ng-nest-ui-calendar.mjs.map +1 -1
  568. package/fesm2022/ng-nest-ui-card.mjs +67 -36
  569. package/fesm2022/ng-nest-ui-card.mjs.map +1 -1
  570. package/fesm2022/ng-nest-ui-carousel.mjs +365 -223
  571. package/fesm2022/ng-nest-ui-carousel.mjs.map +1 -1
  572. package/fesm2022/ng-nest-ui-cascade.mjs +318 -249
  573. package/fesm2022/ng-nest-ui-cascade.mjs.map +1 -1
  574. package/fesm2022/ng-nest-ui-checkbox.mjs +203 -155
  575. package/fesm2022/ng-nest-ui-checkbox.mjs.map +1 -1
  576. package/fesm2022/ng-nest-ui-collapse.mjs +202 -106
  577. package/fesm2022/ng-nest-ui-collapse.mjs.map +1 -1
  578. package/fesm2022/ng-nest-ui-color-picker.mjs +316 -270
  579. package/fesm2022/ng-nest-ui-color-picker.mjs.map +1 -1
  580. package/fesm2022/ng-nest-ui-color.mjs +73 -54
  581. package/fesm2022/ng-nest-ui-color.mjs.map +1 -1
  582. package/fesm2022/ng-nest-ui-comment.mjs +44 -108
  583. package/fesm2022/ng-nest-ui-comment.mjs.map +1 -1
  584. package/fesm2022/ng-nest-ui-container.mjs +119 -123
  585. package/fesm2022/ng-nest-ui-container.mjs.map +1 -1
  586. package/fesm2022/ng-nest-ui-core.mjs +985 -664
  587. package/fesm2022/ng-nest-ui-core.mjs.map +1 -1
  588. package/fesm2022/ng-nest-ui-crumb.mjs +28 -55
  589. package/fesm2022/ng-nest-ui-crumb.mjs.map +1 -1
  590. package/fesm2022/ng-nest-ui-date-picker.mjs +1552 -1671
  591. package/fesm2022/ng-nest-ui-date-picker.mjs.map +1 -1
  592. package/fesm2022/ng-nest-ui-description.mjs +218 -109
  593. package/fesm2022/ng-nest-ui-description.mjs.map +1 -1
  594. package/fesm2022/ng-nest-ui-dialog.mjs +307 -316
  595. package/fesm2022/ng-nest-ui-dialog.mjs.map +1 -1
  596. package/fesm2022/ng-nest-ui-doc.mjs +14 -15
  597. package/fesm2022/ng-nest-ui-doc.mjs.map +1 -1
  598. package/fesm2022/ng-nest-ui-drag.mjs +20 -39
  599. package/fesm2022/ng-nest-ui-drag.mjs.map +1 -1
  600. package/fesm2022/ng-nest-ui-drawer.mjs +116 -145
  601. package/fesm2022/ng-nest-ui-drawer.mjs.map +1 -1
  602. package/fesm2022/ng-nest-ui-dropdown.mjs +223 -238
  603. package/fesm2022/ng-nest-ui-dropdown.mjs.map +1 -1
  604. package/fesm2022/ng-nest-ui-empty.mjs +49 -46
  605. package/fesm2022/ng-nest-ui-empty.mjs.map +1 -1
  606. package/fesm2022/ng-nest-ui-examples.mjs +14 -15
  607. package/fesm2022/ng-nest-ui-examples.mjs.map +1 -1
  608. package/fesm2022/ng-nest-ui-find.mjs +422 -425
  609. package/fesm2022/ng-nest-ui-find.mjs.map +1 -1
  610. package/fesm2022/ng-nest-ui-form.mjs +218 -203
  611. package/fesm2022/ng-nest-ui-form.mjs.map +1 -1
  612. package/fesm2022/ng-nest-ui-highlight.mjs +93 -81
  613. package/fesm2022/ng-nest-ui-highlight.mjs.map +1 -1
  614. package/fesm2022/ng-nest-ui-i18n.mjs +5892 -3516
  615. package/fesm2022/ng-nest-ui-i18n.mjs.map +1 -1
  616. package/fesm2022/ng-nest-ui-icon.mjs +112 -120
  617. package/fesm2022/ng-nest-ui-icon.mjs.map +1 -1
  618. package/fesm2022/ng-nest-ui-image.mjs +244 -147
  619. package/fesm2022/ng-nest-ui-image.mjs.map +1 -1
  620. package/fesm2022/ng-nest-ui-inner.mjs +33 -35
  621. package/fesm2022/ng-nest-ui-inner.mjs.map +1 -1
  622. package/fesm2022/ng-nest-ui-input-number.mjs +198 -146
  623. package/fesm2022/ng-nest-ui-input-number.mjs.map +1 -1
  624. package/fesm2022/ng-nest-ui-input.mjs +340 -292
  625. package/fesm2022/ng-nest-ui-input.mjs.map +1 -1
  626. package/fesm2022/ng-nest-ui-keyword.mjs +78 -82
  627. package/fesm2022/ng-nest-ui-keyword.mjs.map +1 -1
  628. package/fesm2022/ng-nest-ui-layout.mjs +151 -140
  629. package/fesm2022/ng-nest-ui-layout.mjs.map +1 -1
  630. package/fesm2022/ng-nest-ui-link.mjs +119 -86
  631. package/fesm2022/ng-nest-ui-link.mjs.map +1 -1
  632. package/fesm2022/ng-nest-ui-list.mjs +376 -400
  633. package/fesm2022/ng-nest-ui-list.mjs.map +1 -1
  634. package/fesm2022/ng-nest-ui-loading.mjs +94 -97
  635. package/fesm2022/ng-nest-ui-loading.mjs.map +1 -1
  636. package/fesm2022/ng-nest-ui-menu.mjs +131 -167
  637. package/fesm2022/ng-nest-ui-menu.mjs.map +1 -1
  638. package/fesm2022/ng-nest-ui-message-box.mjs +13 -13
  639. package/fesm2022/ng-nest-ui-message-box.mjs.map +1 -1
  640. package/fesm2022/ng-nest-ui-message.mjs +17 -17
  641. package/fesm2022/ng-nest-ui-message.mjs.map +1 -1
  642. package/fesm2022/ng-nest-ui-notification.mjs +18 -18
  643. package/fesm2022/ng-nest-ui-notification.mjs.map +1 -1
  644. package/fesm2022/ng-nest-ui-outlet.mjs +16 -18
  645. package/fesm2022/ng-nest-ui-outlet.mjs.map +1 -1
  646. package/fesm2022/ng-nest-ui-page-header.mjs +44 -55
  647. package/fesm2022/ng-nest-ui-page-header.mjs.map +1 -1
  648. package/fesm2022/ng-nest-ui-pagination.mjs +173 -236
  649. package/fesm2022/ng-nest-ui-pagination.mjs.map +1 -1
  650. package/fesm2022/ng-nest-ui-pattern.mjs +16 -17
  651. package/fesm2022/ng-nest-ui-pattern.mjs.map +1 -1
  652. package/fesm2022/ng-nest-ui-popconfirm.mjs +110 -107
  653. package/fesm2022/ng-nest-ui-popconfirm.mjs.map +1 -1
  654. package/fesm2022/ng-nest-ui-popover.mjs +163 -215
  655. package/fesm2022/ng-nest-ui-popover.mjs.map +1 -1
  656. package/fesm2022/ng-nest-ui-portal.mjs +7 -7
  657. package/fesm2022/ng-nest-ui-portal.mjs.map +1 -1
  658. package/fesm2022/ng-nest-ui-progress.mjs +240 -238
  659. package/fesm2022/ng-nest-ui-progress.mjs.map +1 -1
  660. package/fesm2022/ng-nest-ui-radio.mjs +184 -127
  661. package/fesm2022/ng-nest-ui-radio.mjs.map +1 -1
  662. package/fesm2022/ng-nest-ui-rate.mjs +182 -108
  663. package/fesm2022/ng-nest-ui-rate.mjs.map +1 -1
  664. package/fesm2022/ng-nest-ui-resizable.mjs +46 -91
  665. package/fesm2022/ng-nest-ui-resizable.mjs.map +1 -1
  666. package/fesm2022/ng-nest-ui-result.mjs +38 -34
  667. package/fesm2022/ng-nest-ui-result.mjs.map +1 -1
  668. package/fesm2022/ng-nest-ui-ripple.mjs +66 -48
  669. package/fesm2022/ng-nest-ui-ripple.mjs.map +1 -1
  670. package/fesm2022/ng-nest-ui-select.mjs +547 -459
  671. package/fesm2022/ng-nest-ui-select.mjs.map +1 -1
  672. package/fesm2022/ng-nest-ui-skeleton.mjs +44 -52
  673. package/fesm2022/ng-nest-ui-skeleton.mjs.map +1 -1
  674. package/fesm2022/ng-nest-ui-slider-select.mjs +344 -290
  675. package/fesm2022/ng-nest-ui-slider-select.mjs.map +1 -1
  676. package/fesm2022/ng-nest-ui-slider.mjs +163 -228
  677. package/fesm2022/ng-nest-ui-slider.mjs.map +1 -1
  678. package/fesm2022/ng-nest-ui-statistic.mjs +102 -68
  679. package/fesm2022/ng-nest-ui-statistic.mjs.map +1 -1
  680. package/fesm2022/ng-nest-ui-steps.mjs +61 -102
  681. package/fesm2022/ng-nest-ui-steps.mjs.map +1 -1
  682. package/fesm2022/ng-nest-ui-switch.mjs +145 -69
  683. package/fesm2022/ng-nest-ui-switch.mjs.map +1 -1
  684. package/fesm2022/ng-nest-ui-table.mjs +784 -800
  685. package/fesm2022/ng-nest-ui-table.mjs.map +1 -1
  686. package/fesm2022/ng-nest-ui-tabs.mjs +185 -259
  687. package/fesm2022/ng-nest-ui-tabs.mjs.map +1 -1
  688. package/fesm2022/ng-nest-ui-tag.mjs +63 -101
  689. package/fesm2022/ng-nest-ui-tag.mjs.map +1 -1
  690. package/fesm2022/ng-nest-ui-text-retract.mjs +52 -64
  691. package/fesm2022/ng-nest-ui-text-retract.mjs.map +1 -1
  692. package/fesm2022/ng-nest-ui-textarea.mjs +173 -126
  693. package/fesm2022/ng-nest-ui-textarea.mjs.map +1 -1
  694. package/fesm2022/ng-nest-ui-theme.mjs +123 -129
  695. package/fesm2022/ng-nest-ui-theme.mjs.map +1 -1
  696. package/fesm2022/ng-nest-ui-time-ago.mjs +16 -15
  697. package/fesm2022/ng-nest-ui-time-ago.mjs.map +1 -1
  698. package/fesm2022/ng-nest-ui-time-picker.mjs +498 -463
  699. package/fesm2022/ng-nest-ui-time-picker.mjs.map +1 -1
  700. package/fesm2022/ng-nest-ui-time-range.mjs +14 -14
  701. package/fesm2022/ng-nest-ui-time-range.mjs.map +1 -1
  702. package/fesm2022/ng-nest-ui-timeline.mjs +44 -68
  703. package/fesm2022/ng-nest-ui-timeline.mjs.map +1 -1
  704. package/fesm2022/ng-nest-ui-tooltip.mjs +168 -170
  705. package/fesm2022/ng-nest-ui-tooltip.mjs.map +1 -1
  706. package/fesm2022/ng-nest-ui-transfer.mjs +311 -262
  707. package/fesm2022/ng-nest-ui-transfer.mjs.map +1 -1
  708. package/fesm2022/ng-nest-ui-tree-file.mjs +80 -99
  709. package/fesm2022/ng-nest-ui-tree-file.mjs.map +1 -1
  710. package/fesm2022/ng-nest-ui-tree-select.mjs +527 -495
  711. package/fesm2022/ng-nest-ui-tree-select.mjs.map +1 -1
  712. package/fesm2022/ng-nest-ui-tree.mjs +601 -587
  713. package/fesm2022/ng-nest-ui-tree.mjs.map +1 -1
  714. package/fesm2022/ng-nest-ui-typography.mjs +26 -22
  715. package/fesm2022/ng-nest-ui-typography.mjs.map +1 -1
  716. package/fesm2022/ng-nest-ui-upload.mjs +204 -220
  717. package/fesm2022/ng-nest-ui-upload.mjs.map +1 -1
  718. package/fesm2022/ng-nest-ui.mjs +0 -2
  719. package/fesm2022/ng-nest-ui.mjs.map +1 -1
  720. package/find/find.component.d.ts +30 -34
  721. package/find/find.property.d.ts +321 -108
  722. package/form/control.component.d.ts +37 -18
  723. package/form/form.component.d.ts +8 -10
  724. package/form/form.property.d.ts +111 -27
  725. package/highlight/highlight.component.d.ts +10 -17
  726. package/highlight/highlight.property.d.ts +40 -11
  727. package/highlight/highlight.service.d.ts +8 -0
  728. package/highlight/public-api.d.ts +1 -0
  729. package/i18n/i18n.directive.d.ts +6 -9
  730. package/i18n/i18n.property.d.ts +6 -2
  731. package/i18n/i18n.service.d.ts +2 -2
  732. package/i18n/languages/ar_EG.d.ts +56 -0
  733. package/i18n/languages/bg_BG.d.ts +56 -0
  734. package/i18n/languages/ca_ES.d.ts +56 -0
  735. package/i18n/languages/cs_CZ.d.ts +56 -0
  736. package/i18n/languages/da_DK.d.ts +56 -0
  737. package/i18n/languages/de_DE.d.ts +56 -0
  738. package/i18n/languages/el_GR.d.ts +56 -0
  739. package/i18n/languages/en_GB.d.ts +3 -0
  740. package/i18n/languages/en_US.d.ts +3 -0
  741. package/i18n/languages/es_ES.d.ts +56 -0
  742. package/i18n/languages/et_EE.d.ts +56 -0
  743. package/i18n/languages/fa_IR.d.ts +56 -0
  744. package/i18n/languages/fi_FI.d.ts +56 -0
  745. package/i18n/languages/fr_BE.d.ts +60 -4
  746. package/i18n/languages/fr_FR.d.ts +56 -0
  747. package/i18n/languages/he_IL.d.ts +56 -0
  748. package/i18n/languages/hi_IN.d.ts +56 -0
  749. package/i18n/languages/hr_HR.d.ts +56 -0
  750. package/i18n/languages/hu_HU.d.ts +56 -0
  751. package/i18n/languages/hy_AM.d.ts +56 -0
  752. package/i18n/languages/id_ID.d.ts +56 -0
  753. package/i18n/languages/is_IS.d.ts +56 -0
  754. package/i18n/languages/it_IT.d.ts +56 -0
  755. package/i18n/languages/ja_JP.d.ts +56 -0
  756. package/i18n/languages/ka_GE.d.ts +56 -0
  757. package/i18n/languages/kn_IN.d.ts +56 -0
  758. package/i18n/languages/ko_KR.d.ts +56 -0
  759. package/i18n/languages/ku_IQ.d.ts +32 -0
  760. package/i18n/languages/lv_LV.d.ts +56 -0
  761. package/i18n/languages/mn_MN.d.ts +56 -0
  762. package/i18n/languages/ms_MY.d.ts +56 -0
  763. package/i18n/languages/nb_NO.d.ts +56 -0
  764. package/i18n/languages/ne_NP.d.ts +56 -0
  765. package/i18n/languages/nl_BE.d.ts +56 -0
  766. package/i18n/languages/nl_NL.d.ts +56 -0
  767. package/i18n/languages/pl_PL.d.ts +56 -0
  768. package/i18n/languages/pt_BR.d.ts +56 -0
  769. package/i18n/languages/pt_PT.d.ts +56 -0
  770. package/i18n/languages/ro_RO.d.ts +56 -0
  771. package/i18n/languages/ru_RU.d.ts +56 -0
  772. package/i18n/languages/sk_SK.d.ts +56 -1
  773. package/i18n/languages/sl_SI.d.ts +56 -0
  774. package/i18n/languages/sr_RS.d.ts +56 -0
  775. package/i18n/languages/sv_SE.d.ts +56 -0
  776. package/i18n/languages/ta_IN.d.ts +56 -0
  777. package/i18n/languages/th_TH.d.ts +56 -0
  778. package/i18n/languages/tr_TR.d.ts +56 -0
  779. package/i18n/languages/uk_UA.d.ts +56 -0
  780. package/i18n/languages/vi_VN.d.ts +56 -0
  781. package/i18n/languages/zh_CN.d.ts +3 -0
  782. package/i18n/languages/zh_TW.d.ts +3 -0
  783. package/icon/icon.component.d.ts +8 -14
  784. package/icon/icon.property.d.ts +31 -13
  785. package/icon/icon.service.d.ts +1 -1
  786. package/image/image-group.component.d.ts +1 -3
  787. package/image/image-preview.component.d.ts +11 -13
  788. package/image/image.component.d.ts +10 -11
  789. package/image/image.property.d.ts +117 -16
  790. package/index.d.ts +0 -2
  791. package/inner/inner.component.d.ts +3 -10
  792. package/inner/inner.property.d.ts +8 -4
  793. package/input/input-group.component.d.ts +0 -2
  794. package/input/input.component.d.ts +32 -30
  795. package/input/input.property.d.ts +347 -65
  796. package/input-number/input-number.component.d.ts +14 -19
  797. package/input-number/input-number.property.d.ts +292 -26
  798. package/keyword/keyword.directive.d.ts +4 -12
  799. package/keyword/keyword.property.d.ts +11 -7
  800. package/layout/col.component.d.ts +8 -11
  801. package/layout/layout.property.d.ts +25 -18
  802. package/layout/row.component.d.ts +7 -8
  803. package/link/link.component.d.ts +7 -13
  804. package/link/link.property.d.ts +64 -11
  805. package/list/list-drop-group.directive.d.ts +3 -5
  806. package/list/list-option.component.d.ts +7 -9
  807. package/list/list.component.d.ts +35 -30
  808. package/list/list.property.d.ts +126 -61
  809. package/loading/loading.component.d.ts +12 -12
  810. package/loading/loading.property.d.ts +20 -11
  811. package/menu/menu-node.component.d.ts +11 -8
  812. package/menu/menu.component.d.ts +18 -19
  813. package/menu/menu.property.d.ts +23 -28
  814. package/message/message.property.d.ts +1 -1
  815. package/notification/notification.property.d.ts +1 -1
  816. package/outlet/outlet.directive.d.ts +4 -4
  817. package/outlet/outlet.property.d.ts +1 -1
  818. package/package.json +78 -84
  819. package/page-header/page-header.component.d.ts +4 -8
  820. package/page-header/page-header.property.d.ts +11 -8
  821. package/pagination/pagination.component.d.ts +15 -22
  822. package/pagination/pagination.property.d.ts +34 -66
  823. package/pattern/pattern.component.d.ts +2 -5
  824. package/pattern/pattern.property.d.ts +1 -1
  825. package/popconfirm/popconfirm.component.d.ts +12 -14
  826. package/popconfirm/popconfirm.property.d.ts +32 -19
  827. package/popover/popover-portal.component.d.ts +16 -33
  828. package/popover/popover.directive.d.ts +6 -12
  829. package/popover/popover.property.d.ts +31 -22
  830. package/portal/portal.property.d.ts +2 -2
  831. package/portal/portal.service.d.ts +2 -2
  832. package/progress/progress.component.d.ts +25 -30
  833. package/progress/progress.property.d.ts +29 -20
  834. package/radio/radio.component.d.ts +14 -15
  835. package/radio/radio.property.d.ts +271 -31
  836. package/rate/rate.component.d.ts +14 -17
  837. package/rate/rate.property.d.ts +259 -12
  838. package/resizable/resizable.directive.d.ts +5 -5
  839. package/resizable/resizable.property.d.ts +14 -14
  840. package/result/result.component.d.ts +5 -7
  841. package/result/result.property.d.ts +11 -7
  842. package/ripple/ripple.directive.d.ts +5 -4
  843. package/ripple/ripple.property.d.ts +14 -5
  844. package/select/select-portal.component.d.ts +39 -43
  845. package/select/select.component.d.ts +53 -56
  846. package/select/select.property.d.ts +317 -37
  847. package/skeleton/skeleton.component.d.ts +4 -8
  848. package/skeleton/skeleton.property.d.ts +17 -8
  849. package/slider/slider.component.d.ts +34 -31
  850. package/slider/slider.property.d.ts +26 -22
  851. package/slider-select/slider-select.component.d.ts +38 -38
  852. package/slider-select/slider-select.property.d.ts +302 -28
  853. package/statistic/countdown.component.d.ts +2 -5
  854. package/statistic/statistic.component.d.ts +3 -8
  855. package/statistic/statistic.property.d.ts +44 -13
  856. package/steps/steps.component.d.ts +6 -16
  857. package/steps/steps.property.d.ts +15 -10
  858. package/style/core/index.css +0 -38
  859. package/style/core/index.css.map +1 -1
  860. package/style/core/var.scss +0 -4
  861. package/style/mixins/compatibility.scss +0 -1
  862. package/style/mixins/form.scss +8 -2
  863. package/style/params/index.scss +0 -1
  864. package/style/params/primary.scss +7 -28
  865. package/switch/switch.component.d.ts +9 -10
  866. package/switch/switch.property.d.ts +265 -16
  867. package/table/table-body.component.d.ts +21 -20
  868. package/table/table-foot.component.d.ts +7 -5
  869. package/table/table-head.component.d.ts +17 -19
  870. package/table/table.component.d.ts +62 -50
  871. package/table/table.property.d.ts +180 -178
  872. package/tabs/tab-content.component.d.ts +6 -8
  873. package/tabs/tab.component.d.ts +3 -5
  874. package/tabs/tabs.component.d.ts +17 -24
  875. package/tabs/tabs.property.d.ts +28 -24
  876. package/tag/tag.component.d.ts +7 -8
  877. package/tag/tag.property.d.ts +19 -21
  878. package/text-retract/text-retract.component.d.ts +4 -14
  879. package/text-retract/text-retract.property.d.ts +9 -5
  880. package/textarea/textarea.component.d.ts +17 -20
  881. package/textarea/textarea.property.d.ts +266 -30
  882. package/theme/theme.component.d.ts +24 -13
  883. package/theme/theme.property.d.ts +67 -16
  884. package/time-ago/time-ago.pipe.d.ts +7 -3
  885. package/time-ago/time-ago.property.d.ts +1 -1
  886. package/time-picker/time-picker-frame.component.d.ts +52 -39
  887. package/time-picker/time-picker-portal.component.d.ts +29 -29
  888. package/time-picker/time-picker.component.d.ts +29 -30
  889. package/time-picker/time-picker.property.d.ts +314 -23
  890. package/time-range/time-range.property.d.ts +1 -1
  891. package/timeline/timeline.component.d.ts +5 -13
  892. package/timeline/timeline.property.d.ts +12 -8
  893. package/tooltip/tooltip-portal.component.d.ts +23 -29
  894. package/tooltip/tooltip.directive.d.ts +10 -9
  895. package/tooltip/tooltip.property.d.ts +18 -14
  896. package/transfer/transfer.component.d.ts +23 -20
  897. package/transfer/transfer.property.d.ts +81 -25
  898. package/tree/tree-node.component.d.ts +21 -21
  899. package/tree/tree.component.d.ts +29 -28
  900. package/tree/tree.property.d.ts +129 -79
  901. package/tree-file/tree-file.component.d.ts +7 -9
  902. package/tree-file/tree-file.property.d.ts +40 -16
  903. package/tree-select/tree-select-portal.component.d.ts +38 -49
  904. package/tree-select/tree-select.component.d.ts +50 -53
  905. package/tree-select/tree-select.property.d.ts +328 -39
  906. package/typography/typography.component.d.ts +1 -1
  907. package/typography/typography.property.d.ts +3 -3
  908. package/upload/upload-portal.component.d.ts +14 -14
  909. package/upload/upload.component.d.ts +18 -17
  910. package/upload/upload.property.d.ts +73 -24
  911. package/border/border.component.d.ts +0 -11
  912. package/border/border.module.d.ts +0 -7
  913. package/border/border.property.d.ts +0 -6
  914. package/border/index.d.ts +0 -5
  915. package/border/public-api.d.ts +0 -3
  916. package/esm2022/border/border.component.mjs +0 -21
  917. package/esm2022/border/border.module.mjs +0 -16
  918. package/esm2022/border/border.property.mjs +0 -7
  919. package/esm2022/border/ng-nest-ui-border.mjs +0 -5
  920. package/esm2022/border/public-api.mjs +0 -4
  921. package/fesm2022/ng-nest-ui-border.mjs +0 -47
  922. package/fesm2022/ng-nest-ui-border.mjs.map +0 -1
  923. package/style/params/colors.scss +0 -38
@@ -1,185 +1,216 @@
1
- import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ViewChildren } from '@angular/core';
1
+ import { Component, ViewEncapsulation, ElementRef, ChangeDetectionStrategy, viewChild, viewChildren, signal, computed, inject, effect } from '@angular/core';
2
2
  import { XTreePrefix, XTreeProperty } from './tree.property';
3
- import { XIsEmpty, XIsFunction, XIsUndefined, XIsChange, XSetData, XResize, XRemove } from '@ng-nest/ui/core';
4
- import { debounceTime, map, Subject, takeUntil } from 'rxjs';
5
- import { ScrollingModule } from '@angular/cdk/scrolling';
3
+ import { XIsEmpty, XIsFunction, XIsUndefined, XIsChange, XSetData, XResize, XRemove, XComputedStyle, XToCssPx } from '@ng-nest/ui/core';
4
+ import { debounceTime, map, Subject } from 'rxjs';
5
+ import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
6
6
  import { XTreeNodeComponent } from './tree-node.component';
7
- import { DragDropModule } from '@angular/cdk/drag-drop';
7
+ import { CdkDropList, DragDropModule } from '@angular/cdk/drag-drop';
8
8
  import { XIconComponent } from '@ng-nest/ui/icon';
9
+ import { DOCUMENT } from '@angular/common';
9
10
  import * as i0 from "@angular/core";
10
- import * as i1 from "@ng-nest/ui/core";
11
- import * as i2 from "./tree.service";
12
- import * as i3 from "@angular/cdk/drag-drop";
13
- import * as i4 from "@angular/cdk/scrolling";
11
+ import * as i1 from "./tree.service";
12
+ import * as i2 from "@angular/cdk/drag-drop";
13
+ import * as i3 from "@angular/cdk/scrolling";
14
14
  export class XTreeComponent extends XTreeProperty {
15
- set _nodeComponents(value) {
16
- this.nodeComponents = value;
17
- }
18
- get isEmpty() {
19
- return XIsEmpty(this.nodes);
20
- }
21
- constructor(renderer, elementRef, cdr, configService, ngZone, treeService) {
15
+ constructor(renderer, elementRef, cdr, treeService) {
22
16
  super();
23
17
  this.renderer = renderer;
24
18
  this.elementRef = elementRef;
25
19
  this.cdr = cdr;
26
- this.configService = configService;
27
- this.ngZone = ngZone;
28
20
  this.treeService = treeService;
29
- this.nodes = [];
30
- this.virtualNodes = [];
31
- this.dataIsFunc = false;
32
- this.getting = false;
33
- this.treeData = [];
34
- this.dragging = false;
35
- this.draggingTreeNode = null;
36
- this.hasChecked = false;
37
- this._unSubject = new Subject();
21
+ this.tree = viewChild('tree', { read: (ElementRef) });
22
+ this.virtualBody = viewChild('virtualBody', { read: CdkVirtualScrollViewport });
23
+ this.dropList = viewChild('dropList', { read: (CdkDropList) });
24
+ this.nodeComponents = viewChildren(XTreeNodeComponent);
25
+ this.document = inject(DOCUMENT);
26
+ this.fontSize = computed(() => parseFloat(XComputedStyle(this.document.documentElement, 'font-size')));
27
+ this.nodes = signal([]);
28
+ this.virtualNodes = signal([]);
29
+ this.activatedNode = signal(null);
30
+ this.dataIsFunc = signal(false);
31
+ this.getting = signal(false);
32
+ this.treeData = signal([]);
33
+ this.dragging = signal(false);
34
+ this.dragPosition = signal(-1);
35
+ this.hoverTreeNode = signal(null);
36
+ this.draggingTreeNode = signal(null);
37
+ this.hasChecked = signal(false);
38
+ this.isEmpty = computed(() => XIsEmpty(this.nodes()));
39
+ this.unSubject = new Subject();
40
+ this.heightAdaptionSignal = signal(0);
41
+ this.isVirtualScrollAdaption = computed(() => {
42
+ return !!(this.virtualScroll() && this.heightAdaption());
43
+ });
44
+ this.virtualScrollHeightSignal = computed(() => {
45
+ if (this.isVirtualScrollAdaption()) {
46
+ return this.heightAdaptionSignal();
47
+ }
48
+ else {
49
+ return XToCssPx(this.virtualScrollHeight(), this.fontSize());
50
+ }
51
+ });
52
+ this.minBufferPxSignal = computed(() => {
53
+ if (this.isVirtualScrollAdaption()) {
54
+ return this.virtualScrollHeightSignal();
55
+ }
56
+ else {
57
+ return this.minBufferPx();
58
+ }
59
+ });
60
+ this.maxBufferPxSignal = computed(() => {
61
+ if (this.isVirtualScrollAdaption()) {
62
+ return this.virtualScrollHeightSignal() * 1.2;
63
+ }
64
+ else {
65
+ return this.maxBufferPx();
66
+ }
67
+ });
68
+ effect(() => {
69
+ const virtualBody = this.virtualBody();
70
+ if (virtualBody) {
71
+ virtualBody['_scrollStrategy']['_minBufferPx'] = this.minBufferPxSignal();
72
+ virtualBody['_scrollStrategy']['_maxBufferPx'] = this.maxBufferPxSignal();
73
+ }
74
+ });
38
75
  }
39
76
  ngOnChanges(changes) {
40
- const { expandedAll, data, activatedId, checked, manual } = changes;
77
+ const { expandedAll, data, checked, manual } = changes;
41
78
  XIsChange(data) && this.setData();
42
- XIsChange(activatedId) && this.setActivatedNode(this.treeData);
43
79
  XIsChange(expandedAll) && this.setExpandedAll();
44
- XIsChange(checked) && this.setCheckedKeys(this.checked);
80
+ XIsChange(checked) && this.setCheckedKeys(this.checked());
45
81
  XIsChange(manual) && this.setManual();
46
82
  }
47
83
  ngAfterViewInit() {
48
- if (this.virtualScroll && this.heightAdaption) {
49
- this.setVirtualScrollHeight();
50
- XResize(this.heightAdaption)
51
- .pipe(debounceTime(30), takeUntil(this._unSubject))
52
- .subscribe((x) => {
53
- this._resizeObserver = x.resizeObserver;
54
- this.setVirtualScrollHeight();
55
- });
84
+ if (this.isVirtualScrollAdaption()) {
85
+ this.heightAdaptionSignal.set(this.heightAdaption().clientHeight);
86
+ XResize(this.heightAdaption())
87
+ .pipe(debounceTime(30), map(({ resizeObserver }) => {
88
+ this.resizeObserver = resizeObserver;
89
+ this.heightAdaptionSignal.set(this.heightAdaption().clientHeight);
90
+ }))
91
+ .subscribe();
56
92
  }
57
- this.setScorllTop();
93
+ this.setActivatedNode(this.treeData());
94
+ this.setScrollTop();
58
95
  }
59
96
  ngOnDestroy() {
60
- this._unSubject.next();
61
- this._unSubject.unsubscribe();
62
- this._resizeObserver?.disconnect();
97
+ this.unSubject.next();
98
+ this.unSubject.complete();
99
+ this.resizeObserver?.disconnect();
63
100
  }
64
101
  setData() {
65
- if (typeof this.data === 'undefined')
102
+ if (typeof this.data() === 'undefined')
66
103
  return;
67
- this.dataIsFunc = false;
68
- if (XIsFunction(this.data)) {
69
- this.dataIsFunc = true;
104
+ this.dataIsFunc.set(false);
105
+ if (XIsFunction(this.data())) {
106
+ this.dataIsFunc.set(true);
70
107
  this.getDataByFunc();
71
108
  }
72
109
  else {
73
- XSetData(this.data, this._unSubject).subscribe((x) => {
110
+ XSetData(this.data(), this.unSubject).subscribe((x) => {
74
111
  this.setDataChange(x);
75
112
  });
76
113
  }
77
114
  }
78
115
  cdkDragStarted(event) {
79
- this.dragging = true;
80
- this.draggingTreeNode = event.source.data;
116
+ this.dragging.set(true);
117
+ this.draggingTreeNode.set(event.source.data);
81
118
  if (event.source.data.open) {
82
119
  this.onToggle(event.event, event.source.data);
83
120
  }
84
- this.nodeDragStarted.emit({ event, from: this.draggingTreeNode });
121
+ this.nodeDragStarted.emit({ event, from: this.draggingTreeNode() });
85
122
  }
86
123
  cdkDragEnded(event) {
87
- this.dragging = false;
88
- if (this.hoverTreeNode) {
89
- if (this.hoverTreeNode.id !== event.source.data.id) {
90
- this.insertNode(event.source.data, this.hoverTreeNode, this.dragPosition);
124
+ this.dragging.set(false);
125
+ const hoverTreeNode = this.hoverTreeNode();
126
+ if (hoverTreeNode) {
127
+ if (hoverTreeNode.id !== event.source.data.id) {
128
+ this.insertNode(event.source.data, hoverTreeNode, this.dragPosition());
91
129
  }
92
- this.hoverTreeNode.change && this.hoverTreeNode.change();
130
+ hoverTreeNode.change && hoverTreeNode.change();
93
131
  this.nodeDragEnded.emit({
94
132
  event,
95
133
  from: event.source.data,
96
- to: this.hoverTreeNode,
97
- position: this.dragPosition
134
+ to: hoverTreeNode,
135
+ position: this.dragPosition()
98
136
  });
99
137
  }
100
138
  }
101
139
  insertNode(dragNode, hoverNode, dragPosition) {
102
- let parent = this.nodes.find((x) => x.id === dragNode.pid);
103
- this.treeService.moveNode(this.treeData, dragNode, hoverNode, dragPosition);
104
- this.setDataChange(this.treeData, true, false, true, parent);
140
+ let parent = this.nodes().find((x) => x.id === dragNode.pid);
141
+ this.treeService.moveNode(this.treeData(), dragNode, hoverNode, dragPosition);
142
+ this.setDataChange(this.treeData(), true, false, true, parent);
105
143
  }
106
144
  cdkDragMoved(event) {
107
- if (!this.dragging || !this.hoverTreeNode)
145
+ const hoverTreeNode = this.hoverTreeNode();
146
+ if (!this.dragging() || !hoverTreeNode)
108
147
  return;
109
148
  const y = event.pointerPosition.y;
110
- if (event.source.data.id === this.hoverTreeNode.id)
149
+ if (event.source.data.id === hoverTreeNode.id)
111
150
  return;
112
151
  const target = this.hoverTreeEle.nativeElement;
113
152
  const { top, height } = target.getBoundingClientRect();
114
153
  const des = Math.max(height * 0.5, 2);
115
154
  if (y > top && y < top + des) {
116
- this.dragPosition = -1;
155
+ this.dragPosition.set(-1);
117
156
  }
118
157
  else if (y > top + des && y < top + height) {
119
- this.dragPosition = 1;
158
+ this.dragPosition.set(1);
120
159
  }
121
- this.hoverTreeNode.change && this.hoverTreeNode.change();
160
+ hoverTreeNode.change && hoverTreeNode.change();
122
161
  this.nodeDragMoved.emit({
123
162
  event,
124
- from: this.draggingTreeNode,
125
- to: this.hoverTreeNode,
126
- position: this.dragPosition
163
+ from: this.draggingTreeNode(),
164
+ to: hoverTreeNode,
165
+ position: this.dragPosition()
127
166
  });
128
167
  }
129
168
  predicate(_drag, _drop) {
130
169
  return true;
131
170
  }
132
- setVirtualScrollHeight() {
133
- this.virtualScrollHeight = this.heightAdaption.clientHeight;
134
- this.minBufferPx = this.virtualScrollHeight;
135
- this.maxBufferPx = this.virtualScrollHeight * 1.2;
136
- this.virtualBody['_scrollStrategy']['_minBufferPx'] = this.minBufferPx;
137
- this.virtualBody['_scrollStrategy']['_maxBufferPx'] = this.maxBufferPx;
138
- this.cdr.detectChanges();
139
- }
140
171
  setManual() {
141
- if (this.dataIsFunc)
172
+ if (this.dataIsFunc())
142
173
  this.getDataByFunc();
143
174
  }
144
175
  getDataByFunc() {
145
- if (!this.manual)
176
+ if (!this.manual())
146
177
  return;
147
- XSetData(this.data(), this._unSubject).subscribe((x) => {
178
+ XSetData(this.data()(), this.unSubject).subscribe((x) => {
148
179
  this.setDataChange(x);
149
180
  });
150
181
  }
151
182
  setDataChange(value, regetChildren = false, init = true, parentOpen = true, lazyParant) {
152
- if (XIsEmpty(this.checked) || !this.hasChecked)
153
- this.checked = [];
183
+ if (XIsEmpty(this.checked()) || !this.hasChecked())
184
+ this.checked.set([]);
154
185
  const getChildren = (node, level) => {
155
186
  if (init) {
156
187
  node.level = level;
157
188
  node.open =
158
- Boolean(this.expandedAll) ||
159
- level <= Number(this.expandedLevel) ||
160
- this.expanded.includes(node.id) ||
161
- node.open;
162
- node.checked = this.checked.includes(node.id) || node.checked;
189
+ this.expandedAll() || level <= this.expandedLevel() || this.expanded().includes(node.id) || node.open;
190
+ node.checked = this.checked().includes(node.id) || node.checked;
163
191
  node.childrenLoaded = node.open;
164
192
  }
165
193
  if (XIsUndefined(node.children) || regetChildren) {
166
194
  node.children = value.filter((y) => y.pid === node.id);
167
- if (this.levelCheck && node.children && node.checked) {
195
+ if (this.levelCheck() && node.children && node.checked) {
168
196
  for (let nd of node.children) {
169
197
  nd.checked = true;
170
- this.checked.push(nd.id);
198
+ this.checked.update((x) => {
199
+ x.push(nd.id);
200
+ return [...x];
201
+ });
171
202
  }
172
203
  }
173
204
  }
174
- if ((!this.lazy && (XIsUndefined(node.leaf) || regetChildren)) || node.id === lazyParant?.id) {
205
+ if ((!this.lazy() && (XIsUndefined(node.leaf) || regetChildren)) || node.id === lazyParant?.id) {
175
206
  node.leaf = node.children?.length === 0;
176
207
  }
177
208
  if (!node.leaf)
178
209
  node.children?.map((y) => getChildren(y, level + 1));
179
210
  return node;
180
211
  };
181
- this.treeData = value;
182
- this.nodes = value.filter((x) => XIsEmpty(x.pid)).map((x) => getChildren(x, 0));
212
+ this.treeData.set(value);
213
+ this.nodes.set(value.filter((x) => XIsEmpty(x.pid)).map((x) => getChildren(x, 0)));
183
214
  if (parentOpen) {
184
215
  for (let item of value) {
185
216
  if (!item.leaf && item.open) {
@@ -188,51 +219,40 @@ export class XTreeComponent extends XTreeProperty {
188
219
  }
189
220
  }
190
221
  this.setExpanded();
191
- this.cdr.detectChanges();
222
+ this.cdr.markForCheck();
192
223
  }
193
224
  nodeMouseenter($event) {
194
225
  const { node, ele } = $event;
195
- if (!this.dragging)
226
+ if (!this.dragging())
196
227
  return;
197
- let before = this.hoverTreeNode;
198
- this.hoverTreeNode = node;
228
+ let before = this.hoverTreeNode();
229
+ this.hoverTreeNode.set(node);
199
230
  this.hoverTreeEle = ele;
200
- this.hoverTreeNode.change && this.hoverTreeNode.change();
231
+ const hoverTreeNode = this.hoverTreeNode();
232
+ if (hoverTreeNode) {
233
+ hoverTreeNode.change && hoverTreeNode.change();
234
+ }
201
235
  if (before) {
202
236
  before.change && before.change();
203
237
  }
204
238
  if (!node.leaf && !node.open) {
205
- let from = this.nodes.indexOf(this.draggingTreeNode);
206
- let to = this.nodes.indexOf(node);
239
+ let from = this.nodes().indexOf(this.draggingTreeNode());
240
+ let to = this.nodes().indexOf(node);
207
241
  if (to - from !== -1) {
208
242
  this.onToggle(null, node);
209
243
  }
210
- // else {
211
- // let addNodes: XTreeNode[] = [];
212
- // node.open = true;
213
- // const getNodes = (nd: XTreeNode) => {
214
- // if (XIsEmpty(nd.children)) return;
215
- // for (let child of nd.children!) {
216
- // addNodes.push(child);
217
- // child.open && getNodes(child);
218
- // }
219
- // };
220
- // getNodes(node);
221
- // let nodes = [...this.nodes];
222
- // nodes.splice(to + 1, 0, ...addNodes);
223
- // this.nodes = nodes;
224
- // }
225
- }
226
- }
227
- setScorllTop() {
228
- if (!this.scrollElement || !this.activatedNode)
244
+ }
245
+ }
246
+ setScrollTop() {
247
+ const scrollElement = this.scrollElement();
248
+ if (!scrollElement || !this.activatedNode())
229
249
  return;
230
- let inx = this.nodes.indexOf(this.activatedNode);
231
- let com = this.nodeComponents.get(inx);
250
+ const inx = this.nodes().indexOf(this.activatedNode());
251
+ let com = this.nodeComponents().find((_, index) => index === inx);
232
252
  if (!com)
233
253
  return;
234
254
  let ele = com.elementRef.nativeElement;
235
- let scrollEle = this.scrollElement;
255
+ let scrollEle = scrollElement;
236
256
  let min = scrollEle.scrollTop;
237
257
  let max = scrollEle.scrollTop + scrollEle.clientHeight;
238
258
  if (ele.offsetTop + ele.clientHeight > max) {
@@ -255,7 +275,7 @@ export class XTreeComponent extends XTreeProperty {
255
275
  getChildren(x.children);
256
276
  });
257
277
  };
258
- getChildren(this.nodes);
278
+ getChildren(this.nodes());
259
279
  return result;
260
280
  }
261
281
  getCheckedKeys() {
@@ -263,7 +283,7 @@ export class XTreeComponent extends XTreeProperty {
263
283
  }
264
284
  setCheckedKeys(keys = []) {
265
285
  if (!XIsEmpty(keys))
266
- this.hasChecked = true;
286
+ this.hasChecked.set(true);
267
287
  const setChildren = (nodes, clear = false) => {
268
288
  if (XIsEmpty(nodes))
269
289
  return;
@@ -273,48 +293,50 @@ export class XTreeComponent extends XTreeProperty {
273
293
  setChildren(x.children, clear);
274
294
  });
275
295
  };
276
- setChildren(this.nodes, XIsEmpty(keys));
277
- this.cdr.detectChanges();
296
+ setChildren(this.nodes(), XIsEmpty(keys));
297
+ this.cdr.markForCheck();
278
298
  }
279
299
  setExpandedAll() {
280
- if (this.expandedAll && this.treeData.length === this.nodes.length)
300
+ if (this.expandedAll() && this.treeData().length === this.nodes().length)
281
301
  return;
282
302
  const setChildren = (nodes) => {
283
303
  if (XIsEmpty(nodes))
284
304
  return;
285
305
  nodes.forEach((x) => {
286
- x.open = Boolean(this.expandedAll);
306
+ x.open = this.expandedAll();
287
307
  x.change && x.change();
288
308
  setChildren(x.children);
289
309
  });
290
310
  };
291
- setChildren(this.nodes);
292
- if (this.expandedAll === false) {
293
- this.nodes = this.treeData.filter((x) => XIsEmpty(x.pid));
311
+ setChildren(this.nodes());
312
+ if (this.expandedAll() === false) {
313
+ this.nodes.set(this.treeData().filter((x) => XIsEmpty(x.pid)));
294
314
  }
295
315
  else {
296
- if (this.virtualNodes.length === 0) {
297
- this.virtualNodes = [...this.nodes];
316
+ if (this.virtualNodes().length === 0) {
317
+ this.virtualNodes.set([...this.nodes()]);
298
318
  }
299
- this.nodes = [...this.virtualNodes];
300
- for (let item of this.virtualNodes) {
301
- this.setVirtualExpandedAll(item, this.expandedAll);
319
+ this.nodes.set(this.virtualNodes());
320
+ for (let item of this.virtualNodes()) {
321
+ this.setVirtualExpandedAll(item, this.expandedAll());
302
322
  }
303
323
  }
304
- this.virtualBody?.checkViewportSize();
324
+ this.virtualBody()?.checkViewportSize();
305
325
  }
306
326
  setExpanded() {
307
- for (let item of this.nodes) {
327
+ for (let item of this.nodes()) {
308
328
  if (item.open && item.children) {
309
- let index = this.nodes.indexOf(item);
310
- this.nodes.splice(index + 1, 0, ...item.children);
329
+ let index = this.nodes().indexOf(item);
330
+ this.nodes.update((x) => {
331
+ x.splice(index + 1, 0, ...item.children);
332
+ return [...x];
333
+ });
311
334
  }
312
335
  item.change && item.change();
313
336
  }
314
- this.nodes = [...this.nodes];
315
337
  }
316
338
  setVirtualExpandedAll(item, expandedAll) {
317
- let index = this.nodes.indexOf(item);
339
+ let index = this.nodes().indexOf(item);
318
340
  if (expandedAll) {
319
341
  let addNodes = [];
320
342
  const getNodes = (nd) => {
@@ -324,12 +346,14 @@ export class XTreeComponent extends XTreeProperty {
324
346
  }
325
347
  };
326
348
  getNodes(item);
327
- this.nodes.splice(index + 1, 0, ...addNodes);
349
+ this.nodes.update((x) => {
350
+ x.splice(index + 1, 0, ...addNodes);
351
+ return [...x];
352
+ });
328
353
  }
329
- this.nodes = [...this.nodes];
330
354
  }
331
355
  virtualToggle(node) {
332
- let index = this.nodes.indexOf(node);
356
+ let index = this.nodes().indexOf(node);
333
357
  if (node.open) {
334
358
  let addNodes = [];
335
359
  const getNodes = (nd) => {
@@ -341,7 +365,10 @@ export class XTreeComponent extends XTreeProperty {
341
365
  }
342
366
  };
343
367
  getNodes(node);
344
- this.nodes.splice(index + 1, 0, ...addNodes);
368
+ this.nodes.update((x) => {
369
+ x.splice(index + 1, 0, ...addNodes);
370
+ return [...x];
371
+ });
345
372
  }
346
373
  else {
347
374
  let delCount = 0;
@@ -354,51 +381,59 @@ export class XTreeComponent extends XTreeProperty {
354
381
  }
355
382
  };
356
383
  getCount(node);
357
- this.nodes.splice(index + 1, delCount);
384
+ this.nodes.update((x) => {
385
+ x.splice(index + 1, delCount);
386
+ return [...x];
387
+ });
358
388
  }
359
389
  this.addOrRemoveExpanded(node);
360
- this.nodes = [...this.nodes];
361
- this.virtualBody?.checkViewportSize();
390
+ this.virtualBody()?.checkViewportSize();
362
391
  this.cdr.detectChanges();
363
392
  }
364
393
  addOrRemoveExpanded(node) {
365
394
  if (node.open) {
366
- if (!this.expanded.includes(node.id)) {
367
- this.expanded.push(node.id);
395
+ if (!this.expanded().includes(node.id)) {
396
+ this.expanded.update((x) => {
397
+ x.push(node.id);
398
+ return [...x];
399
+ });
368
400
  }
369
401
  }
370
402
  else {
371
- if (this.expanded.includes(node.id)) {
372
- this.expanded.splice(this.expanded.indexOf(node.id), 1);
403
+ if (this.expanded().includes(node.id)) {
404
+ this.expanded.update((x) => {
405
+ x.splice(x.indexOf(node.id), 1);
406
+ return [...x];
407
+ });
373
408
  }
374
409
  }
375
410
  }
376
411
  setActivatedNode(nodes, parentOpen = true, dataChange = true) {
377
- if (XIsEmpty(this.activatedId) && this.multiple) {
378
- this.activatedId = [];
412
+ if (XIsEmpty(this.activatedId()) && this.multiple()) {
413
+ this.activatedId.set([]);
379
414
  }
380
- let before = this.activatedNode;
381
- if (this.multiple) {
382
- if (this.activatedId.length > 0) {
383
- let ids = this.objectArray ? this.activatedId.map((x) => x.id) : this.activatedId;
415
+ let before = this.activatedNode();
416
+ if (this.multiple()) {
417
+ if (this.activatedId().length > 0) {
418
+ let ids = this.objectArray() ? this.activatedId().map((x) => x.id) : this.activatedId();
384
419
  for (let i = 0; i < ids.length; i++) {
385
420
  let node = nodes.find((x) => x.id === ids[i]);
386
421
  if (node) {
387
422
  parentOpen && this.setParentOpen(nodes, node);
388
423
  if (i === ids.length - 1) {
389
- this.activatedNode = node;
390
- this.activatedChange.emit(this.activatedNode);
424
+ this.activatedNode.set(node);
425
+ this.activatedChange.emit(this.activatedNode());
391
426
  }
392
427
  }
393
428
  }
394
429
  }
395
430
  }
396
431
  else {
397
- let activatedId = this.activatedId;
398
- this.activatedNode = nodes.find((x) => x.id == activatedId);
399
- if (this.activatedNode) {
400
- parentOpen && this.setParentOpen(nodes, this.activatedNode);
401
- this.activatedChange.emit(this.activatedNode);
432
+ let activatedId = this.activatedId();
433
+ this.activatedNode.set(nodes.find((x) => x.id === activatedId));
434
+ if (this.activatedNode()) {
435
+ parentOpen && this.setParentOpen(nodes, this.activatedNode());
436
+ this.activatedChange.emit(this.activatedNode());
402
437
  }
403
438
  }
404
439
  if (before) {
@@ -414,24 +449,8 @@ export class XTreeComponent extends XTreeProperty {
414
449
  return;
415
450
  const parent = nodes.find((x) => x.id === child.pid);
416
451
  if (!XIsEmpty(parent)) {
417
- if (!this.expanded.includes(parent.id)) {
418
- this.expanded = [...this.expanded, parent.id];
419
- }
420
- parent.open = true;
421
- parent.change && parent.change();
422
- getParent(parent);
423
- }
424
- };
425
- getParent(node);
426
- }
427
- setParentCheck(nodes, node) {
428
- const getParent = (child) => {
429
- if (XIsEmpty(child.pid))
430
- return;
431
- const parent = nodes.find((x) => x.id === child.pid);
432
- if (!XIsEmpty(parent)) {
433
- if (!this.expanded.includes(parent.id)) {
434
- this.expanded = [...this.expanded, parent.id];
452
+ if (!this.expanded().includes(parent.id)) {
453
+ this.expanded.update((x) => [...x, parent.id]);
435
454
  }
436
455
  parent.open = true;
437
456
  parent.change && parent.change();
@@ -441,22 +460,20 @@ export class XTreeComponent extends XTreeProperty {
441
460
  getParent(node);
442
461
  }
443
462
  onToggle(event, node) {
444
- this.ngZone.run(() => {
445
- node.open = !node.open;
446
- if (this.lazy && !node.childrenLoaded) {
447
- this.getLazyData(node, () => this.virtualToggle(node));
448
- }
449
- else {
450
- this.virtualToggle(node);
451
- }
452
- event?.preventDefault();
453
- event?.stopPropagation();
454
- });
463
+ node.open = !node.open;
464
+ if (this.lazy() && !node.childrenLoaded) {
465
+ this.getLazyData(node, () => this.virtualToggle(node));
466
+ }
467
+ else {
468
+ this.virtualToggle(node);
469
+ }
470
+ event?.preventDefault();
471
+ event?.stopPropagation();
455
472
  }
456
473
  getLazyData(node, callBack) {
457
474
  node.loading = true;
458
475
  node.change && node.change();
459
- this.data(node.id)
476
+ this.data()(node.id)
460
477
  .pipe(map((x) => x.map((y) => {
461
478
  y.level = node.level + 1;
462
479
  y.checked = node.checked;
@@ -466,15 +483,15 @@ export class XTreeComponent extends XTreeProperty {
466
483
  node.children = x;
467
484
  node.childrenLoaded = true;
468
485
  node.loading = false;
469
- this.treeData = [...this.treeData, ...x];
486
+ this.treeData.set([...this.treeData(), ...x]);
470
487
  if (callBack)
471
488
  callBack();
472
489
  node.change && node.change();
473
- this.cdr.detectChanges();
490
+ this.cdr.markForCheck();
474
491
  });
475
492
  }
476
493
  addNode(node) {
477
- let parent = this.treeData.find((x) => x.id === node.pid);
494
+ let parent = this.treeData().find((x) => x.id === node.pid);
478
495
  const _addNode = () => {
479
496
  if (parent) {
480
497
  node.level = parent.level + 1;
@@ -482,24 +499,24 @@ export class XTreeComponent extends XTreeProperty {
482
499
  node.leaf = true;
483
500
  parent.leaf = false;
484
501
  parent.open = true;
485
- this.treeData = [...this.treeData, node];
486
- this.setParentOpen(this.treeData, node);
487
- this.setDataChange(this.treeData, true, false, false);
502
+ this.treeData.set([...this.treeData(), node]);
503
+ this.setParentOpen(this.treeData(), node);
504
+ this.setDataChange(this.treeData(), true, false, false);
488
505
  this.setActivatedId(node);
489
- this.setActivatedNode(this.nodes, true, false);
506
+ this.setActivatedNode(this.nodes(), true, false);
490
507
  node.change && node.change();
491
508
  }
492
509
  else if (XIsEmpty(node.pid)) {
493
510
  node.level = 0;
494
511
  node.leaf = true;
495
- this.treeData = [...this.treeData, node];
496
- this.nodes = [...this.nodes, node];
512
+ this.treeData.set([...this.treeData(), node]);
513
+ this.nodes.set([...this.nodes(), node]);
497
514
  this.setActivatedId(node);
498
- this.setActivatedNode(this.nodes, true, false);
515
+ this.setActivatedNode(this.nodes(), true, false);
499
516
  node.change && node.change();
500
517
  }
501
518
  };
502
- if (this.lazy && parent && !parent.childrenLoaded) {
519
+ if (this.lazy() && parent && !parent.childrenLoaded) {
503
520
  this.getLazyData(parent, () => {
504
521
  _addNode();
505
522
  });
@@ -509,23 +526,22 @@ export class XTreeComponent extends XTreeProperty {
509
526
  }
510
527
  }
511
528
  setActivatedId(node) {
512
- if (this.multiple) {
513
- if (this.objectArray) {
514
- this.activatedId = [node];
529
+ if (this.multiple()) {
530
+ if (this.objectArray()) {
531
+ this.activatedId.set([node]);
515
532
  }
516
533
  else {
517
- this.activatedId = [node.id];
534
+ this.activatedId.set([node.id]);
518
535
  }
519
536
  }
520
537
  else {
521
- this.activatedId = node.id;
538
+ this.activatedId.set(node.id);
522
539
  }
523
- this.activatedIdChange.emit(this.activatedId);
524
540
  }
525
541
  removeNode(node) {
526
- let parent = this.treeData.find((x) => x.id === node.pid);
542
+ let parent = this.treeData().find((x) => x.id === node.pid);
527
543
  const removeChildren = (nd) => {
528
- XRemove(this.treeData, (x) => x.id === nd.id);
544
+ XRemove(this.treeData(), (x) => x.id === nd.id);
529
545
  if (nd.children) {
530
546
  for (let item of nd.children) {
531
547
  removeChildren(item);
@@ -542,7 +558,7 @@ export class XTreeComponent extends XTreeProperty {
542
558
  }
543
559
  parent.leaf = parent.children.length === 0;
544
560
  }
545
- this.setDataChange(this.treeData, true, false, false);
561
+ this.setDataChange(this.treeData(), true, false, false);
546
562
  }
547
563
  updateNode(node, nowNode) {
548
564
  Object.assign(node, nowNode);
@@ -551,23 +567,11 @@ export class XTreeComponent extends XTreeProperty {
551
567
  trackByItem(_index, item) {
552
568
  return item;
553
569
  }
554
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: XTreeComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.XConfigService }, { token: i0.NgZone }, { token: i2.XTreeService }], target: i0.ɵɵFactoryTarget.Component }); }
555
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: XTreeComponent, isStandalone: true, selector: "x-tree", viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true, static: true }, { propertyName: "virtualBody", first: true, predicate: ["virtualBody"], descendants: true }, { propertyName: "dropList", first: true, predicate: ["dropList"], descendants: true }, { propertyName: "_nodeComponents", predicate: XTreeNodeComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #tree class=\"x-tree\" [class.x-tree-only-leaf]=\"onlyLeaf\">\r\n @if (virtualScroll) {\r\n <cdk-virtual-scroll-viewport\r\n #virtualBody\r\n [itemSize]=\"itemSize\"\r\n [minBufferPx]=\"minBufferPx\"\r\n [maxBufferPx]=\"maxBufferPx\"\r\n [style.height.px]=\"virtualScrollHeight\"\r\n >\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty\"\r\n [cdkDropListData]=\"nodes\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n <x-tree-node\r\n *cdkVirtualFor=\"let node of nodes; templateCacheSize: 0; trackBy: trackByItem\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [lazy]=\"lazy\"\r\n [lazyData]=\"data\"\r\n [nodeHeight]=\"nodeHeight\"\r\n [nodeNowrap]=\"nodeNowrap\"\r\n [nodeAlignItems]=\"nodeAlignItems\"\r\n [tree]=\"this\"\r\n ></x-tree-node>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty\"\r\n [cdkDropListData]=\"nodes\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n @for (node of nodes; track node) {\r\n <x-tree-node\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [lazy]=\"lazy\"\r\n [lazyData]=\"data\"\r\n [nodeHeight]=\"nodeHeight\"\r\n [nodeNowrap]=\"nodeNowrap\"\r\n [nodeAlignItems]=\"nodeAlignItems\"\r\n [tree]=\"this\"\r\n ></x-tree-node>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- \u63D0\u524D\u52A0\u8F7Dloading\u7684\u56FE\u6807-->\r\n@if (lazy) {\r\n <x-icon [style.display]=\"'none'\" type=\"fto-loader\"></x-icon>\r\n}\r\n", styles: [".x-tree{margin:0;padding:0}.x-tree-only-leaf .x-tree-node-sub{color:var(--x-text-300)}.x-tree-content.cdk-drop-list-dragging x-tree-node .x-tree-node-content:not(.x-disabled):not(.x-activated):hover{background-color:transparent}.x-tree-content.cdk-drop-list-dragging x-tree-node.cdk-drag-placeholder .x-tree-node-content{color:var(--x-primary);background-color:var(--x-background-a200);opacity:.8}.x-tree-content.cdk-drop-list-dragging x-tree-node:not(.cdk-drag-placeholder){transition:transform var(--x-animation-duration-base) cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: XTreeNodeComponent, selector: "x-tree-node, [x-tree-node]", inputs: ["tree"], outputs: ["nodeMouseenter"] }, { kind: "component", type: XIconComponent, selector: "x-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
570
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XTreeComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.XTreeService }], target: i0.ɵɵFactoryTarget.Component }); }
571
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: XTreeComponent, isStandalone: true, selector: "x-tree", viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "virtualBody", first: true, predicate: ["virtualBody"], descendants: true, read: CdkVirtualScrollViewport, isSignal: true }, { propertyName: "dropList", first: true, predicate: ["dropList"], descendants: true, read: CdkDropList, isSignal: true }, { propertyName: "nodeComponents", predicate: XTreeNodeComponent, descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #tree class=\"x-tree\" [class.x-tree-only-leaf]=\"onlyLeaf()\">\r\n @if (virtualScroll()) {\r\n <cdk-virtual-scroll-viewport\r\n #virtualBody\r\n [itemSize]=\"itemSize()\"\r\n [minBufferPx]=\"minBufferPxSignal()\"\r\n [maxBufferPx]=\"maxBufferPxSignal()\"\r\n [style.height.px]=\"virtualScrollHeightSignal()\"\r\n >\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag()\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty()\"\r\n [cdkDropListData]=\"nodes()\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n <x-tree-node\r\n *cdkVirtualFor=\"let node of nodes(); templateCacheSize: 0; trackBy: trackByItem\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [nodeHeight]=\"nodeHeight()\"\r\n [nodeNowrap]=\"nodeNowrap()\"\r\n [nodeAlignItems]=\"nodeAlignItems()\"\r\n [(disabled)]=\"node.disabled!\"\r\n [(id)]=\"node.id\"\r\n [(pid)]=\"node.pid\"\r\n [(leaf)]=\"node.leaf!\"\r\n [(height)]=\"node.height!\"\r\n [(alignItems)]=\"node.alignItems!\"\r\n [(loading)]=\"node.loading!\"\r\n [(level)]=\"node.level!\"\r\n [(open)]=\"node.open\"\r\n [(checked)]=\"node.checked!\"\r\n [(indeterminate)]=\"node.indeterminate!\"\r\n [(label)]=\"node.label!\"\r\n [(nowrap)]=\"node.nowrap!\"\r\n (toggle)=\"onToggle(null, $event)\"\r\n ></x-tree-node>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag()\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty()\"\r\n [cdkDropListData]=\"nodes()\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n @for (node of nodes(); track node.id + '' + $index) {\r\n <x-tree-node\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [nodeHeight]=\"nodeHeight()\"\r\n [nodeNowrap]=\"nodeNowrap()\"\r\n [nodeAlignItems]=\"nodeAlignItems()\"\r\n [(disabled)]=\"node.disabled\"\r\n [(id)]=\"node.id\"\r\n [(pid)]=\"node.pid\"\r\n [(leaf)]=\"node.leaf\"\r\n [(height)]=\"node.height!\"\r\n [(alignItems)]=\"node.alignItems\"\r\n [(loading)]=\"node.loading\"\r\n [(level)]=\"node.level\"\r\n [(open)]=\"node.open\"\r\n [(checked)]=\"node.checked\"\r\n [(indeterminate)]=\"node.indeterminate\"\r\n [(label)]=\"node.label\"\r\n [(nowrap)]=\"node.nowrap\"\r\n (toggle)=\"onToggle(null, $event)\"\r\n ></x-tree-node>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- \u63D0\u524D\u52A0\u8F7Dloading\u7684\u56FE\u6807-->\r\n@if (lazy()) {\r\n <x-icon [style.display]=\"'none'\" type=\"fto-loader\"></x-icon>\r\n}\r\n", styles: [".x-tree{margin:0;padding:0}.x-tree-only-leaf .x-tree-node-sub{color:var(--x-text-300)}.x-tree-content.cdk-drop-list-dragging x-tree-node .x-tree-node-content:not(.x-disabled):not(.x-activated):hover{background-color:transparent}.x-tree-content.cdk-drop-list-dragging x-tree-node.cdk-drag-placeholder .x-tree-node-content{color:var(--x-primary);background-color:var(--x-background-a200);opacity:.8}.x-tree-content.cdk-drop-list-dragging x-tree-node:not(.cdk-drag-placeholder){transition:transform var(--x-animation-duration-base) cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: XTreeNodeComponent, selector: "x-tree-node, [x-tree-node]", outputs: ["nodeMouseenter"] }, { kind: "component", type: XIconComponent, selector: "x-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
556
572
  }
557
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: XTreeComponent, decorators: [{
573
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XTreeComponent, decorators: [{
558
574
  type: Component,
559
- args: [{ selector: `${XTreePrefix}`, standalone: true, imports: [DragDropModule, ScrollingModule, XTreeNodeComponent, XIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #tree class=\"x-tree\" [class.x-tree-only-leaf]=\"onlyLeaf\">\r\n @if (virtualScroll) {\r\n <cdk-virtual-scroll-viewport\r\n #virtualBody\r\n [itemSize]=\"itemSize\"\r\n [minBufferPx]=\"minBufferPx\"\r\n [maxBufferPx]=\"maxBufferPx\"\r\n [style.height.px]=\"virtualScrollHeight\"\r\n >\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty\"\r\n [cdkDropListData]=\"nodes\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n <x-tree-node\r\n *cdkVirtualFor=\"let node of nodes; templateCacheSize: 0; trackBy: trackByItem\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [lazy]=\"lazy\"\r\n [lazyData]=\"data\"\r\n [nodeHeight]=\"nodeHeight\"\r\n [nodeNowrap]=\"nodeNowrap\"\r\n [nodeAlignItems]=\"nodeAlignItems\"\r\n [tree]=\"this\"\r\n ></x-tree-node>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty\"\r\n [cdkDropListData]=\"nodes\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n @for (node of nodes; track node) {\r\n <x-tree-node\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [lazy]=\"lazy\"\r\n [lazyData]=\"data\"\r\n [nodeHeight]=\"nodeHeight\"\r\n [nodeNowrap]=\"nodeNowrap\"\r\n [nodeAlignItems]=\"nodeAlignItems\"\r\n [tree]=\"this\"\r\n ></x-tree-node>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- \u63D0\u524D\u52A0\u8F7Dloading\u7684\u56FE\u6807-->\r\n@if (lazy) {\r\n <x-icon [style.display]=\"'none'\" type=\"fto-loader\"></x-icon>\r\n}\r\n", styles: [".x-tree{margin:0;padding:0}.x-tree-only-leaf .x-tree-node-sub{color:var(--x-text-300)}.x-tree-content.cdk-drop-list-dragging x-tree-node .x-tree-node-content:not(.x-disabled):not(.x-activated):hover{background-color:transparent}.x-tree-content.cdk-drop-list-dragging x-tree-node.cdk-drag-placeholder .x-tree-node-content{color:var(--x-primary);background-color:var(--x-background-a200);opacity:.8}.x-tree-content.cdk-drop-list-dragging x-tree-node:not(.cdk-drag-placeholder){transition:transform var(--x-animation-duration-base) cubic-bezier(0,0,.2,1)}\n"] }]
560
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.XConfigService }, { type: i0.NgZone }, { type: i2.XTreeService }], propDecorators: { tree: [{
561
- type: ViewChild,
562
- args: ['tree', { static: true }]
563
- }], virtualBody: [{
564
- type: ViewChild,
565
- args: ['virtualBody']
566
- }], dropList: [{
567
- type: ViewChild,
568
- args: ['dropList']
569
- }], _nodeComponents: [{
570
- type: ViewChildren,
571
- args: [XTreeNodeComponent]
572
- }] } });
573
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvbmctbmVzdC91aS90cmVlL3RyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGliL25nLW5lc3QvdWkvdHJlZS90cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBSWpCLHVCQUF1QixFQUN2QixTQUFTLEVBSVQsWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsRUFDVCxRQUFRLEVBRVIsT0FBTyxFQUNQLE9BQU8sRUFFUixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUE0QixlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQStELGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7O0FBV2xELE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQUsvQyxJQUNXLGVBQWUsQ0FBQyxLQUFvQztRQUM3RCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBZUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFJRCxZQUNTLFFBQW1CLEVBQ25CLFVBQW1D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Y0FBYztrQkFUMUIsU0FBUzsrQkFDRSxHQUFHLFdBQVcsRUFBRSxjQUNkLElBQUksV0FDUCxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLGlCQUcvRCxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNO29OQUdWLElBQUk7c0JBQXhDLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDVCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0QsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUdWLGVBQWU7c0JBRHpCLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgUmVuZGVyZXIyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgVmlld0NoaWxkLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgTmdab25lXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFhUcmVlUHJlZml4LCBYVHJlZU5vZGUsIFhUcmVlUHJvcGVydHkgfSBmcm9tICcuL3RyZWUucHJvcGVydHknO1xyXG5pbXBvcnQge1xyXG4gIFhJc0VtcHR5LFxyXG4gIFhJc0Z1bmN0aW9uLFxyXG4gIFhJc1VuZGVmaW5lZCxcclxuICBYSXNDaGFuZ2UsXHJcbiAgWFNldERhdGEsXHJcbiAgWENvbmZpZ1NlcnZpY2UsXHJcbiAgWFJlc2l6ZSxcclxuICBYUmVtb3ZlLFxyXG4gIFhSZXNpemVPYnNlcnZlclxyXG59IGZyb20gJ0BuZy1uZXN0L3VpL2NvcmUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IFhUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vdHJlZS1ub2RlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdFbmQsIENka0RyYWdNb3ZlLCBDZGtEcmFnU3RhcnQsIENka0Ryb3BMaXN0LCBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBYVHJlZVNlcnZpY2UgfSBmcm9tICcuL3RyZWUuc2VydmljZSc7XHJcbmltcG9ydCB7IFhJY29uQ29tcG9uZW50IH0gZnJvbSAnQG5nLW5lc3QvdWkvaWNvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogYCR7WFRyZWVQcmVmaXh9YCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtEcmFnRHJvcE1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlLCBYVHJlZU5vZGVDb21wb25lbnQsIFhJY29uQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHJlZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFhUcmVlQ29tcG9uZW50IGV4dGVuZHMgWFRyZWVQcm9wZXJ0eSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQFZpZXdDaGlsZCgndHJlZScsIHsgc3RhdGljOiB0cnVlIH0pIHRyZWUhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCd2aXJ0dWFsQm9keScpIHZpcnR1YWxCb2R5ITogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3BMaXN0JykgZHJvcExpc3QhOiBDZGtEcm9wTGlzdDxIVE1MRWxlbWVudD47XHJcbiAgbm9kZUNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8WFRyZWVOb2RlQ29tcG9uZW50PjtcclxuICBAVmlld0NoaWxkcmVuKFhUcmVlTm9kZUNvbXBvbmVudClcclxuICBwdWJsaWMgc2V0IF9ub2RlQ29tcG9uZW50cyh2YWx1ZTogUXVlcnlMaXN0PFhUcmVlTm9kZUNvbXBvbmVudD4pIHtcclxuICAgIHRoaXMubm9kZUNvbXBvbmVudHMgPSB2YWx1ZTtcclxuICB9XHJcbiAgbm9kZXM6IFhUcmVlTm9kZVtdID0gW107XHJcbiAgdmlydHVhbE5vZGVzOiBYVHJlZU5vZGVbXSA9IFtdO1xyXG4gIGFjdGl2YXRlZE5vZGUhOiBYVHJlZU5vZGU7XHJcbiAgZGF0YUlzRnVuYyA9IGZhbHNlO1xyXG4gIGdldHRpbmcgPSBmYWxzZTtcclxuICB0cmVlRGF0YTogWFRyZWVOb2RlW10gPSBbXTtcclxuXHJcbiAgZHJhZ2dpbmcgPSBmYWxzZTtcclxuICBkcmFnUG9zaXRpb24hOiAtMSB8IDE7XHJcbiAgaG92ZXJUcmVlTm9kZSE6IFhUcmVlTm9kZTtcclxuICBob3ZlclRyZWVFbGUhOiBFbGVtZW50UmVmO1xyXG4gIGRyYWdnaW5nVHJlZU5vZGU6IFhUcmVlTm9kZSB8IG51bGwgPSBudWxsO1xyXG4gIGhhc0NoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGlzRW1wdHkoKSB7XHJcbiAgICByZXR1cm4gWElzRW1wdHkodGhpcy5ub2Rlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91blN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgX3Jlc2l6ZU9ic2VydmVyITogWFJlc2l6ZU9ic2VydmVyO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBYQ29uZmlnU2VydmljZSxcclxuICAgIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHB1YmxpYyB0cmVlU2VydmljZTogWFRyZWVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBleHBhbmRlZEFsbCwgZGF0YSwgYWN0aXZhdGVkSWQsIGNoZWNrZWQsIG1hbnVhbCB9ID0gY2hhbmdlcztcclxuICAgIFhJc0NoYW5nZShkYXRhKSAmJiB0aGlzLnNldERhdGEoKTtcclxuICAgIFhJc0NoYW5nZShhY3RpdmF0ZWRJZCkgJiYgdGhpcy5zZXRBY3RpdmF0ZWROb2RlKHRoaXMudHJlZURhdGEpO1xyXG4gICAgWElzQ2hhbmdlKGV4cGFuZGVkQWxsKSAmJiB0aGlzLnNldEV4cGFuZGVkQWxsKCk7XHJcbiAgICBYSXNDaGFuZ2UoY2hlY2tlZCkgJiYgdGhpcy5zZXRDaGVja2VkS2V5cyh0aGlzLmNoZWNrZWQpO1xyXG4gICAgWElzQ2hhbmdlKG1hbnVhbCkgJiYgdGhpcy5zZXRNYW51YWwoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgdGhpcy5oZWlnaHRBZGFwdGlvbikge1xyXG4gICAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGxIZWlnaHQoKTtcclxuICAgICAgWFJlc2l6ZSh0aGlzLmhlaWdodEFkYXB0aW9uIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMCksIHRha2VVbnRpbCh0aGlzLl91blN1YmplY3QpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyID0geC5yZXNpemVPYnNlcnZlcjtcclxuICAgICAgICAgIHRoaXMuc2V0VmlydHVhbFNjcm9sbEhlaWdodCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRTY29ybGxUb3AoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdW5TdWJqZWN0Lm5leHQoKTtcclxuICAgIHRoaXMuX3VuU3ViamVjdC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIHNldERhdGEoKSB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcclxuICAgIHRoaXMuZGF0YUlzRnVuYyA9IGZhbHNlO1xyXG4gICAgaWYgKFhJc0Z1bmN0aW9uKHRoaXMuZGF0YSkpIHtcclxuICAgICAgdGhpcy5kYXRhSXNGdW5jID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nZXREYXRhQnlGdW5jKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBYU2V0RGF0YTxYVHJlZU5vZGU+KHRoaXMuZGF0YSwgdGhpcy5fdW5TdWJqZWN0KS5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgICB0aGlzLnNldERhdGFDaGFuZ2UoeCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2RrRHJhZ1N0YXJ0ZWQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xyXG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XHJcbiAgICB0aGlzLmRyYWdnaW5nVHJlZU5vZGUgPSBldmVudC5zb3VyY2UuZGF0YTtcclxuICAgIGlmIChldmVudC5zb3VyY2UuZGF0YS5vcGVuKSB7XHJcbiAgICAgIHRoaXMub25Ub2dnbGUoZXZlbnQuZXZlbnQsIGV2ZW50LnNvdXJjZS5kYXRhKTtcclxuICAgIH1cclxuICAgIHRoaXMubm9kZURyYWdTdGFydGVkLmVtaXQoeyBldmVudCwgZnJvbTogdGhpcy5kcmFnZ2luZ1RyZWVOb2RlISB9KTtcclxuICB9XHJcblxyXG4gIGNka0RyYWdFbmRlZChldmVudDogQ2RrRHJhZ0VuZCkge1xyXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaG92ZXJUcmVlTm9kZSkge1xyXG4gICAgICBpZiAodGhpcy5ob3ZlclRyZWVOb2RlLmlkICE9PSBldmVudC5zb3VyY2UuZGF0YS5pZCkge1xyXG4gICAgICAgIHRoaXMuaW5zZXJ0Tm9kZShldmVudC5zb3VyY2UuZGF0YSwgdGhpcy5ob3ZlclRyZWVOb2RlLCB0aGlzLmRyYWdQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ob3ZlclRyZWVOb2RlLmNoYW5nZSAmJiB0aGlzLmhvdmVyVHJlZU5vZGUuY2hhbmdlKCk7XHJcbiAgICAgIHRoaXMubm9kZURyYWdFbmRlZC5lbWl0KHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBmcm9tOiBldmVudC5zb3VyY2UuZGF0YSxcclxuICAgICAgICB0bzogdGhpcy5ob3ZlclRyZWVOb2RlLFxyXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmRyYWdQb3NpdGlvblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluc2VydE5vZGUoZHJhZ05vZGU6IFhUcmVlTm9kZSwgaG92ZXJOb2RlOiBYVHJlZU5vZGUsIGRyYWdQb3NpdGlvbjogLTEgfCAxKSB7XHJcbiAgICBsZXQgcGFyZW50ID0gdGhpcy5ub2Rlcy5maW5kKCh4KSA9PiB4LmlkID09PSBkcmFnTm9kZS5waWQpO1xyXG4gICAgdGhpcy50cmVlU2VydmljZS5tb3ZlTm9kZSh0aGlzLnRyZWVEYXRhLCBkcmFnTm9kZSwgaG92ZXJOb2RlLCBkcmFnUG9zaXRpb24pO1xyXG4gICAgdGhpcy5zZXREYXRhQ2hhbmdlKHRoaXMudHJlZURhdGEsIHRydWUsIGZhbHNlLCB0cnVlLCBwYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgY2RrRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZTxYVHJlZU5vZGU+KSB7XHJcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMuaG92ZXJUcmVlTm9kZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55O1xyXG4gICAgaWYgKGV2ZW50LnNvdXJjZS5kYXRhLmlkID09PSB0aGlzLmhvdmVyVHJlZU5vZGUuaWQpIHJldHVybjtcclxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuaG92ZXJUcmVlRWxlLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCB7IHRvcCwgaGVpZ2h0IH0gPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkZXMgPSBNYXRoLm1heChoZWlnaHQgKiAwLjUsIDIpO1xyXG4gICAgaWYgKHkgPiB0b3AgJiYgeSA8IHRvcCArIGRlcykge1xyXG4gICAgICB0aGlzLmRyYWdQb3NpdGlvbiA9IC0xO1xyXG4gICAgfSBlbHNlIGlmICh5ID4gdG9wICsgZGVzICYmIHkgPCB0b3AgKyBoZWlnaHQpIHtcclxuICAgICAgdGhpcy5kcmFnUG9zaXRpb24gPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ob3ZlclRyZWVOb2RlLmNoYW5nZSAmJiB0aGlzLmhvdmVyVHJlZU5vZGUuY2hhbmdlKCk7XHJcbiAgICB0aGlzLm5vZGVEcmFnTW92ZWQuZW1pdCh7XHJcbiAgICAgIGV2ZW50LFxyXG4gICAgICBmcm9tOiB0aGlzLmRyYWdnaW5nVHJlZU5vZGUhLFxyXG4gICAgICB0bzogdGhpcy5ob3ZlclRyZWVOb2RlLFxyXG4gICAgICBwb3NpdGlvbjogdGhpcy5kcmFnUG9zaXRpb25cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJlZGljYXRlKF9kcmFnOiBDZGtEcmFnPFhUcmVlTm9kZT4sIF9kcm9wOiBDZGtEcm9wTGlzdDxYVHJlZU5vZGU+KSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VmlydHVhbFNjcm9sbEhlaWdodCgpIHtcclxuICAgIHRoaXMudmlydHVhbFNjcm9sbEhlaWdodCA9ICh0aGlzLmhlaWdodEFkYXB0aW9uIGFzIEhUTUxFbGVtZW50KS5jbGllbnRIZWlnaHQ7XHJcbiAgICB0aGlzLm1pbkJ1ZmZlclB4ID0gdGhpcy52aXJ0dWFsU2Nyb2xsSGVpZ2h0O1xyXG4gICAgdGhpcy5tYXhCdWZmZXJQeCA9IHRoaXMudmlydHVhbFNjcm9sbEhlaWdodCAqIDEuMjtcclxuICAgIHRoaXMudmlydHVhbEJvZHlbJ19zY3JvbGxTdHJhdGVneSddWydfbWluQnVmZmVyUHgnXSA9IHRoaXMubWluQnVmZmVyUHg7XHJcbiAgICB0aGlzLnZpcnR1YWxCb2R5Wydfc2Nyb2xsU3RyYXRlZ3knXVsnX21heEJ1ZmZlclB4J10gPSB0aGlzLm1heEJ1ZmZlclB4O1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRNYW51YWwoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhSXNGdW5jKSB0aGlzLmdldERhdGFCeUZ1bmMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YUJ5RnVuYygpIHtcclxuICAgIGlmICghdGhpcy5tYW51YWwpIHJldHVybjtcclxuICAgIFhTZXREYXRhPFhUcmVlTm9kZT4oKHRoaXMuZGF0YSBhcyBGdW5jdGlvbikoKSwgdGhpcy5fdW5TdWJqZWN0KS5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgdGhpcy5zZXREYXRhQ2hhbmdlKHgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGFDaGFuZ2UoXHJcbiAgICB2YWx1ZTogWFRyZWVOb2RlW10sXHJcbiAgICByZWdldENoaWxkcmVuID0gZmFsc2UsXHJcbiAgICBpbml0ID0gdHJ1ZSxcclxuICAgIHBhcmVudE9wZW4gPSB0cnVlLFxyXG4gICAgbGF6eVBhcmFudD86IFhUcmVlTm9kZVxyXG4gICkge1xyXG4gICAgaWYgKFhJc0VtcHR5KHRoaXMuY2hlY2tlZCkgfHwgIXRoaXMuaGFzQ2hlY2tlZCkgdGhpcy5jaGVja2VkID0gW107XHJcbiAgICBjb25zdCBnZXRDaGlsZHJlbiA9IChub2RlOiBYVHJlZU5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKGluaXQpIHtcclxuICAgICAgICBub2RlLmxldmVsID0gbGV2ZWw7XHJcbiAgICAgICAgbm9kZS5vcGVuID1cclxuICAgICAgICAgIEJvb2xlYW4odGhpcy5leHBhbmRlZEFsbCkgfHxcclxuICAgICAgICAgIGxldmVsIDw9IE51bWJlcih0aGlzLmV4cGFuZGVkTGV2ZWwpIHx8XHJcbiAgICAgICAgICB0aGlzLmV4cGFuZGVkLmluY2x1ZGVzKG5vZGUuaWQpIHx8XHJcbiAgICAgICAgICBub2RlLm9wZW47XHJcbiAgICAgICAgbm9kZS5jaGVja2VkID0gdGhpcy5jaGVja2VkLmluY2x1ZGVzKG5vZGUuaWQpIHx8IG5vZGUuY2hlY2tlZDtcclxuICAgICAgICBub2RlLmNoaWxkcmVuTG9hZGVkID0gbm9kZS5vcGVuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChYSXNVbmRlZmluZWQobm9kZS5jaGlsZHJlbikgfHwgcmVnZXRDaGlsZHJlbikge1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSB2YWx1ZS5maWx0ZXIoKHkpID0+IHkucGlkID09PSBub2RlLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5sZXZlbENoZWNrICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGVja2VkKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBuZCBvZiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIG5kLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWQucHVzaChuZC5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICgoIXRoaXMubGF6eSAmJiAoWElzVW5kZWZpbmVkKG5vZGUubGVhZikgfHwgcmVnZXRDaGlsZHJlbikpIHx8IG5vZGUuaWQgPT09IGxhenlQYXJhbnQ/LmlkKSB7XHJcbiAgICAgICAgbm9kZS5sZWFmID0gKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCBhcyBudW1iZXIpID09PSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbm9kZS5sZWFmKSBub2RlLmNoaWxkcmVuPy5tYXAoKHkpID0+IGdldENoaWxkcmVuKHksIGxldmVsICsgMSkpO1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH07XHJcbiAgICB0aGlzLnRyZWVEYXRhID0gdmFsdWU7XHJcbiAgICB0aGlzLm5vZGVzID0gdmFsdWUuZmlsdGVyKCh4KSA9PiBYSXNFbXB0eSh4LnBpZCkpLm1hcCgoeCkgPT4gZ2V0Q2hpbGRyZW4oeCwgMCkpO1xyXG4gICAgaWYgKHBhcmVudE9wZW4pIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXRlbS5sZWFmICYmIGl0ZW0ub3Blbikge1xyXG4gICAgICAgICAgdGhpcy5zZXRQYXJlbnRPcGVuKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2V0RXhwYW5kZWQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5vZGVNb3VzZWVudGVyKCRldmVudDogeyBldmVudDogTW91c2VFdmVudDsgbm9kZTogWFRyZWVOb2RlOyBlbGU6IEVsZW1lbnRSZWYgfSkge1xyXG4gICAgY29uc3QgeyBub2RlLCBlbGUgfSA9ICRldmVudDtcclxuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xyXG4gICAgbGV0IGJlZm9yZSA9IHRoaXMuaG92ZXJUcmVlTm9kZTtcclxuICAgIHRoaXMuaG92ZXJUcmVlTm9kZSA9IG5vZGU7XHJcbiAgICB0aGlzLmhvdmVyVHJlZUVsZSA9IGVsZTtcclxuICAgIHRoaXMuaG92ZXJUcmVlTm9kZS5jaGFuZ2UgJiYgdGhpcy5ob3ZlclRyZWVOb2RlLmNoYW5nZSgpO1xyXG4gICAgaWYgKGJlZm9yZSkge1xyXG4gICAgICBiZWZvcmUuY2hhbmdlICYmIGJlZm9yZS5jaGFuZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW5vZGUubGVhZiAmJiAhbm9kZS5vcGVuKSB7XHJcbiAgICAgIGxldCBmcm9tID0gdGhpcy5ub2Rlcy5pbmRleE9mKHRoaXMuZHJhZ2dpbmdUcmVlTm9kZSEpO1xyXG4gICAgICBsZXQgdG8gPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIGlmICh0byAtIGZyb20gIT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5vblRvZ2dsZShudWxsISwgbm9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgbGV0IGFkZE5vZGVzOiBYVHJlZU5vZGVbXSA9IFtdO1xyXG4gICAgICAvLyAgIG5vZGUub3BlbiA9IHRydWU7XHJcbiAgICAgIC8vICAgY29uc3QgZ2V0Tm9kZXMgPSAobmQ6IFhUcmVlTm9kZSkgPT4ge1xyXG4gICAgICAvLyAgICAgaWYgKFhJc0VtcHR5KG5kLmNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAvLyAgICAgZm9yIChsZXQgY2hpbGQgb2YgbmQuY2hpbGRyZW4hKSB7XHJcbiAgICAgIC8vICAgICAgIGFkZE5vZGVzLnB1c2goY2hpbGQpO1xyXG4gICAgICAvLyAgICAgICBjaGlsZC5vcGVuICYmIGdldE5vZGVzKGNoaWxkKTtcclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gICB9O1xyXG4gICAgICAvLyAgIGdldE5vZGVzKG5vZGUpO1xyXG4gICAgICAvLyAgIGxldCBub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgICAgLy8gICBub2Rlcy5zcGxpY2UodG8gKyAxLCAwLCAuLi5hZGROb2Rlcyk7XHJcbiAgICAgIC8vICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRTY29ybGxUb3AoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2Nyb2xsRWxlbWVudCB8fCAhdGhpcy5hY3RpdmF0ZWROb2RlKSByZXR1cm47XHJcbiAgICBsZXQgaW54ID0gdGhpcy5ub2Rlcy5pbmRleE9mKHRoaXMuYWN0aXZhdGVkTm9kZSk7XHJcbiAgICBsZXQgY29tID0gdGhpcy5ub2RlQ29tcG9uZW50cy5nZXQoaW54KTtcclxuICAgIGlmICghY29tKSByZXR1cm47XHJcbiAgICBsZXQgZWxlID0gY29tLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGxldCBzY3JvbGxFbGUgPSB0aGlzLnNjcm9sbEVsZW1lbnQ7XHJcbiAgICBsZXQgbWluID0gc2Nyb2xsRWxlLnNjcm9sbFRvcDtcclxuICAgIGxldCBtYXggPSBzY3JvbGxFbGUuc2Nyb2xsVG9wICsgc2Nyb2xsRWxlLmNsaWVudEhlaWdodDtcclxuICAgIGlmIChlbGUub2Zmc2V0VG9wICsgZWxlLmNsaWVudEhlaWdodCA+IG1heCkge1xyXG4gICAgICBsZXQgc2Nyb2xsVG9wID0gZWxlLm9mZnNldFRvcCArIGVsZS5jbGllbnRIZWlnaHQgLSBzY3JvbGxFbGUuY2xpZW50SGVpZ2h0O1xyXG4gICAgICBzY3JvbGxFbGUuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgfVxyXG4gICAgaWYgKGVsZS5vZmZzZXRUb3AgPCBtaW4pIHtcclxuICAgICAgc2Nyb2xsRWxlLnNjcm9sbFRvcCA9IGVsZS5vZmZzZXRUb3A7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2VkTm9kZXMoKTogWFRyZWVOb2RlW10ge1xyXG4gICAgbGV0IHJlc3VsdDogWFRyZWVOb2RlW10gPSBbXTtcclxuICAgIGNvbnN0IGdldENoaWxkcmVuID0gKG5vZGVzOiBYVHJlZU5vZGVbXSkgPT4ge1xyXG4gICAgICBpZiAoWElzRW1wdHkobm9kZXMpKSByZXR1cm47XHJcbiAgICAgIG5vZGVzLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgICBpZiAoeC5jaGVja2VkICYmICFyZXN1bHQuaW5jbHVkZXMoeCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRDaGlsZHJlbih4LmNoaWxkcmVuIGFzIFhUcmVlTm9kZVtdKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0Q2hpbGRyZW4odGhpcy5ub2Rlcyk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hlY2tlZEtleXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja2VkTm9kZXMoKS5tYXAoKHgpID0+IHguaWQpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hlY2tlZEtleXMoa2V5czogYW55W10gPSBbXSkge1xyXG4gICAgaWYgKCFYSXNFbXB0eShrZXlzKSkgdGhpcy5oYXNDaGVja2VkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNldENoaWxkcmVuID0gKG5vZGVzOiBYVHJlZU5vZGVbXSwgY2xlYXIgPSBmYWxzZSkgPT4ge1xyXG4gICAgICBpZiAoWElzRW1wdHkobm9kZXMpKSByZXR1cm47XHJcbiAgICAgIG5vZGVzLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgICB4LmNoZWNrZWQgPSAhY2xlYXIgJiYga2V5cy5pbmNsdWRlcyh4LmlkKTtcclxuICAgICAgICB4LmNoYW5nZSAmJiB4LmNoYW5nZSh0cnVlKTtcclxuICAgICAgICBzZXRDaGlsZHJlbih4LmNoaWxkcmVuIGFzIFhUcmVlTm9kZVtdLCBjbGVhcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHNldENoaWxkcmVuKHRoaXMubm9kZXMsIFhJc0VtcHR5KGtleXMpKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkQWxsKCkge1xyXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRBbGwgJiYgdGhpcy50cmVlRGF0YS5sZW5ndGggPT09IHRoaXMubm9kZXMubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCBzZXRDaGlsZHJlbiA9IChub2RlczogWFRyZWVOb2RlW10pID0+IHtcclxuICAgICAgaWYgKFhJc0VtcHR5KG5vZGVzKSkgcmV0dXJuO1xyXG4gICAgICBub2Rlcy5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgeC5vcGVuID0gQm9vbGVhbih0aGlzLmV4cGFuZGVkQWxsKTtcclxuICAgICAgICB4LmNoYW5nZSAmJiB4LmNoYW5nZSgpO1xyXG4gICAgICAgIHNldENoaWxkcmVuKHguY2hpbGRyZW4gYXMgWFRyZWVOb2RlW10pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBzZXRDaGlsZHJlbih0aGlzLm5vZGVzKTtcclxuXHJcbiAgICBpZiAodGhpcy5leHBhbmRlZEFsbCA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5ub2RlcyA9IHRoaXMudHJlZURhdGEuZmlsdGVyKCh4KSA9PiBYSXNFbXB0eSh4LnBpZCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudmlydHVhbE5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMudmlydHVhbE5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy52aXJ0dWFsTm9kZXNdO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMudmlydHVhbE5vZGVzKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWaXJ0dWFsRXhwYW5kZWRBbGwoaXRlbSwgdGhpcy5leHBhbmRlZEFsbCBhcyBib29sZWFuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy52aXJ0dWFsQm9keT8uY2hlY2tWaWV3cG9ydFNpemUoKTtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkKCkge1xyXG4gICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLm5vZGVzKSB7XHJcbiAgICAgIGlmIChpdGVtLm9wZW4gJiYgaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMubm9kZXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLihpdGVtLmNoaWxkcmVuIGFzIFhUcmVlTm9kZVtdKSk7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5jaGFuZ2UgJiYgaXRlbS5jaGFuZ2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgfVxyXG5cclxuICBzZXRWaXJ0dWFsRXhwYW5kZWRBbGwoaXRlbTogWFRyZWVOb2RlLCBleHBhbmRlZEFsbDogYm9vbGVhbikge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5ub2Rlcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGV4cGFuZGVkQWxsKSB7XHJcbiAgICAgIGxldCBhZGROb2RlczogWFRyZWVOb2RlW10gPSBbXTtcclxuICAgICAgY29uc3QgZ2V0Tm9kZXMgPSAobmQ6IFhUcmVlTm9kZSkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5kLmNoaWxkcmVuISkge1xyXG4gICAgICAgICAgYWRkTm9kZXMucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICBnZXROb2RlcyhjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBnZXROb2RlcyhpdGVtKTtcclxuICAgICAgdGhpcy5ub2Rlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5hZGROb2Rlcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gIH1cclxuXHJcbiAgdmlydHVhbFRvZ2dsZShub2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIGxldCBpbmRleCA9IHRoaXMubm9kZXMuaW5kZXhPZihub2RlKTtcclxuICAgIGlmIChub2RlLm9wZW4pIHtcclxuICAgICAgbGV0IGFkZE5vZGVzOiBYVHJlZU5vZGVbXSA9IFtdO1xyXG4gICAgICBjb25zdCBnZXROb2RlcyA9IChuZDogWFRyZWVOb2RlKSA9PiB7XHJcbiAgICAgICAgaWYgKFhJc0VtcHR5KG5kLmNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5kLmNoaWxkcmVuISkge1xyXG4gICAgICAgICAgYWRkTm9kZXMucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICBjaGlsZC5vcGVuICYmIGdldE5vZGVzKGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGdldE5vZGVzKG5vZGUpO1xyXG4gICAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLmFkZE5vZGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBkZWxDb3VudCA9IDA7XHJcbiAgICAgIGNvbnN0IGdldENvdW50ID0gKG5kOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgICBpZiAoWElzRW1wdHkobmQuY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgZGVsQ291bnQgKz0gbmQuY2hpbGRyZW4hLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBuZC5jaGlsZHJlbiEpIHtcclxuICAgICAgICAgIGNoaWxkLm9wZW4gJiYgZ2V0Q291bnQoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZ2V0Q291bnQobm9kZSk7XHJcbiAgICAgIHRoaXMubm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgZGVsQ291bnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkT3JSZW1vdmVFeHBhbmRlZChub2RlKTtcclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnZpcnR1YWxCb2R5Py5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgYWRkT3JSZW1vdmVFeHBhbmRlZChub2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIGlmIChub2RlLm9wZW4pIHtcclxuICAgICAgaWYgKCF0aGlzLmV4cGFuZGVkLmluY2x1ZGVzKG5vZGUuaWQpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZC5wdXNoKG5vZGUuaWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5leHBhbmRlZC5pbmNsdWRlcyhub2RlLmlkKSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWQuc3BsaWNlKHRoaXMuZXhwYW5kZWQuaW5kZXhPZihub2RlLmlkKSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEFjdGl2YXRlZE5vZGUobm9kZXM6IFhUcmVlTm9kZVtdLCBwYXJlbnRPcGVuID0gdHJ1ZSwgZGF0YUNoYW5nZSA9IHRydWUpIHtcclxuICAgIGlmIChYSXNFbXB0eSh0aGlzLmFjdGl2YXRlZElkKSAmJiB0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVkSWQgPSBbXTtcclxuICAgIH1cclxuICAgIGxldCBiZWZvcmUgPSB0aGlzLmFjdGl2YXRlZE5vZGU7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGhpcy5hY3RpdmF0ZWRJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGlkcyA9IHRoaXMub2JqZWN0QXJyYXkgPyB0aGlzLmFjdGl2YXRlZElkLm1hcCgoeDogWFRyZWVOb2RlKSA9PiB4LmlkKSA6IHRoaXMuYWN0aXZhdGVkSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBub2RlID0gbm9kZXMuZmluZCgoeCkgPT4geC5pZCA9PT0gaWRzW2ldKSBhcyBYVHJlZU5vZGU7XHJcbiAgICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICBwYXJlbnRPcGVuICYmIHRoaXMuc2V0UGFyZW50T3Blbihub2Rlcywgbm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChpID09PSBpZHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVkTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZWRDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2YXRlZE5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYWN0aXZhdGVkSWQgPSB0aGlzLmFjdGl2YXRlZElkO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlZE5vZGUgPSBub2Rlcy5maW5kKCh4KSA9PiB4LmlkID09IGFjdGl2YXRlZElkKSBhcyBYVHJlZU5vZGU7XHJcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRlZE5vZGUpIHtcclxuICAgICAgICBwYXJlbnRPcGVuICYmIHRoaXMuc2V0UGFyZW50T3Blbihub2RlcywgdGhpcy5hY3RpdmF0ZWROb2RlKTtcclxuICAgICAgICB0aGlzLmFjdGl2YXRlZENoYW5nZS5lbWl0KHRoaXMuYWN0aXZhdGVkTm9kZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChiZWZvcmUpIHtcclxuICAgICAgYmVmb3JlLmNoYW5nZSAmJiBiZWZvcmUuY2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIVhJc0VtcHR5KG5vZGVzKSAmJiBkYXRhQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0YUNoYW5nZShub2RlcywgZmFsc2UsIHRydWUsIHBhcmVudE9wZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UGFyZW50T3Blbihub2RlczogWFRyZWVOb2RlW10sIG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgY29uc3QgZ2V0UGFyZW50ID0gKGNoaWxkOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgaWYgKFhJc0VtcHR5KGNoaWxkLnBpZCkpIHJldHVybjtcclxuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZXMuZmluZCgoeCkgPT4geC5pZCA9PT0gY2hpbGQucGlkKSBhcyBYVHJlZU5vZGU7XHJcbiAgICAgIGlmICghWElzRW1wdHkocGFyZW50KSkge1xyXG4gICAgICAgIGlmICghdGhpcy5leHBhbmRlZC5pbmNsdWRlcyhwYXJlbnQuaWQpKSB7XHJcbiAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gWy4uLnRoaXMuZXhwYW5kZWQsIHBhcmVudC5pZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudC5vcGVuID0gdHJ1ZTtcclxuICAgICAgICBwYXJlbnQuY2hhbmdlICYmIHBhcmVudC5jaGFuZ2UoKTtcclxuICAgICAgICBnZXRQYXJlbnQocGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGdldFBhcmVudChub2RlKTtcclxuICB9XHJcblxyXG4gIHNldFBhcmVudENoZWNrKG5vZGVzOiBYVHJlZU5vZGVbXSwgbm9kZTogWFRyZWVOb2RlKSB7XHJcbiAgICBjb25zdCBnZXRQYXJlbnQgPSAoY2hpbGQ6IFhUcmVlTm9kZSkgPT4ge1xyXG4gICAgICBpZiAoWElzRW1wdHkoY2hpbGQucGlkKSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBwYXJlbnQgPSBub2Rlcy5maW5kKCh4KSA9PiB4LmlkID09PSBjaGlsZC5waWQpIGFzIFhUcmVlTm9kZTtcclxuICAgICAgaWYgKCFYSXNFbXB0eShwYXJlbnQpKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmV4cGFuZGVkLmluY2x1ZGVzKHBhcmVudC5pZCkpIHtcclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBbLi4udGhpcy5leHBhbmRlZCwgcGFyZW50LmlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyZW50Lm9wZW4gPSB0cnVlO1xyXG4gICAgICAgIHBhcmVudC5jaGFuZ2UgJiYgcGFyZW50LmNoYW5nZSgpO1xyXG4gICAgICAgIGdldFBhcmVudChwYXJlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgZ2V0UGFyZW50KG5vZGUpO1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGUoZXZlbnQ6IEV2ZW50LCBub2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIG5vZGUub3BlbiA9ICFub2RlLm9wZW47XHJcbiAgICAgIGlmICh0aGlzLmxhenkgJiYgIW5vZGUuY2hpbGRyZW5Mb2FkZWQpIHtcclxuICAgICAgICB0aGlzLmdldExhenlEYXRhKG5vZGUsICgpID0+IHRoaXMudmlydHVhbFRvZ2dsZShub2RlKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52aXJ0dWFsVG9nZ2xlKG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExhenlEYXRhKG5vZGU6IFhUcmVlTm9kZSwgY2FsbEJhY2s/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICBub2RlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbm9kZS5jaGFuZ2UgJiYgbm9kZS5jaGFuZ2UoKTtcclxuICAgICh0aGlzLmRhdGEgYXMgKHBpZD86IGFueSkgPT4gT2JzZXJ2YWJsZTxYVHJlZU5vZGVbXT4pKG5vZGUuaWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgoeCkgPT5cclxuICAgICAgICAgIHgubWFwKCh5KSA9PiB7XHJcbiAgICAgICAgICAgIHkubGV2ZWwgPSAobm9kZS5sZXZlbCBhcyBudW1iZXIpICsgMTtcclxuICAgICAgICAgICAgeS5jaGVja2VkID0gbm9kZS5jaGVja2VkO1xyXG4gICAgICAgICAgICByZXR1cm4geTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgICBub2RlLmNoaWxkcmVuID0geDtcclxuICAgICAgICBub2RlLmNoaWxkcmVuTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBub2RlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyZWVEYXRhID0gWy4uLnRoaXMudHJlZURhdGEsIC4uLnhdO1xyXG4gICAgICAgIGlmIChjYWxsQmFjaykgY2FsbEJhY2soKTtcclxuICAgICAgICBub2RlLmNoYW5nZSAmJiBub2RlLmNoYW5nZSgpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGROb2RlKG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgbGV0IHBhcmVudCA9IHRoaXMudHJlZURhdGEuZmluZCgoeCkgPT4geC5pZCA9PT0gbm9kZS5waWQpITtcclxuICAgIGNvbnN0IF9hZGROb2RlID0gKCkgPT4ge1xyXG4gICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgbm9kZS5sZXZlbCA9IHBhcmVudC5sZXZlbCEgKyAxO1xyXG4gICAgICAgIG5vZGUucGlkID0gcGFyZW50LmlkO1xyXG4gICAgICAgIG5vZGUubGVhZiA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50LmxlYWYgPSBmYWxzZTtcclxuICAgICAgICBwYXJlbnQub3BlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50cmVlRGF0YSA9IFsuLi50aGlzLnRyZWVEYXRhLCBub2RlXTtcclxuICAgICAgICB0aGlzLnNldFBhcmVudE9wZW4odGhpcy50cmVlRGF0YSwgbm9kZSk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhQ2hhbmdlKHRoaXMudHJlZURhdGEsIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmF0ZWRJZChub2RlKTtcclxuICAgICAgICB0aGlzLnNldEFjdGl2YXRlZE5vZGUodGhpcy5ub2RlcywgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIG5vZGUuY2hhbmdlICYmIG5vZGUuY2hhbmdlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoWElzRW1wdHkobm9kZS5waWQpKSB7XHJcbiAgICAgICAgbm9kZS5sZXZlbCA9IDA7XHJcbiAgICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRyZWVEYXRhID0gWy4uLnRoaXMudHJlZURhdGEsIG5vZGVdO1xyXG4gICAgICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlcywgbm9kZV07XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmF0ZWRJZChub2RlKTtcclxuICAgICAgICB0aGlzLnNldEFjdGl2YXRlZE5vZGUodGhpcy5ub2RlcywgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIG5vZGUuY2hhbmdlICYmIG5vZGUuY2hhbmdlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5sYXp5ICYmIHBhcmVudCAmJiAhcGFyZW50LmNoaWxkcmVuTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuZ2V0TGF6eURhdGEocGFyZW50LCAoKSA9PiB7XHJcbiAgICAgICAgX2FkZE5vZGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfYWRkTm9kZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0QWN0aXZhdGVkSWQobm9kZTogWFRyZWVOb2RlKSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGhpcy5vYmplY3RBcnJheSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVkSWQgPSBbbm9kZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZWRJZCA9IFtub2RlLmlkXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZWRJZCA9IG5vZGUuaWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2YXRlZElkQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmF0ZWRJZCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVOb2RlKG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgbGV0IHBhcmVudCA9IHRoaXMudHJlZURhdGEuZmluZCgoeCkgPT4geC5pZCA9PT0gbm9kZS5waWQpITtcclxuICAgIGNvbnN0IHJlbW92ZUNoaWxkcmVuID0gKG5kOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgWFJlbW92ZSh0aGlzLnRyZWVEYXRhLCAoeCkgPT4geC5pZCA9PT0gbmQuaWQpO1xyXG4gICAgICBpZiAobmQuY2hpbGRyZW4pIHtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG5kLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICByZW1vdmVDaGlsZHJlbihpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZW1vdmVDaGlsZHJlbihub2RlKTtcclxuXHJcbiAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgIGlmICghcGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4gPSBbXTtcclxuICAgICAgY29uc3QgY2hpbGRJbmRleCA9IHBhcmVudC5jaGlsZHJlbi5maW5kSW5kZXgoKHgpID0+IHguaWQgPT09IG5vZGUuaWQpO1xyXG4gICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShjaGlsZEluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJlbnQubGVhZiA9IHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldERhdGFDaGFuZ2UodGhpcy50cmVlRGF0YSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU5vZGUobm9kZTogWFRyZWVOb2RlLCBub3dOb2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIE9iamVjdC5hc3NpZ24obm9kZSwgbm93Tm9kZSk7XHJcbiAgICBub2RlLmNoYW5nZSAmJiBub2RlLmNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUl0ZW0oX2luZGV4OiBudW1iZXIsIGl0ZW06IFhUcmVlTm9kZSkge1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgI3RyZWUgY2xhc3M9XCJ4LXRyZWVcIiBbY2xhc3MueC10cmVlLW9ubHktbGVhZl09XCJvbmx5TGVhZlwiPlxyXG4gIEBpZiAodmlydHVhbFNjcm9sbCkge1xyXG4gICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxyXG4gICAgICAjdmlydHVhbEJvZHlcclxuICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcclxuICAgICAgW21pbkJ1ZmZlclB4XT1cIm1pbkJ1ZmZlclB4XCJcclxuICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4XCJcclxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJ2aXJ0dWFsU2Nyb2xsSGVpZ2h0XCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwieC10cmVlLWNvbnRlbnRcIlxyXG4gICAgICAgICNkcm9wTGlzdFxyXG4gICAgICAgIGNka0Ryb3BMaXN0XHJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGlzYWJsZWRdPVwiIWRyYWdcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICBbaGlkZGVuXT1cImlzRW1wdHlcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwibm9kZXNcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cInByZWRpY2F0ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8eC10cmVlLW5vZGVcclxuICAgICAgICAgICpjZGtWaXJ0dWFsRm9yPVwibGV0IG5vZGUgb2Ygbm9kZXM7IHRlbXBsYXRlQ2FjaGVTaXplOiAwOyB0cmFja0J5OiB0cmFja0J5SXRlbVwiXHJcbiAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cImNka0RyYWdTdGFydGVkKCRldmVudClcIlxyXG4gICAgICAgICAgKGNka0RyYWdFbmRlZCk9XCJjZGtEcmFnRW5kZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY2RrRHJhZ01vdmVkKT1cImNka0RyYWdNb3ZlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJub2RlXCJcclxuICAgICAgICAgIChub2RlTW91c2VlbnRlcik9XCJub2RlTW91c2VlbnRlcigkZXZlbnQpXCJcclxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxyXG4gICAgICAgICAgW2xhenldPVwibGF6eVwiXHJcbiAgICAgICAgICBbbGF6eURhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICBbbm9kZUhlaWdodF09XCJub2RlSGVpZ2h0XCJcclxuICAgICAgICAgIFtub2RlTm93cmFwXT1cIm5vZGVOb3dyYXBcIlxyXG4gICAgICAgICAgW25vZGVBbGlnbkl0ZW1zXT1cIm5vZGVBbGlnbkl0ZW1zXCJcclxuICAgICAgICAgIFt0cmVlXT1cInRoaXNcIlxyXG4gICAgICAgID48L3gtdHJlZS1ub2RlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cIngtdHJlZS1jb250ZW50XCJcclxuICAgICAgI2Ryb3BMaXN0XHJcbiAgICAgIGNka0Ryb3BMaXN0XHJcbiAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFkcmFnXCJcclxuICAgICAgW2Nka0Ryb3BMaXN0U29ydGluZ0Rpc2FibGVkXT1cInRydWVcIlxyXG4gICAgICBbaGlkZGVuXT1cImlzRW1wdHlcIlxyXG4gICAgICBbY2RrRHJvcExpc3REYXRhXT1cIm5vZGVzXCJcclxuICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwicHJlZGljYXRlXCJcclxuICAgID5cclxuICAgICAgQGZvciAobm9kZSBvZiBub2RlczsgdHJhY2sgbm9kZSkge1xyXG4gICAgICAgIDx4LXRyZWUtbm9kZVxyXG4gICAgICAgICAgY2RrRHJhZ1xyXG4gICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJub2RlLmRpc2FibGVkXCJcclxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJjZGtEcmFnU3RhcnRlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwiY2RrRHJhZ0VuZGVkKCRldmVudClcIlxyXG4gICAgICAgICAgKGNka0RyYWdNb3ZlZCk9XCJjZGtEcmFnTW92ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibm9kZVwiXHJcbiAgICAgICAgICAobm9kZU1vdXNlZW50ZXIpPVwibm9kZU1vdXNlZW50ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbbm9kZV09XCJub2RlXCJcclxuICAgICAgICAgIFtsYXp5XT1cImxhenlcIlxyXG4gICAgICAgICAgW2xhenlEYXRhXT1cImRhdGFcIlxyXG4gICAgICAgICAgW25vZGVIZWlnaHRdPVwibm9kZUhlaWdodFwiXHJcbiAgICAgICAgICBbbm9kZU5vd3JhcF09XCJub2RlTm93cmFwXCJcclxuICAgICAgICAgIFtub2RlQWxpZ25JdGVtc109XCJub2RlQWxpZ25JdGVtc1wiXHJcbiAgICAgICAgICBbdHJlZV09XCJ0aGlzXCJcclxuICAgICAgICA+PC94LXRyZWUtbm9kZT5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuXHJcbjwhLS0g5o+Q5YmN5Yqg6L29bG9hZGluZ+eahOWbvuaghy0tPlxyXG5AaWYgKGxhenkpIHtcclxuICA8eC1pY29uIFtzdHlsZS5kaXNwbGF5XT1cIidub25lJ1wiIHR5cGU9XCJmdG8tbG9hZGVyXCI+PC94LWljb24+XHJcbn1cclxuIl19
575
+ args: [{ selector: `${XTreePrefix}`, standalone: true, imports: [DragDropModule, ScrollingModule, XTreeNodeComponent, XIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #tree class=\"x-tree\" [class.x-tree-only-leaf]=\"onlyLeaf()\">\r\n @if (virtualScroll()) {\r\n <cdk-virtual-scroll-viewport\r\n #virtualBody\r\n [itemSize]=\"itemSize()\"\r\n [minBufferPx]=\"minBufferPxSignal()\"\r\n [maxBufferPx]=\"maxBufferPxSignal()\"\r\n [style.height.px]=\"virtualScrollHeightSignal()\"\r\n >\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag()\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty()\"\r\n [cdkDropListData]=\"nodes()\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n <x-tree-node\r\n *cdkVirtualFor=\"let node of nodes(); templateCacheSize: 0; trackBy: trackByItem\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [nodeHeight]=\"nodeHeight()\"\r\n [nodeNowrap]=\"nodeNowrap()\"\r\n [nodeAlignItems]=\"nodeAlignItems()\"\r\n [(disabled)]=\"node.disabled!\"\r\n [(id)]=\"node.id\"\r\n [(pid)]=\"node.pid\"\r\n [(leaf)]=\"node.leaf!\"\r\n [(height)]=\"node.height!\"\r\n [(alignItems)]=\"node.alignItems!\"\r\n [(loading)]=\"node.loading!\"\r\n [(level)]=\"node.level!\"\r\n [(open)]=\"node.open\"\r\n [(checked)]=\"node.checked!\"\r\n [(indeterminate)]=\"node.indeterminate!\"\r\n [(label)]=\"node.label!\"\r\n [(nowrap)]=\"node.nowrap!\"\r\n (toggle)=\"onToggle(null, $event)\"\r\n ></x-tree-node>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <div\r\n class=\"x-tree-content\"\r\n #dropList\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!drag()\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [hidden]=\"isEmpty()\"\r\n [cdkDropListData]=\"nodes()\"\r\n [cdkDropListEnterPredicate]=\"predicate\"\r\n >\r\n @for (node of nodes(); track node.id + '' + $index) {\r\n <x-tree-node\r\n cdkDrag\r\n [cdkDragDisabled]=\"node.disabled\"\r\n (cdkDragStarted)=\"cdkDragStarted($event)\"\r\n (cdkDragEnded)=\"cdkDragEnded($event)\"\r\n (cdkDragMoved)=\"cdkDragMoved($event)\"\r\n [cdkDragData]=\"node\"\r\n (nodeMouseenter)=\"nodeMouseenter($event)\"\r\n [node]=\"node\"\r\n [nodeHeight]=\"nodeHeight()\"\r\n [nodeNowrap]=\"nodeNowrap()\"\r\n [nodeAlignItems]=\"nodeAlignItems()\"\r\n [(disabled)]=\"node.disabled\"\r\n [(id)]=\"node.id\"\r\n [(pid)]=\"node.pid\"\r\n [(leaf)]=\"node.leaf\"\r\n [(height)]=\"node.height!\"\r\n [(alignItems)]=\"node.alignItems\"\r\n [(loading)]=\"node.loading\"\r\n [(level)]=\"node.level\"\r\n [(open)]=\"node.open\"\r\n [(checked)]=\"node.checked\"\r\n [(indeterminate)]=\"node.indeterminate\"\r\n [(label)]=\"node.label\"\r\n [(nowrap)]=\"node.nowrap\"\r\n (toggle)=\"onToggle(null, $event)\"\r\n ></x-tree-node>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- \u63D0\u524D\u52A0\u8F7Dloading\u7684\u56FE\u6807-->\r\n@if (lazy()) {\r\n <x-icon [style.display]=\"'none'\" type=\"fto-loader\"></x-icon>\r\n}\r\n", styles: [".x-tree{margin:0;padding:0}.x-tree-only-leaf .x-tree-node-sub{color:var(--x-text-300)}.x-tree-content.cdk-drop-list-dragging x-tree-node .x-tree-node-content:not(.x-disabled):not(.x-activated):hover{background-color:transparent}.x-tree-content.cdk-drop-list-dragging x-tree-node.cdk-drag-placeholder .x-tree-node-content{color:var(--x-primary);background-color:var(--x-background-a200);opacity:.8}.x-tree-content.cdk-drop-list-dragging x-tree-node:not(.cdk-drag-placeholder){transition:transform var(--x-animation-duration-base) cubic-bezier(0,0,.2,1)}\n"] }]
576
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.XTreeService }] });
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvbmctbmVzdC91aS90cmVlL3RyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGliL25nLW5lc3QvdWkvdHJlZS90cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBRWpCLFVBQVUsRUFFVix1QkFBdUIsRUFHdkIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxZQUFZLEVBQ1osU0FBUyxFQUNULFFBQVEsRUFDUixPQUFPLEVBQ1AsT0FBTyxFQUVQLGNBQWMsRUFDZCxRQUFRLEVBQ1QsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBa0QsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBVzNDLE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQTJCL0MsWUFDUyxRQUFtQixFQUNuQixVQUFtQyxFQUNuQyxHQUFzQixFQUN0QixX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QUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxpQkFHL0QsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIFJlbmRlcmVyMixcclxuICBFbGVtZW50UmVmLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIHZpZXdDaGlsZCxcclxuICB2aWV3Q2hpbGRyZW4sXHJcbiAgc2lnbmFsLFxyXG4gIGNvbXB1dGVkLFxyXG4gIGluamVjdCxcclxuICBlZmZlY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgWFRyZWVQcmVmaXgsIFhUcmVlTm9kZSwgWFRyZWVQcm9wZXJ0eSB9IGZyb20gJy4vdHJlZS5wcm9wZXJ0eSc7XHJcbmltcG9ydCB7XHJcbiAgWElzRW1wdHksXHJcbiAgWElzRnVuY3Rpb24sXHJcbiAgWElzVW5kZWZpbmVkLFxyXG4gIFhJc0NoYW5nZSxcclxuICBYU2V0RGF0YSxcclxuICBYUmVzaXplLFxyXG4gIFhSZW1vdmUsXHJcbiAgWFJlc2l6ZU9ic2VydmVyLFxyXG4gIFhDb21wdXRlZFN0eWxlLFxyXG4gIFhUb0Nzc1B4XHJcbn0gZnJvbSAnQG5nLW5lc3QvdWkvY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IFhUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vdHJlZS1ub2RlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdFbmQsIENka0RyYWdNb3ZlLCBDZGtEcmFnU3RhcnQsIENka0Ryb3BMaXN0LCBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBYVHJlZVNlcnZpY2UgfSBmcm9tICcuL3RyZWUuc2VydmljZSc7XHJcbmltcG9ydCB7IFhJY29uQ29tcG9uZW50IH0gZnJvbSAnQG5nLW5lc3QvdWkvaWNvbic7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgJHtYVHJlZVByZWZpeH1gLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0RyYWdEcm9wTW9kdWxlLCBTY3JvbGxpbmdNb2R1bGUsIFhUcmVlTm9kZUNvbXBvbmVudCwgWEljb25Db21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90cmVlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWFRyZWVDb21wb25lbnQgZXh0ZW5kcyBYVHJlZVByb3BlcnR5IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICB0cmVlID0gdmlld0NoaWxkKCd0cmVlJywgeyByZWFkOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB9KTtcclxuICB2aXJ0dWFsQm9keSA9IHZpZXdDaGlsZCgndmlydHVhbEJvZHknLCB7IHJlYWQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9KTtcclxuICBkcm9wTGlzdCA9IHZpZXdDaGlsZCgnZHJvcExpc3QnLCB7IHJlYWQ6IENka0Ryb3BMaXN0PEhUTUxFbGVtZW50PiB9KTtcclxuICBub2RlQ29tcG9uZW50cyA9IHZpZXdDaGlsZHJlbihYVHJlZU5vZGVDb21wb25lbnQpO1xyXG4gIHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xyXG4gIHByaXZhdGUgZm9udFNpemUgPSBjb21wdXRlZCgoKSA9PiBwYXJzZUZsb2F0KFhDb21wdXRlZFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZm9udC1zaXplJykpKTtcclxuXHJcbiAgbm9kZXMgPSBzaWduYWw8WFRyZWVOb2RlW10+KFtdKTtcclxuXHJcbiAgdmlydHVhbE5vZGVzID0gc2lnbmFsPFhUcmVlTm9kZVtdPihbXSk7XHJcbiAgYWN0aXZhdGVkTm9kZSA9IHNpZ25hbDxYVHJlZU5vZGUgfCBudWxsPihudWxsKTtcclxuICBkYXRhSXNGdW5jID0gc2lnbmFsKGZhbHNlKTtcclxuICBnZXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcclxuICB0cmVlRGF0YSA9IHNpZ25hbDxYVHJlZU5vZGVbXT4oW10pO1xyXG5cclxuICBkcmFnZ2luZyA9IHNpZ25hbChmYWxzZSk7XHJcbiAgZHJhZ1Bvc2l0aW9uID0gc2lnbmFsPC0xIHwgMT4oLTEpO1xyXG4gIGhvdmVyVHJlZU5vZGUgPSBzaWduYWw8WFRyZWVOb2RlIHwgbnVsbD4obnVsbCk7XHJcbiAgaG92ZXJUcmVlRWxlITogRWxlbWVudFJlZjtcclxuICBkcmFnZ2luZ1RyZWVOb2RlID0gc2lnbmFsPFhUcmVlTm9kZSB8IG51bGw+KG51bGwpO1xyXG4gIGhhc0NoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICBpc0VtcHR5ID0gY29tcHV0ZWQoKCkgPT4gWElzRW1wdHkodGhpcy5ub2RlcygpKSk7XHJcblxyXG4gIHByaXZhdGUgdW5TdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyITogWFJlc2l6ZU9ic2VydmVyO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB0cmVlU2VydmljZTogWFRyZWVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZpcnR1YWxCb2R5ID0gdGhpcy52aXJ0dWFsQm9keSgpO1xyXG4gICAgICBpZiAodmlydHVhbEJvZHkpIHtcclxuICAgICAgICB2aXJ0dWFsQm9keVsnX3Njcm9sbFN0cmF0ZWd5J11bJ19taW5CdWZmZXJQeCddID0gdGhpcy5taW5CdWZmZXJQeFNpZ25hbCgpO1xyXG4gICAgICAgIHZpcnR1YWxCb2R5Wydfc2Nyb2xsU3RyYXRlZ3knXVsnX21heEJ1ZmZlclB4J10gPSB0aGlzLm1heEJ1ZmZlclB4U2lnbmFsKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGVpZ2h0QWRhcHRpb25TaWduYWwgPSBzaWduYWw8bnVtYmVyPigwKTtcclxuXHJcbiAgaXNWaXJ0dWFsU2Nyb2xsQWRhcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gISEodGhpcy52aXJ0dWFsU2Nyb2xsKCkgJiYgdGhpcy5oZWlnaHRBZGFwdGlvbigpKTtcclxuICB9KTtcclxuXHJcbiAgdmlydHVhbFNjcm9sbEhlaWdodFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEFkYXB0aW9uKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0QWRhcHRpb25TaWduYWwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBYVG9Dc3NQeCh0aGlzLnZpcnR1YWxTY3JvbGxIZWlnaHQoKSwgdGhpcy5mb250U2l6ZSgpKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgbWluQnVmZmVyUHhTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxBZGFwdGlvbigpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxTY3JvbGxIZWlnaHRTaWduYWwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1pbkJ1ZmZlclB4KCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIG1heEJ1ZmZlclB4U2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuaXNWaXJ0dWFsU2Nyb2xsQWRhcHRpb24oKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsU2Nyb2xsSGVpZ2h0U2lnbmFsKCkgKiAxLjI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5tYXhCdWZmZXJQeCgpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGV4cGFuZGVkQWxsLCBkYXRhLCBjaGVja2VkLCBtYW51YWwgfSA9IGNoYW5nZXM7XHJcbiAgICBYSXNDaGFuZ2UoZGF0YSkgJiYgdGhpcy5zZXREYXRhKCk7XHJcbiAgICBYSXNDaGFuZ2UoZXhwYW5kZWRBbGwpICYmIHRoaXMuc2V0RXhwYW5kZWRBbGwoKTtcclxuICAgIFhJc0NoYW5nZShjaGVja2VkKSAmJiB0aGlzLnNldENoZWNrZWRLZXlzKHRoaXMuY2hlY2tlZCgpKTtcclxuICAgIFhJc0NoYW5nZShtYW51YWwpICYmIHRoaXMuc2V0TWFudWFsKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxBZGFwdGlvbigpKSB7XHJcbiAgICAgIHRoaXMuaGVpZ2h0QWRhcHRpb25TaWduYWwuc2V0KHRoaXMuaGVpZ2h0QWRhcHRpb24oKSEuY2xpZW50SGVpZ2h0ISk7XHJcbiAgICAgIFhSZXNpemUodGhpcy5oZWlnaHRBZGFwdGlvbigpISlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMCksXHJcbiAgICAgICAgICBtYXAoKHsgcmVzaXplT2JzZXJ2ZXIgfSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gcmVzaXplT2JzZXJ2ZXI7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0QWRhcHRpb25TaWduYWwuc2V0KHRoaXMuaGVpZ2h0QWRhcHRpb24oKSEuY2xpZW50SGVpZ2h0ISk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEFjdGl2YXRlZE5vZGUodGhpcy50cmVlRGF0YSgpKTtcclxuICAgIHRoaXMuc2V0U2Nyb2xsVG9wKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5TdWJqZWN0Lm5leHQoKTtcclxuICAgIHRoaXMudW5TdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcbiAgfVxyXG5cclxuICBzZXREYXRhKCkge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmRhdGEoKSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcclxuICAgIHRoaXMuZGF0YUlzRnVuYy5zZXQoZmFsc2UpO1xyXG4gICAgaWYgKFhJc0Z1bmN0aW9uKHRoaXMuZGF0YSgpKSkge1xyXG4gICAgICB0aGlzLmRhdGFJc0Z1bmMuc2V0KHRydWUpO1xyXG4gICAgICB0aGlzLmdldERhdGFCeUZ1bmMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFhTZXREYXRhPFhUcmVlTm9kZT4odGhpcy5kYXRhKCksIHRoaXMudW5TdWJqZWN0KS5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgICB0aGlzLnNldERhdGFDaGFuZ2UoeCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2RrRHJhZ1N0YXJ0ZWQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xyXG4gICAgdGhpcy5kcmFnZ2luZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmRyYWdnaW5nVHJlZU5vZGUuc2V0KGV2ZW50LnNvdXJjZS5kYXRhKTtcclxuICAgIGlmIChldmVudC5zb3VyY2UuZGF0YS5vcGVuKSB7XHJcbiAgICAgIHRoaXMub25Ub2dnbGUoZXZlbnQuZXZlbnQsIGV2ZW50LnNvdXJjZS5kYXRhKTtcclxuICAgIH1cclxuICAgIHRoaXMubm9kZURyYWdTdGFydGVkLmVtaXQoeyBldmVudCwgZnJvbTogdGhpcy5kcmFnZ2luZ1RyZWVOb2RlKCkhIH0pO1xyXG4gIH1cclxuXHJcbiAgY2RrRHJhZ0VuZGVkKGV2ZW50OiBDZGtEcmFnRW5kKSB7XHJcbiAgICB0aGlzLmRyYWdnaW5nLnNldChmYWxzZSk7XHJcbiAgICBjb25zdCBob3ZlclRyZWVOb2RlID0gdGhpcy5ob3ZlclRyZWVOb2RlKCk7XHJcbiAgICBpZiAoaG92ZXJUcmVlTm9kZSkge1xyXG4gICAgICBpZiAoaG92ZXJUcmVlTm9kZS5pZCAhPT0gZXZlbnQuc291cmNlLmRhdGEuaWQpIHtcclxuICAgICAgICB0aGlzLmluc2VydE5vZGUoZXZlbnQuc291cmNlLmRhdGEsIGhvdmVyVHJlZU5vZGUsIHRoaXMuZHJhZ1Bvc2l0aW9uKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGhvdmVyVHJlZU5vZGUuY2hhbmdlICYmIGhvdmVyVHJlZU5vZGUuY2hhbmdlKCk7XHJcbiAgICAgIHRoaXMubm9kZURyYWdFbmRlZC5lbWl0KHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBmcm9tOiBldmVudC5zb3VyY2UuZGF0YSxcclxuICAgICAgICB0bzogaG92ZXJUcmVlTm9kZSxcclxuICAgICAgICBwb3NpdGlvbjogdGhpcy5kcmFnUG9zaXRpb24oKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluc2VydE5vZGUoZHJhZ05vZGU6IFhUcmVlTm9kZSwgaG92ZXJOb2RlOiBYVHJlZU5vZGUsIGRyYWdQb3NpdGlvbjogLTEgfCAxKSB7XHJcbiAgICBsZXQgcGFyZW50ID0gdGhpcy5ub2RlcygpLmZpbmQoKHgpID0+IHguaWQgPT09IGRyYWdOb2RlLnBpZCk7XHJcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm1vdmVOb2RlKHRoaXMudHJlZURhdGEoKSwgZHJhZ05vZGUsIGhvdmVyTm9kZSwgZHJhZ1Bvc2l0aW9uKTtcclxuICAgIHRoaXMuc2V0RGF0YUNoYW5nZSh0aGlzLnRyZWVEYXRhKCksIHRydWUsIGZhbHNlLCB0cnVlLCBwYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgY2RrRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZTxYVHJlZU5vZGU+KSB7XHJcbiAgICBjb25zdCBob3ZlclRyZWVOb2RlID0gdGhpcy5ob3ZlclRyZWVOb2RlKCk7XHJcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcoKSB8fCAhaG92ZXJUcmVlTm9kZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55O1xyXG4gICAgaWYgKGV2ZW50LnNvdXJjZS5kYXRhLmlkID09PSBob3ZlclRyZWVOb2RlLmlkKSByZXR1cm47XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmhvdmVyVHJlZUVsZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgeyB0b3AsIGhlaWdodCB9ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgZGVzID0gTWF0aC5tYXgoaGVpZ2h0ICogMC41LCAyKTtcclxuICAgIGlmICh5ID4gdG9wICYmIHkgPCB0b3AgKyBkZXMpIHtcclxuICAgICAgdGhpcy5kcmFnUG9zaXRpb24uc2V0KC0xKTtcclxuICAgIH0gZWxzZSBpZiAoeSA+IHRvcCArIGRlcyAmJiB5IDwgdG9wICsgaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuZHJhZ1Bvc2l0aW9uLnNldCgxKTtcclxuICAgIH1cclxuICAgIGhvdmVyVHJlZU5vZGUuY2hhbmdlICYmIGhvdmVyVHJlZU5vZGUuY2hhbmdlKCk7XHJcbiAgICB0aGlzLm5vZGVEcmFnTW92ZWQuZW1pdCh7XHJcbiAgICAgIGV2ZW50LFxyXG4gICAgICBmcm9tOiB0aGlzLmRyYWdnaW5nVHJlZU5vZGUoKSEsXHJcbiAgICAgIHRvOiBob3ZlclRyZWVOb2RlLFxyXG4gICAgICBwb3NpdGlvbjogdGhpcy5kcmFnUG9zaXRpb24oKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcmVkaWNhdGUoX2RyYWc6IENka0RyYWc8WFRyZWVOb2RlPiwgX2Ryb3A6IENka0Ryb3BMaXN0PFhUcmVlTm9kZT4pIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRNYW51YWwoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhSXNGdW5jKCkpIHRoaXMuZ2V0RGF0YUJ5RnVuYygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhQnlGdW5jKCkge1xyXG4gICAgaWYgKCF0aGlzLm1hbnVhbCgpKSByZXR1cm47XHJcbiAgICBYU2V0RGF0YTxYVHJlZU5vZGU+KCh0aGlzLmRhdGEoKSBhcyBGdW5jdGlvbikoKSwgdGhpcy51blN1YmplY3QpLnN1YnNjcmliZSgoeCkgPT4ge1xyXG4gICAgICB0aGlzLnNldERhdGFDaGFuZ2UoeCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0YUNoYW5nZShcclxuICAgIHZhbHVlOiBYVHJlZU5vZGVbXSxcclxuICAgIHJlZ2V0Q2hpbGRyZW4gPSBmYWxzZSxcclxuICAgIGluaXQgPSB0cnVlLFxyXG4gICAgcGFyZW50T3BlbiA9IHRydWUsXHJcbiAgICBsYXp5UGFyYW50PzogWFRyZWVOb2RlXHJcbiAgKSB7XHJcbiAgICBpZiAoWElzRW1wdHkodGhpcy5jaGVja2VkKCkpIHx8ICF0aGlzLmhhc0NoZWNrZWQoKSkgdGhpcy5jaGVja2VkLnNldChbXSk7XHJcbiAgICBjb25zdCBnZXRDaGlsZHJlbiA9IChub2RlOiBYVHJlZU5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKGluaXQpIHtcclxuICAgICAgICBub2RlLmxldmVsID0gbGV2ZWw7XHJcbiAgICAgICAgbm9kZS5vcGVuID1cclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWRBbGwoKSB8fCBsZXZlbCA8PSB0aGlzLmV4cGFuZGVkTGV2ZWwoKSB8fCB0aGlzLmV4cGFuZGVkKCkuaW5jbHVkZXMobm9kZS5pZCkgfHwgbm9kZS5vcGVuO1xyXG4gICAgICAgIG5vZGUuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZCgpLmluY2x1ZGVzKG5vZGUuaWQpIHx8IG5vZGUuY2hlY2tlZDtcclxuICAgICAgICBub2RlLmNoaWxkcmVuTG9hZGVkID0gbm9kZS5vcGVuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChYSXNVbmRlZmluZWQobm9kZS5jaGlsZHJlbikgfHwgcmVnZXRDaGlsZHJlbikge1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSB2YWx1ZS5maWx0ZXIoKHkpID0+IHkucGlkID09PSBub2RlLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5sZXZlbENoZWNrKCkgJiYgbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoZWNrZWQpIHtcclxuICAgICAgICAgIGZvciAobGV0IG5kIG9mIG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgbmQuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZC51cGRhdGUoKHgpID0+IHtcclxuICAgICAgICAgICAgICB4LnB1c2gobmQuaWQpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBbLi4ueF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoKCF0aGlzLmxhenkoKSAmJiAoWElzVW5kZWZpbmVkKG5vZGUubGVhZikgfHwgcmVnZXRDaGlsZHJlbikpIHx8IG5vZGUuaWQgPT09IGxhenlQYXJhbnQ/LmlkKSB7XHJcbiAgICAgICAgbm9kZS5sZWFmID0gKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCBhcyBudW1iZXIpID09PSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbm9kZS5sZWFmKSBub2RlLmNoaWxkcmVuPy5tYXAoKHkpID0+IGdldENoaWxkcmVuKHksIGxldmVsICsgMSkpO1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH07XHJcbiAgICB0aGlzLnRyZWVEYXRhLnNldCh2YWx1ZSk7XHJcbiAgICB0aGlzLm5vZGVzLnNldCh2YWx1ZS5maWx0ZXIoKHgpID0+IFhJc0VtcHR5KHgucGlkKSkubWFwKCh4KSA9PiBnZXRDaGlsZHJlbih4LCAwKSkpO1xyXG4gICAgaWYgKHBhcmVudE9wZW4pIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXRlbS5sZWFmICYmIGl0ZW0ub3Blbikge1xyXG4gICAgICAgICAgdGhpcy5zZXRQYXJlbnRPcGVuKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2V0RXhwYW5kZWQoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgbm9kZU1vdXNlZW50ZXIoJGV2ZW50OiB7IGV2ZW50OiBNb3VzZUV2ZW50OyBub2RlOiBYVHJlZU5vZGU7IGVsZTogRWxlbWVudFJlZiB9KSB7XHJcbiAgICBjb25zdCB7IG5vZGUsIGVsZSB9ID0gJGV2ZW50O1xyXG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKCkpIHJldHVybjtcclxuICAgIGxldCBiZWZvcmUgPSB0aGlzLmhvdmVyVHJlZU5vZGUoKTtcclxuICAgIHRoaXMuaG92ZXJUcmVlTm9kZS5zZXQobm9kZSk7XHJcbiAgICB0aGlzLmhvdmVyVHJlZUVsZSA9IGVsZTtcclxuICAgIGNvbnN0IGhvdmVyVHJlZU5vZGUgPSB0aGlzLmhvdmVyVHJlZU5vZGUoKTtcclxuICAgIGlmIChob3ZlclRyZWVOb2RlKSB7XHJcbiAgICAgIGhvdmVyVHJlZU5vZGUuY2hhbmdlICYmIGhvdmVyVHJlZU5vZGUuY2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoYmVmb3JlKSB7XHJcbiAgICAgIGJlZm9yZS5jaGFuZ2UgJiYgYmVmb3JlLmNoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghbm9kZS5sZWFmICYmICFub2RlLm9wZW4pIHtcclxuICAgICAgbGV0IGZyb20gPSB0aGlzLm5vZGVzKCkuaW5kZXhPZih0aGlzLmRyYWdnaW5nVHJlZU5vZGUoKSEpO1xyXG4gICAgICBsZXQgdG8gPSB0aGlzLm5vZGVzKCkuaW5kZXhPZihub2RlKTtcclxuICAgICAgaWYgKHRvIC0gZnJvbSAhPT0gLTEpIHtcclxuICAgICAgICB0aGlzLm9uVG9nZ2xlKG51bGwhLCBub2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0U2Nyb2xsVG9wKCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsRWxlbWVudCgpO1xyXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50IHx8ICF0aGlzLmFjdGl2YXRlZE5vZGUoKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgaW54ID0gdGhpcy5ub2RlcygpLmluZGV4T2YodGhpcy5hY3RpdmF0ZWROb2RlKCkhKTtcclxuICAgIGxldCBjb20gPSB0aGlzLm5vZGVDb21wb25lbnRzKCkuZmluZCgoXywgaW5kZXgpID0+IGluZGV4ID09PSBpbngpO1xyXG4gICAgaWYgKCFjb20pIHJldHVybjtcclxuICAgIGxldCBlbGUgPSBjb20uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgbGV0IHNjcm9sbEVsZSA9IHNjcm9sbEVsZW1lbnQ7XHJcbiAgICBsZXQgbWluID0gc2Nyb2xsRWxlLnNjcm9sbFRvcDtcclxuICAgIGxldCBtYXggPSBzY3JvbGxFbGUuc2Nyb2xsVG9wICsgc2Nyb2xsRWxlLmNsaWVudEhlaWdodDtcclxuICAgIGlmIChlbGUub2Zmc2V0VG9wICsgZWxlLmNsaWVudEhlaWdodCA+IG1heCkge1xyXG4gICAgICBsZXQgc2Nyb2xsVG9wID0gZWxlLm9mZnNldFRvcCArIGVsZS5jbGllbnRIZWlnaHQgLSBzY3JvbGxFbGUuY2xpZW50SGVpZ2h0O1xyXG4gICAgICBzY3JvbGxFbGUuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgfVxyXG4gICAgaWYgKGVsZS5vZmZzZXRUb3AgPCBtaW4pIHtcclxuICAgICAgc2Nyb2xsRWxlLnNjcm9sbFRvcCA9IGVsZS5vZmZzZXRUb3A7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2VkTm9kZXMoKTogWFRyZWVOb2RlW10ge1xyXG4gICAgbGV0IHJlc3VsdDogWFRyZWVOb2RlW10gPSBbXTtcclxuICAgIGNvbnN0IGdldENoaWxkcmVuID0gKG5vZGVzOiBYVHJlZU5vZGVbXSkgPT4ge1xyXG4gICAgICBpZiAoWElzRW1wdHkobm9kZXMpKSByZXR1cm47XHJcbiAgICAgIG5vZGVzLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgICBpZiAoeC5jaGVja2VkICYmICFyZXN1bHQuaW5jbHVkZXMoeCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRDaGlsZHJlbih4LmNoaWxkcmVuIGFzIFhUcmVlTm9kZVtdKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0Q2hpbGRyZW4odGhpcy5ub2RlcygpKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2VkS2V5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWROb2RlcygpLm1hcCgoeCkgPT4geC5pZCk7XHJcbiAgfVxyXG5cclxuICBzZXRDaGVja2VkS2V5cyhrZXlzOiBhbnlbXSA9IFtdKSB7XHJcbiAgICBpZiAoIVhJc0VtcHR5KGtleXMpKSB0aGlzLmhhc0NoZWNrZWQuc2V0KHRydWUpO1xyXG4gICAgY29uc3Qgc2V0Q2hpbGRyZW4gPSAobm9kZXM6IFhUcmVlTm9kZVtdLCBjbGVhciA9IGZhbHNlKSA9PiB7XHJcbiAgICAgIGlmIChYSXNFbXB0eShub2RlcykpIHJldHVybjtcclxuICAgICAgbm9kZXMuZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICAgIHguY2hlY2tlZCA9ICFjbGVhciAmJiBrZXlzLmluY2x1ZGVzKHguaWQpO1xyXG4gICAgICAgIHguY2hhbmdlICYmIHguY2hhbmdlKHRydWUpO1xyXG4gICAgICAgIHNldENoaWxkcmVuKHguY2hpbGRyZW4gYXMgWFRyZWVOb2RlW10sIGNsZWFyKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgc2V0Q2hpbGRyZW4odGhpcy5ub2RlcygpLCBYSXNFbXB0eShrZXlzKSk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkQWxsKCkge1xyXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRBbGwoKSAmJiB0aGlzLnRyZWVEYXRhKCkubGVuZ3RoID09PSB0aGlzLm5vZGVzKCkubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCBzZXRDaGlsZHJlbiA9IChub2RlczogWFRyZWVOb2RlW10pID0+IHtcclxuICAgICAgaWYgKFhJc0VtcHR5KG5vZGVzKSkgcmV0dXJuO1xyXG4gICAgICBub2Rlcy5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgeC5vcGVuID0gdGhpcy5leHBhbmRlZEFsbCgpO1xyXG4gICAgICAgIHguY2hhbmdlICYmIHguY2hhbmdlKCk7XHJcbiAgICAgICAgc2V0Q2hpbGRyZW4oeC5jaGlsZHJlbiBhcyBYVHJlZU5vZGVbXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHNldENoaWxkcmVuKHRoaXMubm9kZXMoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRBbGwoKSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5ub2Rlcy5zZXQodGhpcy50cmVlRGF0YSgpLmZpbHRlcigoeCkgPT4gWElzRW1wdHkoeC5waWQpKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy52aXJ0dWFsTm9kZXMoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLnZpcnR1YWxOb2Rlcy5zZXQoWy4uLnRoaXMubm9kZXMoKV0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubm9kZXMuc2V0KHRoaXMudmlydHVhbE5vZGVzKCkpO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMudmlydHVhbE5vZGVzKCkpIHtcclxuICAgICAgICB0aGlzLnNldFZpcnR1YWxFeHBhbmRlZEFsbChpdGVtLCB0aGlzLmV4cGFuZGVkQWxsKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpcnR1YWxCb2R5KCk/LmNoZWNrVmlld3BvcnRTaXplKCk7XHJcbiAgfVxyXG5cclxuICBzZXRFeHBhbmRlZCgpIHtcclxuICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5ub2RlcygpKSB7XHJcbiAgICAgIGlmIChpdGVtLm9wZW4gJiYgaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMubm9kZXMoKS5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMubm9kZXMudXBkYXRlKCh4KSA9PiB7XHJcbiAgICAgICAgICB4LnNwbGljZShpbmRleCArIDEsIDAsIC4uLihpdGVtLmNoaWxkcmVuIGFzIFhUcmVlTm9kZVtdKSk7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnhdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZW0uY2hhbmdlICYmIGl0ZW0uY2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRWaXJ0dWFsRXhwYW5kZWRBbGwoaXRlbTogWFRyZWVOb2RlLCBleHBhbmRlZEFsbDogYm9vbGVhbikge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5ub2RlcygpLmluZGV4T2YoaXRlbSk7XHJcbiAgICBpZiAoZXhwYW5kZWRBbGwpIHtcclxuICAgICAgbGV0IGFkZE5vZGVzOiBYVHJlZU5vZGVbXSA9IFtdO1xyXG4gICAgICBjb25zdCBnZXROb2RlcyA9IChuZDogWFRyZWVOb2RlKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgbmQuY2hpbGRyZW4hKSB7XHJcbiAgICAgICAgICBhZGROb2Rlcy5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgIGdldE5vZGVzKGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGdldE5vZGVzKGl0ZW0pO1xyXG4gICAgICB0aGlzLm5vZGVzLnVwZGF0ZSgoeCkgPT4ge1xyXG4gICAgICAgIHguc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uYWRkTm9kZXMpO1xyXG4gICAgICAgIHJldHVybiBbLi4ueF07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlydHVhbFRvZ2dsZShub2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIGxldCBpbmRleCA9IHRoaXMubm9kZXMoKS5pbmRleE9mKG5vZGUpO1xyXG4gICAgaWYgKG5vZGUub3Blbikge1xyXG4gICAgICBsZXQgYWRkTm9kZXM6IFhUcmVlTm9kZVtdID0gW107XHJcbiAgICAgIGNvbnN0IGdldE5vZGVzID0gKG5kOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgICBpZiAoWElzRW1wdHkobmQuY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgbmQuY2hpbGRyZW4hKSB7XHJcbiAgICAgICAgICBhZGROb2Rlcy5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgIGNoaWxkLm9wZW4gJiYgZ2V0Tm9kZXMoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZ2V0Tm9kZXMobm9kZSk7XHJcbiAgICAgIHRoaXMubm9kZXMudXBkYXRlKCh4KSA9PiB7XHJcbiAgICAgICAgeC5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5hZGROb2Rlcyk7XHJcbiAgICAgICAgcmV0dXJuIFsuLi54XTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGVsQ291bnQgPSAwO1xyXG4gICAgICBjb25zdCBnZXRDb3VudCA9IChuZDogWFRyZWVOb2RlKSA9PiB7XHJcbiAgICAgICAgaWYgKFhJc0VtcHR5KG5kLmNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGRlbENvdW50ICs9IG5kLmNoaWxkcmVuIS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgbmQuY2hpbGRyZW4hKSB7XHJcbiAgICAgICAgICBjaGlsZC5vcGVuICYmIGdldENvdW50KGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGdldENvdW50KG5vZGUpO1xyXG4gICAgICB0aGlzLm5vZGVzLnVwZGF0ZSgoeCkgPT4ge1xyXG4gICAgICAgIHguc3BsaWNlKGluZGV4ICsgMSwgZGVsQ291bnQpO1xyXG4gICAgICAgIHJldHVybiBbLi4ueF07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkT3JSZW1vdmVFeHBhbmRlZChub2RlKTtcclxuICAgIHRoaXMudmlydHVhbEJvZHkoKT8uY2hlY2tWaWV3cG9ydFNpemUoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGFkZE9yUmVtb3ZlRXhwYW5kZWQobm9kZTogWFRyZWVOb2RlKSB7XHJcbiAgICBpZiAobm9kZS5vcGVuKSB7XHJcbiAgICAgIGlmICghdGhpcy5leHBhbmRlZCgpLmluY2x1ZGVzKG5vZGUuaWQpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZC51cGRhdGUoKHgpID0+IHtcclxuICAgICAgICAgIHgucHVzaChub2RlLmlkKTtcclxuICAgICAgICAgIHJldHVybiBbLi4ueF07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmV4cGFuZGVkKCkuaW5jbHVkZXMobm9kZS5pZCkpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGVkLnVwZGF0ZSgoeCkgPT4ge1xyXG4gICAgICAgICAgeC5zcGxpY2UoeC5pbmRleE9mKG5vZGUuaWQpLCAxKTtcclxuICAgICAgICAgIHJldHVybiBbLi4ueF07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEFjdGl2YXRlZE5vZGUobm9kZXM6IFhUcmVlTm9kZVtdLCBwYXJlbnRPcGVuID0gdHJ1ZSwgZGF0YUNoYW5nZSA9IHRydWUpIHtcclxuICAgIGlmIChYSXNFbXB0eSh0aGlzLmFjdGl2YXRlZElkKCkpICYmIHRoaXMubXVsdGlwbGUoKSkge1xyXG4gICAgICB0aGlzLmFjdGl2YXRlZElkLnNldChbXSk7XHJcbiAgICB9XHJcbiAgICBsZXQgYmVmb3JlID0gdGhpcy5hY3RpdmF0ZWROb2RlKCk7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XHJcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRlZElkKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBpZHMgPSB0aGlzLm9iamVjdEFycmF5KCkgPyB0aGlzLmFjdGl2YXRlZElkKCkubWFwKCh4OiBYVHJlZU5vZGUpID0+IHguaWQpIDogdGhpcy5hY3RpdmF0ZWRJZCgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzLmZpbmQoKHgpID0+IHguaWQgPT09IGlkc1tpXSkgYXMgWFRyZWVOb2RlO1xyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgcGFyZW50T3BlbiAmJiB0aGlzLnNldFBhcmVudE9wZW4obm9kZXMsIG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gaWRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlZE5vZGUuc2V0KG5vZGUpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVkQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmF0ZWROb2RlKCkhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFjdGl2YXRlZElkID0gdGhpcy5hY3RpdmF0ZWRJZCgpO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlZE5vZGUuc2V0KG5vZGVzLmZpbmQoKHgpID0+IHguaWQgPT09IGFjdGl2YXRlZElkKSBhcyBYVHJlZU5vZGUpO1xyXG4gICAgICBpZiAodGhpcy5hY3RpdmF0ZWROb2RlKCkpIHtcclxuICAgICAgICBwYXJlbnRPcGVuICYmIHRoaXMuc2V0UGFyZW50T3Blbihub2RlcywgdGhpcy5hY3RpdmF0ZWROb2RlKCkhKTtcclxuICAgICAgICB0aGlzLmFjdGl2YXRlZENoYW5nZS5lbWl0KHRoaXMuYWN0aXZhdGVkTm9kZSgpISk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChiZWZvcmUpIHtcclxuICAgICAgYmVmb3JlLmNoYW5nZSAmJiBiZWZvcmUuY2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIVhJc0VtcHR5KG5vZGVzKSAmJiBkYXRhQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0YUNoYW5nZShub2RlcywgZmFsc2UsIHRydWUsIHBhcmVudE9wZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UGFyZW50T3Blbihub2RlczogWFRyZWVOb2RlW10sIG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgY29uc3QgZ2V0UGFyZW50ID0gKGNoaWxkOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgaWYgKFhJc0VtcHR5KGNoaWxkLnBpZCkpIHJldHVybjtcclxuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZXMuZmluZCgoeCkgPT4geC5pZCA9PT0gY2hpbGQucGlkKSBhcyBYVHJlZU5vZGU7XHJcbiAgICAgIGlmICghWElzRW1wdHkocGFyZW50KSkge1xyXG4gICAgICAgIGlmICghdGhpcy5leHBhbmRlZCgpLmluY2x1ZGVzKHBhcmVudC5pZCkpIHtcclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWQudXBkYXRlKCh4KSA9PiBbLi4ueCwgcGFyZW50LmlkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudC5vcGVuID0gdHJ1ZTtcclxuICAgICAgICBwYXJlbnQuY2hhbmdlICYmIHBhcmVudC5jaGFuZ2UoKTtcclxuICAgICAgICBnZXRQYXJlbnQocGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGdldFBhcmVudChub2RlKTtcclxuICB9XHJcblxyXG4gIG9uVG9nZ2xlKGV2ZW50OiBFdmVudCB8IG51bGwsIG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgbm9kZS5vcGVuID0gIW5vZGUub3BlbjtcclxuICAgIGlmICh0aGlzLmxhenkoKSAmJiAhbm9kZS5jaGlsZHJlbkxvYWRlZCkge1xyXG4gICAgICB0aGlzLmdldExhenlEYXRhKG5vZGUsICgpID0+IHRoaXMudmlydHVhbFRvZ2dsZShub2RlKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZpcnR1YWxUb2dnbGUobm9kZSk7XHJcbiAgICB9XHJcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldExhenlEYXRhKG5vZGU6IFhUcmVlTm9kZSwgY2FsbEJhY2s/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICBub2RlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbm9kZS5jaGFuZ2UgJiYgbm9kZS5jaGFuZ2UoKTtcclxuICAgICh0aGlzLmRhdGEoKSBhcyAocGlkPzogYW55KSA9PiBPYnNlcnZhYmxlPFhUcmVlTm9kZVtdPikobm9kZS5pZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKCh4KSA9PlxyXG4gICAgICAgICAgeC5tYXAoKHkpID0+IHtcclxuICAgICAgICAgICAgeS5sZXZlbCA9IChub2RlLmxldmVsIGFzIG51bWJlcikgKyAxO1xyXG4gICAgICAgICAgICB5LmNoZWNrZWQgPSBub2RlLmNoZWNrZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiB5O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoeCkgPT4ge1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSB4O1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW5Mb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIG5vZGUubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudHJlZURhdGEuc2V0KFsuLi50aGlzLnRyZWVEYXRhKCksIC4uLnhdKTtcclxuICAgICAgICBpZiAoY2FsbEJhY2spIGNhbGxCYWNrKCk7XHJcbiAgICAgICAgbm9kZS5jaGFuZ2UgJiYgbm9kZS5jaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGROb2RlKG5vZGU6IFhUcmVlTm9kZSkge1xyXG4gICAgbGV0IHBhcmVudCA9IHRoaXMudHJlZURhdGEoKS5maW5kKCh4KSA9PiB4LmlkID09PSBub2RlLnBpZCkhO1xyXG4gICAgY29uc3QgX2FkZE5vZGUgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICBub2RlLmxldmVsID0gcGFyZW50LmxldmVsISArIDE7XHJcbiAgICAgICAgbm9kZS5waWQgPSBwYXJlbnQuaWQ7XHJcbiAgICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcclxuICAgICAgICBwYXJlbnQubGVhZiA9IGZhbHNlO1xyXG4gICAgICAgIHBhcmVudC5vcGVuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRyZWVEYXRhLnNldChbLi4udGhpcy50cmVlRGF0YSgpLCBub2RlXSk7XHJcbiAgICAgICAgdGhpcy5zZXRQYXJlbnRPcGVuKHRoaXMudHJlZURhdGEoKSwgbm9kZSk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhQ2hhbmdlKHRoaXMudHJlZURhdGEoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLnNldEFjdGl2YXRlZElkKG5vZGUpO1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZhdGVkTm9kZSh0aGlzLm5vZGVzKCksIHRydWUsIGZhbHNlKTtcclxuICAgICAgICBub2RlLmNoYW5nZSAmJiBub2RlLmNoYW5nZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKFhJc0VtcHR5KG5vZGUucGlkKSkge1xyXG4gICAgICAgIG5vZGUubGV2ZWwgPSAwO1xyXG4gICAgICAgIG5vZGUubGVhZiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50cmVlRGF0YS5zZXQoWy4uLnRoaXMudHJlZURhdGEoKSwgbm9kZV0pO1xyXG4gICAgICAgIHRoaXMubm9kZXMuc2V0KFsuLi50aGlzLm5vZGVzKCksIG5vZGVdKTtcclxuICAgICAgICB0aGlzLnNldEFjdGl2YXRlZElkKG5vZGUpO1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZhdGVkTm9kZSh0aGlzLm5vZGVzKCksIHRydWUsIGZhbHNlKTtcclxuICAgICAgICBub2RlLmNoYW5nZSAmJiBub2RlLmNoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMubGF6eSgpICYmIHBhcmVudCAmJiAhcGFyZW50LmNoaWxkcmVuTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuZ2V0TGF6eURhdGEocGFyZW50LCAoKSA9PiB7XHJcbiAgICAgICAgX2FkZE5vZGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfYWRkTm9kZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0QWN0aXZhdGVkSWQobm9kZTogWFRyZWVOb2RlKSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XHJcbiAgICAgIGlmICh0aGlzLm9iamVjdEFycmF5KCkpIHtcclxuICAgICAgICB0aGlzLmFjdGl2YXRlZElkLnNldChbbm9kZV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVkSWQuc2V0KFtub2RlLmlkXSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVkSWQuc2V0KG5vZGUuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTm9kZShub2RlOiBYVHJlZU5vZGUpIHtcclxuICAgIGxldCBwYXJlbnQgPSB0aGlzLnRyZWVEYXRhKCkuZmluZCgoeCkgPT4geC5pZCA9PT0gbm9kZS5waWQpITtcclxuICAgIGNvbnN0IHJlbW92ZUNoaWxkcmVuID0gKG5kOiBYVHJlZU5vZGUpID0+IHtcclxuICAgICAgWFJlbW92ZSh0aGlzLnRyZWVEYXRhKCksICh4KSA9PiB4LmlkID09PSBuZC5pZCk7XHJcbiAgICAgIGlmIChuZC5jaGlsZHJlbikge1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbmQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIHJlbW92ZUNoaWxkcmVuKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlbW92ZUNoaWxkcmVuKG5vZGUpO1xyXG5cclxuICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgaWYgKCFwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICBjb25zdCBjaGlsZEluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoeCkgPT4geC5pZCA9PT0gbm9kZS5pZCk7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcclxuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcmVudC5sZWFmID0gcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RGF0YUNoYW5nZSh0aGlzLnRyZWVEYXRhKCksIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVOb2RlKG5vZGU6IFhUcmVlTm9kZSwgbm93Tm9kZTogWFRyZWVOb2RlKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKG5vZGUsIG5vd05vZGUpO1xyXG4gICAgbm9kZS5jaGFuZ2UgJiYgbm9kZS5jaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJdGVtKF9pbmRleDogbnVtYmVyLCBpdGVtOiBYVHJlZU5vZGUpIHtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICN0cmVlIGNsYXNzPVwieC10cmVlXCIgW2NsYXNzLngtdHJlZS1vbmx5LWxlYWZdPVwib25seUxlYWYoKVwiPlxyXG4gIEBpZiAodmlydHVhbFNjcm9sbCgpKSB7XHJcbiAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XHJcbiAgICAgICN2aXJ0dWFsQm9keVxyXG4gICAgICBbaXRlbVNpemVdPVwiaXRlbVNpemUoKVwiXHJcbiAgICAgIFttaW5CdWZmZXJQeF09XCJtaW5CdWZmZXJQeFNpZ25hbCgpXCJcclxuICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4U2lnbmFsKClcIlxyXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInZpcnR1YWxTY3JvbGxIZWlnaHRTaWduYWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIngtdHJlZS1jb250ZW50XCJcclxuICAgICAgICAjZHJvcExpc3RcclxuICAgICAgICBjZGtEcm9wTGlzdFxyXG4gICAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFkcmFnKClcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICBbaGlkZGVuXT1cImlzRW1wdHkoKVwiXHJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlcygpXCJcclxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJwcmVkaWNhdGVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHgtdHJlZS1ub2RlXHJcbiAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBub2RlIG9mIG5vZGVzKCk7IHRlbXBsYXRlQ2FjaGVTaXplOiAwOyB0cmFja0J5OiB0cmFja0J5SXRlbVwiXHJcbiAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cImNka0RyYWdTdGFydGVkKCRldmVudClcIlxyXG4gICAgICAgICAgKGNka0RyYWdFbmRlZCk9XCJjZGtEcmFnRW5kZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY2RrRHJhZ01vdmVkKT1cImNka0RyYWdNb3ZlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJub2RlXCJcclxuICAgICAgICAgIChub2RlTW91c2VlbnRlcik9XCJub2RlTW91c2VlbnRlcigkZXZlbnQpXCJcclxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxyXG4gICAgICAgICAgW25vZGVIZWlnaHRdPVwibm9kZUhlaWdodCgpXCJcclxuICAgICAgICAgIFtub2RlTm93cmFwXT1cIm5vZGVOb3dyYXAoKVwiXHJcbiAgICAgICAgICBbbm9kZUFsaWduSXRlbXNdPVwibm9kZUFsaWduSXRlbXMoKVwiXHJcbiAgICAgICAgICBbKGRpc2FibGVkKV09XCJub2RlLmRpc2FibGVkIVwiXHJcbiAgICAgICAgICBbKGlkKV09XCJub2RlLmlkXCJcclxuICAgICAgICAgIFsocGlkKV09XCJub2RlLnBpZFwiXHJcbiAgICAgICAgICBbKGxlYWYpXT1cIm5vZGUubGVhZiFcIlxyXG4gICAgICAgICAgWyhoZWlnaHQpXT1cIm5vZGUuaGVpZ2h0IVwiXHJcbiAgICAgICAgICBbKGFsaWduSXRlbXMpXT1cIm5vZGUuYWxpZ25JdGVtcyFcIlxyXG4gICAgICAgICAgWyhsb2FkaW5nKV09XCJub2RlLmxvYWRpbmchXCJcclxuICAgICAgICAgIFsobGV2ZWwpXT1cIm5vZGUubGV2ZWwhXCJcclxuICAgICAgICAgIFsob3BlbildPVwibm9kZS5vcGVuXCJcclxuICAgICAgICAgIFsoY2hlY2tlZCldPVwibm9kZS5jaGVja2VkIVwiXHJcbiAgICAgICAgICBbKGluZGV0ZXJtaW5hdGUpXT1cIm5vZGUuaW5kZXRlcm1pbmF0ZSFcIlxyXG4gICAgICAgICAgWyhsYWJlbCldPVwibm9kZS5sYWJlbCFcIlxyXG4gICAgICAgICAgWyhub3dyYXApXT1cIm5vZGUubm93cmFwIVwiXHJcbiAgICAgICAgICAodG9nZ2xlKT1cIm9uVG9nZ2xlKG51bGwsICRldmVudClcIlxyXG4gICAgICAgID48L3gtdHJlZS1ub2RlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cIngtdHJlZS1jb250ZW50XCJcclxuICAgICAgI2Ryb3BMaXN0XHJcbiAgICAgIGNka0Ryb3BMaXN0XHJcbiAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFkcmFnKClcIlxyXG4gICAgICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgIFtoaWRkZW5dPVwiaXNFbXB0eSgpXCJcclxuICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlcygpXCJcclxuICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwicHJlZGljYXRlXCJcclxuICAgID5cclxuICAgICAgQGZvciAobm9kZSBvZiBub2RlcygpOyB0cmFjayBub2RlLmlkICsgJycgKyAkaW5kZXgpIHtcclxuICAgICAgICA8eC10cmVlLW5vZGVcclxuICAgICAgICAgIGNka0RyYWdcclxuICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwibm9kZS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwiY2RrRHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY2RrRHJhZ0VuZGVkKT1cImNka0RyYWdFbmRlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIChjZGtEcmFnTW92ZWQpPVwiY2RrRHJhZ01vdmVkKCRldmVudClcIlxyXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIm5vZGVcIlxyXG4gICAgICAgICAgKG5vZGVNb3VzZWVudGVyKT1cIm5vZGVNb3VzZWVudGVyKCRldmVudClcIlxyXG4gICAgICAgICAgW25vZGVdPVwibm9kZVwiXHJcbiAgICAgICAgICBbbm9kZUhlaWdodF09XCJub2RlSGVpZ2h0KClcIlxyXG4gICAgICAgICAgW25vZGVOb3dyYXBdPVwibm9kZU5vd3JhcCgpXCJcclxuICAgICAgICAgIFtub2RlQWxpZ25JdGVtc109XCJub2RlQWxpZ25JdGVtcygpXCJcclxuICAgICAgICAgIFsoZGlzYWJsZWQpXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgWyhpZCldPVwibm9kZS5pZFwiXHJcbiAgICAgICAgICBbKHBpZCldPVwibm9kZS5waWRcIlxyXG4gICAgICAgICAgWyhsZWFmKV09XCJub2RlLmxlYWZcIlxyXG4gICAgICAgICAgWyhoZWlnaHQpXT1cIm5vZGUuaGVpZ2h0IVwiXHJcbiAgICAgICAgICBbKGFsaWduSXRlbXMpXT1cIm5vZGUuYWxpZ25JdGVtc1wiXHJcbiAgICAgICAgICBbKGxvYWRpbmcpXT1cIm5vZGUubG9hZGluZ1wiXHJcbiAgICAgICAgICBbKGxldmVsKV09XCJub2RlLmxldmVsXCJcclxuICAgICAgICAgIFsob3BlbildPVwibm9kZS5vcGVuXCJcclxuICAgICAgICAgIFsoY2hlY2tlZCldPVwibm9kZS5jaGVja2VkXCJcclxuICAgICAgICAgIFsoaW5kZXRlcm1pbmF0ZSldPVwibm9kZS5pbmRldGVybWluYXRlXCJcclxuICAgICAgICAgIFsobGFiZWwpXT1cIm5vZGUubGFiZWxcIlxyXG4gICAgICAgICAgWyhub3dyYXApXT1cIm5vZGUubm93cmFwXCJcclxuICAgICAgICAgICh0b2dnbGUpPVwib25Ub2dnbGUobnVsbCwgJGV2ZW50KVwiXHJcbiAgICAgICAgPjwveC10cmVlLW5vZGU+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG48IS0tIOaPkOWJjeWKoOi9vWxvYWRpbmfnmoTlm77moIctLT5cclxuQGlmIChsYXp5KCkpIHtcclxuICA8eC1pY29uIFtzdHlsZS5kaXNwbGF5XT1cIidub25lJ1wiIHR5cGU9XCJmdG8tbG9hZGVyXCI+PC94LWljb24+XHJcbn1cclxuIl19