primeng 13.4.0 → 14.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 (668) hide show
  1. package/accordion/accordion.d.ts +2 -2
  2. package/api/lazyloadevent.d.ts +2 -0
  3. package/api/shared.d.ts +3 -3
  4. package/autocomplete/autocomplete.d.ts +25 -19
  5. package/avatar/avatar.d.ts +1 -1
  6. package/avatargroup/avatargroup.d.ts +1 -1
  7. package/badge/badge.d.ts +2 -2
  8. package/blockui/blockui.d.ts +1 -1
  9. package/breadcrumb/breadcrumb.d.ts +1 -1
  10. package/button/button.d.ts +2 -2
  11. package/calendar/calendar.d.ts +6 -5
  12. package/captcha/captcha.d.ts +1 -1
  13. package/card/card.d.ts +1 -1
  14. package/carousel/carousel.d.ts +1 -1
  15. package/cascadeselect/cascadeselect.d.ts +2 -2
  16. package/chart/chart.d.ts +1 -1
  17. package/checkbox/checkbox.d.ts +1 -1
  18. package/chip/chip.d.ts +1 -1
  19. package/chips/chips.d.ts +1 -1
  20. package/codehighlighter/codehighlighter.d.ts +1 -1
  21. package/colorpicker/colorpicker.d.ts +1 -1
  22. package/confirmdialog/confirmdialog.d.ts +1 -1
  23. package/confirmpopup/confirmpopup.d.ts +1 -1
  24. package/contextmenu/contextmenu.d.ts +2 -2
  25. package/dataview/dataview.d.ts +2 -2
  26. package/defer/defer.d.ts +1 -1
  27. package/dialog/dialog.d.ts +1 -1
  28. package/divider/divider.d.ts +1 -1
  29. package/dock/dock.d.ts +1 -1
  30. package/dragdrop/dragdrop.d.ts +2 -2
  31. package/dropdown/dropdown.d.ts +23 -14
  32. package/dynamicdialog/dynamicdialog-config.d.ts +1 -0
  33. package/dynamicdialog/dynamicdialog.d.ts +1 -1
  34. package/dynamicdialog/dynamicdialogcontent.d.ts +1 -1
  35. package/editor/editor.d.ts +1 -1
  36. package/esm2020/accordion/accordion.mjs +18 -20
  37. package/esm2020/api/confirmationservice.mjs +3 -3
  38. package/esm2020/api/contextmenuservice.mjs +3 -3
  39. package/esm2020/api/filterservice.mjs +3 -3
  40. package/esm2020/api/lazyloadevent.mjs +1 -1
  41. package/esm2020/api/messageservice.mjs +3 -3
  42. package/esm2020/api/overlayservice.mjs +3 -3
  43. package/esm2020/api/primengconfig.mjs +3 -3
  44. package/esm2020/api/shared.mjs +14 -14
  45. package/esm2020/api/treedragdropservice.mjs +3 -3
  46. package/esm2020/autocomplete/autocomplete.mjs +154 -130
  47. package/esm2020/avatar/avatar.mjs +9 -9
  48. package/esm2020/avatargroup/avatargroup.mjs +9 -9
  49. package/esm2020/badge/badge.mjs +14 -18
  50. package/esm2020/blockui/blockui.mjs +9 -9
  51. package/esm2020/breadcrumb/breadcrumb.mjs +11 -11
  52. package/esm2020/button/button.mjs +14 -14
  53. package/esm2020/calendar/calendar.mjs +14 -10
  54. package/esm2020/captcha/captcha.mjs +8 -8
  55. package/esm2020/card/card.mjs +9 -9
  56. package/esm2020/carousel/carousel.mjs +9 -9
  57. package/esm2020/cascadeselect/cascadeselect.mjs +14 -14
  58. package/esm2020/chart/chart.mjs +8 -8
  59. package/esm2020/checkbox/checkbox.mjs +9 -9
  60. package/esm2020/chip/chip.mjs +9 -9
  61. package/esm2020/chips/chips.mjs +9 -9
  62. package/esm2020/codehighlighter/codehighlighter.mjs +8 -8
  63. package/esm2020/colorpicker/colorpicker.mjs +12 -10
  64. package/esm2020/confirmdialog/confirmdialog.mjs +13 -13
  65. package/esm2020/confirmpopup/confirmpopup.mjs +12 -10
  66. package/esm2020/contextmenu/contextmenu.mjs +20 -15
  67. package/esm2020/dataview/dataview.mjs +15 -15
  68. package/esm2020/defer/defer.mjs +8 -8
  69. package/esm2020/dialog/dialog.mjs +11 -11
  70. package/esm2020/divider/divider.mjs +9 -9
  71. package/esm2020/dock/dock.mjs +9 -9
  72. package/esm2020/dragdrop/dragdrop.mjs +11 -11
  73. package/esm2020/dropdown/dropdown.mjs +186 -162
  74. package/esm2020/dynamicdialog/dialogservice.mjs +3 -3
  75. package/esm2020/dynamicdialog/dynamicdialog-config.mjs +1 -1
  76. package/esm2020/dynamicdialog/dynamicdialog.mjs +11 -11
  77. package/esm2020/dynamicdialog/dynamicdialogcontent.mjs +3 -3
  78. package/esm2020/editor/editor.mjs +9 -9
  79. package/esm2020/fieldset/fieldset.mjs +16 -18
  80. package/esm2020/fileupload/fileupload.mjs +13 -13
  81. package/esm2020/focustrap/focustrap.mjs +8 -8
  82. package/esm2020/fullcalendar/fullcalendar.mjs +8 -8
  83. package/esm2020/galleria/galleria.mjs +25 -25
  84. package/esm2020/gmap/gmap.mjs +8 -8
  85. package/esm2020/image/image.mjs +43 -29
  86. package/esm2020/inplace/inplace.mjs +15 -15
  87. package/esm2020/inputmask/inputmask.mjs +11 -11
  88. package/esm2020/inputnumber/inputnumber.mjs +9 -9
  89. package/esm2020/inputswitch/inputswitch.mjs +9 -9
  90. package/esm2020/inputtext/inputtext.mjs +8 -8
  91. package/esm2020/inputtextarea/inputtextarea.mjs +8 -8
  92. package/esm2020/keyfilter/keyfilter.mjs +8 -8
  93. package/esm2020/knob/knob.mjs +9 -9
  94. package/esm2020/lightbox/lightbox.mjs +9 -9
  95. package/esm2020/listbox/listbox.mjs +49 -18
  96. package/esm2020/megamenu/megamenu.mjs +22 -12
  97. package/esm2020/menu/menu.mjs +23 -17
  98. package/esm2020/menubar/menubar.mjs +22 -18
  99. package/esm2020/message/message.mjs +9 -9
  100. package/esm2020/messages/messages.mjs +14 -14
  101. package/esm2020/multiselect/multiselect.mjs +193 -128
  102. package/esm2020/orderlist/orderlist.mjs +44 -18
  103. package/esm2020/organizationchart/organizationchart.mjs +13 -13
  104. package/esm2020/overlaypanel/overlaypanel.mjs +24 -10
  105. package/esm2020/paginator/paginator.mjs +14 -14
  106. package/esm2020/panel/panel.mjs +16 -18
  107. package/esm2020/panelmenu/panelmenu.mjs +36 -32
  108. package/esm2020/password/password.mjs +16 -14
  109. package/esm2020/picklist/picklist.mjs +86 -37
  110. package/esm2020/progressbar/progressbar.mjs +9 -9
  111. package/esm2020/progressspinner/progressspinner.mjs +9 -9
  112. package/esm2020/radiobutton/radiobutton.mjs +12 -12
  113. package/esm2020/rating/rating.mjs +9 -9
  114. package/esm2020/ripple/ripple.mjs +8 -8
  115. package/esm2020/scroller/primeng-scroller.mjs +5 -0
  116. package/esm2020/scroller/public_api.mjs +2 -0
  117. package/esm2020/scroller/scroller.mjs +738 -0
  118. package/esm2020/scrollpanel/scrollpanel.mjs +9 -9
  119. package/esm2020/scrolltop/scrolltop.mjs +9 -9
  120. package/esm2020/selectbutton/selectbutton.mjs +9 -9
  121. package/esm2020/sidebar/sidebar.mjs +10 -10
  122. package/esm2020/skeleton/skeleton.mjs +9 -9
  123. package/esm2020/slidemenu/slidemenu.mjs +22 -16
  124. package/esm2020/slider/slider.mjs +9 -9
  125. package/esm2020/speeddial/speeddial.mjs +11 -11
  126. package/esm2020/spinner/spinner.mjs +9 -9
  127. package/esm2020/splitbutton/splitbutton.mjs +12 -12
  128. package/esm2020/splitter/splitter.mjs +9 -9
  129. package/esm2020/steps/steps.mjs +9 -9
  130. package/esm2020/styleclass/styleclass.mjs +8 -8
  131. package/esm2020/table/table.mjs +280 -260
  132. package/esm2020/tabmenu/tabmenu.mjs +51 -13
  133. package/esm2020/tabview/tabview.mjs +15 -15
  134. package/esm2020/tag/tag.mjs +9 -9
  135. package/esm2020/terminal/terminal.mjs +9 -9
  136. package/esm2020/terminal/terminalservice.mjs +3 -3
  137. package/esm2020/tieredmenu/tieredmenu.mjs +29 -18
  138. package/esm2020/timeline/timeline.mjs +9 -9
  139. package/esm2020/toast/toast.mjs +14 -14
  140. package/esm2020/togglebutton/togglebutton.mjs +11 -11
  141. package/esm2020/toolbar/toolbar.mjs +9 -9
  142. package/esm2020/tooltip/tooltip.mjs +23 -12
  143. package/esm2020/tree/tree.mjs +144 -83
  144. package/esm2020/treeselect/treeselect.mjs +14 -14
  145. package/esm2020/treetable/treetable.mjs +180 -155
  146. package/esm2020/tristatecheckbox/tristatecheckbox.mjs +9 -9
  147. package/esm2020/virtualscroller/virtualscroller.mjs +58 -99
  148. package/fesm2015/primeng-accordion.mjs +17 -19
  149. package/fesm2015/primeng-accordion.mjs.map +1 -1
  150. package/fesm2015/primeng-api.mjs +34 -34
  151. package/fesm2015/primeng-api.mjs.map +1 -1
  152. package/fesm2015/primeng-autocomplete.mjs +155 -130
  153. package/fesm2015/primeng-autocomplete.mjs.map +1 -1
  154. package/fesm2015/primeng-avatar.mjs +8 -8
  155. package/fesm2015/primeng-avatar.mjs.map +1 -1
  156. package/fesm2015/primeng-avatargroup.mjs +8 -8
  157. package/fesm2015/primeng-avatargroup.mjs.map +1 -1
  158. package/fesm2015/primeng-badge.mjs +13 -17
  159. package/fesm2015/primeng-badge.mjs.map +1 -1
  160. package/fesm2015/primeng-blockui.mjs +8 -8
  161. package/fesm2015/primeng-blockui.mjs.map +1 -1
  162. package/fesm2015/primeng-breadcrumb.mjs +10 -10
  163. package/fesm2015/primeng-breadcrumb.mjs.map +1 -1
  164. package/fesm2015/primeng-button.mjs +13 -13
  165. package/fesm2015/primeng-button.mjs.map +1 -1
  166. package/fesm2015/primeng-calendar.mjs +13 -9
  167. package/fesm2015/primeng-calendar.mjs.map +1 -1
  168. package/fesm2015/primeng-captcha.mjs +7 -7
  169. package/fesm2015/primeng-captcha.mjs.map +1 -1
  170. package/fesm2015/primeng-card.mjs +8 -8
  171. package/fesm2015/primeng-card.mjs.map +1 -1
  172. package/fesm2015/primeng-carousel.mjs +8 -8
  173. package/fesm2015/primeng-carousel.mjs.map +1 -1
  174. package/fesm2015/primeng-cascadeselect.mjs +13 -13
  175. package/fesm2015/primeng-cascadeselect.mjs.map +1 -1
  176. package/fesm2015/primeng-chart.mjs +7 -7
  177. package/fesm2015/primeng-chart.mjs.map +1 -1
  178. package/fesm2015/primeng-checkbox.mjs +8 -8
  179. package/fesm2015/primeng-checkbox.mjs.map +1 -1
  180. package/fesm2015/primeng-chip.mjs +8 -8
  181. package/fesm2015/primeng-chip.mjs.map +1 -1
  182. package/fesm2015/primeng-chips.mjs +8 -8
  183. package/fesm2015/primeng-chips.mjs.map +1 -1
  184. package/fesm2015/primeng-codehighlighter.mjs +7 -7
  185. package/fesm2015/primeng-codehighlighter.mjs.map +1 -1
  186. package/fesm2015/primeng-colorpicker.mjs +11 -9
  187. package/fesm2015/primeng-colorpicker.mjs.map +1 -1
  188. package/fesm2015/primeng-confirmdialog.mjs +12 -12
  189. package/fesm2015/primeng-confirmdialog.mjs.map +1 -1
  190. package/fesm2015/primeng-confirmpopup.mjs +11 -9
  191. package/fesm2015/primeng-confirmpopup.mjs.map +1 -1
  192. package/fesm2015/primeng-contextmenu.mjs +19 -14
  193. package/fesm2015/primeng-contextmenu.mjs.map +1 -1
  194. package/fesm2015/primeng-dataview.mjs +14 -14
  195. package/fesm2015/primeng-dataview.mjs.map +1 -1
  196. package/fesm2015/primeng-defer.mjs +7 -7
  197. package/fesm2015/primeng-defer.mjs.map +1 -1
  198. package/fesm2015/primeng-dialog.mjs +10 -10
  199. package/fesm2015/primeng-dialog.mjs.map +1 -1
  200. package/fesm2015/primeng-divider.mjs +8 -8
  201. package/fesm2015/primeng-divider.mjs.map +1 -1
  202. package/fesm2015/primeng-dock.mjs +8 -8
  203. package/fesm2015/primeng-dock.mjs.map +1 -1
  204. package/fesm2015/primeng-dragdrop.mjs +10 -10
  205. package/fesm2015/primeng-dragdrop.mjs.map +1 -1
  206. package/fesm2015/primeng-dropdown.mjs +185 -161
  207. package/fesm2015/primeng-dropdown.mjs.map +1 -1
  208. package/fesm2015/primeng-dynamicdialog.mjs +16 -16
  209. package/fesm2015/primeng-dynamicdialog.mjs.map +1 -1
  210. package/fesm2015/primeng-editor.mjs +8 -8
  211. package/fesm2015/primeng-editor.mjs.map +1 -1
  212. package/fesm2015/primeng-fieldset.mjs +15 -17
  213. package/fesm2015/primeng-fieldset.mjs.map +1 -1
  214. package/fesm2015/primeng-fileupload.mjs +12 -12
  215. package/fesm2015/primeng-fileupload.mjs.map +1 -1
  216. package/fesm2015/primeng-focustrap.mjs +7 -7
  217. package/fesm2015/primeng-focustrap.mjs.map +1 -1
  218. package/fesm2015/primeng-fullcalendar.mjs +7 -7
  219. package/fesm2015/primeng-fullcalendar.mjs.map +1 -1
  220. package/fesm2015/primeng-galleria.mjs +24 -24
  221. package/fesm2015/primeng-galleria.mjs.map +1 -1
  222. package/fesm2015/primeng-gmap.mjs +7 -7
  223. package/fesm2015/primeng-gmap.mjs.map +1 -1
  224. package/fesm2015/primeng-image.mjs +42 -28
  225. package/fesm2015/primeng-image.mjs.map +1 -1
  226. package/fesm2015/primeng-inplace.mjs +14 -14
  227. package/fesm2015/primeng-inplace.mjs.map +1 -1
  228. package/fesm2015/primeng-inputmask.mjs +10 -10
  229. package/fesm2015/primeng-inputmask.mjs.map +1 -1
  230. package/fesm2015/primeng-inputnumber.mjs +8 -8
  231. package/fesm2015/primeng-inputnumber.mjs.map +1 -1
  232. package/fesm2015/primeng-inputswitch.mjs +8 -8
  233. package/fesm2015/primeng-inputswitch.mjs.map +1 -1
  234. package/fesm2015/primeng-inputtext.mjs +7 -7
  235. package/fesm2015/primeng-inputtext.mjs.map +1 -1
  236. package/fesm2015/primeng-inputtextarea.mjs +7 -7
  237. package/fesm2015/primeng-inputtextarea.mjs.map +1 -1
  238. package/fesm2015/primeng-keyfilter.mjs +7 -7
  239. package/fesm2015/primeng-keyfilter.mjs.map +1 -1
  240. package/fesm2015/primeng-knob.mjs +8 -8
  241. package/fesm2015/primeng-knob.mjs.map +1 -1
  242. package/fesm2015/primeng-lightbox.mjs +8 -8
  243. package/fesm2015/primeng-lightbox.mjs.map +1 -1
  244. package/fesm2015/primeng-listbox.mjs +48 -17
  245. package/fesm2015/primeng-listbox.mjs.map +1 -1
  246. package/fesm2015/primeng-megamenu.mjs +21 -11
  247. package/fesm2015/primeng-megamenu.mjs.map +1 -1
  248. package/fesm2015/primeng-menu.mjs +22 -16
  249. package/fesm2015/primeng-menu.mjs.map +1 -1
  250. package/fesm2015/primeng-menubar.mjs +21 -17
  251. package/fesm2015/primeng-menubar.mjs.map +1 -1
  252. package/fesm2015/primeng-message.mjs +8 -8
  253. package/fesm2015/primeng-message.mjs.map +1 -1
  254. package/fesm2015/primeng-messages.mjs +13 -13
  255. package/fesm2015/primeng-messages.mjs.map +1 -1
  256. package/fesm2015/primeng-multiselect.mjs +193 -127
  257. package/fesm2015/primeng-multiselect.mjs.map +1 -1
  258. package/fesm2015/primeng-orderlist.mjs +43 -17
  259. package/fesm2015/primeng-orderlist.mjs.map +1 -1
  260. package/fesm2015/primeng-organizationchart.mjs +12 -12
  261. package/fesm2015/primeng-organizationchart.mjs.map +1 -1
  262. package/fesm2015/primeng-overlaypanel.mjs +23 -9
  263. package/fesm2015/primeng-overlaypanel.mjs.map +1 -1
  264. package/fesm2015/primeng-paginator.mjs +13 -13
  265. package/fesm2015/primeng-paginator.mjs.map +1 -1
  266. package/fesm2015/primeng-panel.mjs +15 -17
  267. package/fesm2015/primeng-panel.mjs.map +1 -1
  268. package/fesm2015/primeng-panelmenu.mjs +35 -31
  269. package/fesm2015/primeng-panelmenu.mjs.map +1 -1
  270. package/fesm2015/primeng-password.mjs +15 -13
  271. package/fesm2015/primeng-password.mjs.map +1 -1
  272. package/fesm2015/primeng-picklist.mjs +85 -36
  273. package/fesm2015/primeng-picklist.mjs.map +1 -1
  274. package/fesm2015/primeng-progressbar.mjs +8 -8
  275. package/fesm2015/primeng-progressbar.mjs.map +1 -1
  276. package/fesm2015/primeng-progressspinner.mjs +8 -8
  277. package/fesm2015/primeng-progressspinner.mjs.map +1 -1
  278. package/fesm2015/primeng-radiobutton.mjs +11 -11
  279. package/fesm2015/primeng-radiobutton.mjs.map +1 -1
  280. package/fesm2015/primeng-rating.mjs +8 -8
  281. package/fesm2015/primeng-rating.mjs.map +1 -1
  282. package/fesm2015/primeng-ripple.mjs +7 -7
  283. package/fesm2015/primeng-ripple.mjs.map +1 -1
  284. package/fesm2015/primeng-scroller.mjs +743 -0
  285. package/fesm2015/primeng-scroller.mjs.map +1 -0
  286. package/fesm2015/primeng-scrollpanel.mjs +8 -8
  287. package/fesm2015/primeng-scrollpanel.mjs.map +1 -1
  288. package/fesm2015/primeng-scrolltop.mjs +8 -8
  289. package/fesm2015/primeng-scrolltop.mjs.map +1 -1
  290. package/fesm2015/primeng-selectbutton.mjs +8 -8
  291. package/fesm2015/primeng-selectbutton.mjs.map +1 -1
  292. package/fesm2015/primeng-sidebar.mjs +9 -9
  293. package/fesm2015/primeng-sidebar.mjs.map +1 -1
  294. package/fesm2015/primeng-skeleton.mjs +8 -8
  295. package/fesm2015/primeng-skeleton.mjs.map +1 -1
  296. package/fesm2015/primeng-slidemenu.mjs +21 -15
  297. package/fesm2015/primeng-slidemenu.mjs.map +1 -1
  298. package/fesm2015/primeng-slider.mjs +8 -8
  299. package/fesm2015/primeng-slider.mjs.map +1 -1
  300. package/fesm2015/primeng-speeddial.mjs +10 -10
  301. package/fesm2015/primeng-speeddial.mjs.map +1 -1
  302. package/fesm2015/primeng-spinner.mjs +8 -8
  303. package/fesm2015/primeng-spinner.mjs.map +1 -1
  304. package/fesm2015/primeng-splitbutton.mjs +11 -11
  305. package/fesm2015/primeng-splitbutton.mjs.map +1 -1
  306. package/fesm2015/primeng-splitter.mjs +8 -8
  307. package/fesm2015/primeng-splitter.mjs.map +1 -1
  308. package/fesm2015/primeng-steps.mjs +8 -8
  309. package/fesm2015/primeng-steps.mjs.map +1 -1
  310. package/fesm2015/primeng-styleclass.mjs +7 -7
  311. package/fesm2015/primeng-styleclass.mjs.map +1 -1
  312. package/fesm2015/primeng-table.mjs +275 -259
  313. package/fesm2015/primeng-table.mjs.map +1 -1
  314. package/fesm2015/primeng-tabmenu.mjs +50 -12
  315. package/fesm2015/primeng-tabmenu.mjs.map +1 -1
  316. package/fesm2015/primeng-tabview.mjs +14 -14
  317. package/fesm2015/primeng-tabview.mjs.map +1 -1
  318. package/fesm2015/primeng-tag.mjs +8 -8
  319. package/fesm2015/primeng-tag.mjs.map +1 -1
  320. package/fesm2015/primeng-terminal.mjs +11 -11
  321. package/fesm2015/primeng-terminal.mjs.map +1 -1
  322. package/fesm2015/primeng-tieredmenu.mjs +28 -17
  323. package/fesm2015/primeng-tieredmenu.mjs.map +1 -1
  324. package/fesm2015/primeng-timeline.mjs +8 -8
  325. package/fesm2015/primeng-timeline.mjs.map +1 -1
  326. package/fesm2015/primeng-toast.mjs +13 -13
  327. package/fesm2015/primeng-toast.mjs.map +1 -1
  328. package/fesm2015/primeng-togglebutton.mjs +10 -10
  329. package/fesm2015/primeng-togglebutton.mjs.map +1 -1
  330. package/fesm2015/primeng-toolbar.mjs +8 -8
  331. package/fesm2015/primeng-toolbar.mjs.map +1 -1
  332. package/fesm2015/primeng-tooltip.mjs +22 -11
  333. package/fesm2015/primeng-tooltip.mjs.map +1 -1
  334. package/fesm2015/primeng-tree.mjs +143 -82
  335. package/fesm2015/primeng-tree.mjs.map +1 -1
  336. package/fesm2015/primeng-treeselect.mjs +13 -13
  337. package/fesm2015/primeng-treeselect.mjs.map +1 -1
  338. package/fesm2015/primeng-treetable.mjs +175 -154
  339. package/fesm2015/primeng-treetable.mjs.map +1 -1
  340. package/fesm2015/primeng-tristatecheckbox.mjs +8 -8
  341. package/fesm2015/primeng-tristatecheckbox.mjs.map +1 -1
  342. package/fesm2015/primeng-virtualscroller.mjs +53 -97
  343. package/fesm2015/primeng-virtualscroller.mjs.map +1 -1
  344. package/fesm2020/primeng-accordion.mjs +17 -19
  345. package/fesm2020/primeng-accordion.mjs.map +1 -1
  346. package/fesm2020/primeng-api.mjs +34 -34
  347. package/fesm2020/primeng-api.mjs.map +1 -1
  348. package/fesm2020/primeng-autocomplete.mjs +154 -130
  349. package/fesm2020/primeng-autocomplete.mjs.map +1 -1
  350. package/fesm2020/primeng-avatar.mjs +8 -8
  351. package/fesm2020/primeng-avatar.mjs.map +1 -1
  352. package/fesm2020/primeng-avatargroup.mjs +8 -8
  353. package/fesm2020/primeng-avatargroup.mjs.map +1 -1
  354. package/fesm2020/primeng-badge.mjs +13 -17
  355. package/fesm2020/primeng-badge.mjs.map +1 -1
  356. package/fesm2020/primeng-blockui.mjs +8 -8
  357. package/fesm2020/primeng-blockui.mjs.map +1 -1
  358. package/fesm2020/primeng-breadcrumb.mjs +10 -10
  359. package/fesm2020/primeng-breadcrumb.mjs.map +1 -1
  360. package/fesm2020/primeng-button.mjs +13 -13
  361. package/fesm2020/primeng-button.mjs.map +1 -1
  362. package/fesm2020/primeng-calendar.mjs +13 -9
  363. package/fesm2020/primeng-calendar.mjs.map +1 -1
  364. package/fesm2020/primeng-captcha.mjs +7 -7
  365. package/fesm2020/primeng-captcha.mjs.map +1 -1
  366. package/fesm2020/primeng-card.mjs +8 -8
  367. package/fesm2020/primeng-card.mjs.map +1 -1
  368. package/fesm2020/primeng-carousel.mjs +8 -8
  369. package/fesm2020/primeng-carousel.mjs.map +1 -1
  370. package/fesm2020/primeng-cascadeselect.mjs +13 -13
  371. package/fesm2020/primeng-cascadeselect.mjs.map +1 -1
  372. package/fesm2020/primeng-chart.mjs +7 -7
  373. package/fesm2020/primeng-chart.mjs.map +1 -1
  374. package/fesm2020/primeng-checkbox.mjs +8 -8
  375. package/fesm2020/primeng-checkbox.mjs.map +1 -1
  376. package/fesm2020/primeng-chip.mjs +8 -8
  377. package/fesm2020/primeng-chip.mjs.map +1 -1
  378. package/fesm2020/primeng-chips.mjs +8 -8
  379. package/fesm2020/primeng-chips.mjs.map +1 -1
  380. package/fesm2020/primeng-codehighlighter.mjs +7 -7
  381. package/fesm2020/primeng-codehighlighter.mjs.map +1 -1
  382. package/fesm2020/primeng-colorpicker.mjs +11 -9
  383. package/fesm2020/primeng-colorpicker.mjs.map +1 -1
  384. package/fesm2020/primeng-confirmdialog.mjs +12 -12
  385. package/fesm2020/primeng-confirmdialog.mjs.map +1 -1
  386. package/fesm2020/primeng-confirmpopup.mjs +11 -9
  387. package/fesm2020/primeng-confirmpopup.mjs.map +1 -1
  388. package/fesm2020/primeng-contextmenu.mjs +19 -14
  389. package/fesm2020/primeng-contextmenu.mjs.map +1 -1
  390. package/fesm2020/primeng-dataview.mjs +14 -14
  391. package/fesm2020/primeng-dataview.mjs.map +1 -1
  392. package/fesm2020/primeng-defer.mjs +7 -7
  393. package/fesm2020/primeng-defer.mjs.map +1 -1
  394. package/fesm2020/primeng-dialog.mjs +10 -10
  395. package/fesm2020/primeng-dialog.mjs.map +1 -1
  396. package/fesm2020/primeng-divider.mjs +8 -8
  397. package/fesm2020/primeng-divider.mjs.map +1 -1
  398. package/fesm2020/primeng-dock.mjs +8 -8
  399. package/fesm2020/primeng-dock.mjs.map +1 -1
  400. package/fesm2020/primeng-dragdrop.mjs +10 -10
  401. package/fesm2020/primeng-dragdrop.mjs.map +1 -1
  402. package/fesm2020/primeng-dropdown.mjs +185 -161
  403. package/fesm2020/primeng-dropdown.mjs.map +1 -1
  404. package/fesm2020/primeng-dynamicdialog.mjs +16 -16
  405. package/fesm2020/primeng-dynamicdialog.mjs.map +1 -1
  406. package/fesm2020/primeng-editor.mjs +8 -8
  407. package/fesm2020/primeng-editor.mjs.map +1 -1
  408. package/fesm2020/primeng-fieldset.mjs +15 -17
  409. package/fesm2020/primeng-fieldset.mjs.map +1 -1
  410. package/fesm2020/primeng-fileupload.mjs +12 -12
  411. package/fesm2020/primeng-fileupload.mjs.map +1 -1
  412. package/fesm2020/primeng-focustrap.mjs +7 -7
  413. package/fesm2020/primeng-focustrap.mjs.map +1 -1
  414. package/fesm2020/primeng-fullcalendar.mjs +7 -7
  415. package/fesm2020/primeng-fullcalendar.mjs.map +1 -1
  416. package/fesm2020/primeng-galleria.mjs +24 -24
  417. package/fesm2020/primeng-galleria.mjs.map +1 -1
  418. package/fesm2020/primeng-gmap.mjs +7 -7
  419. package/fesm2020/primeng-gmap.mjs.map +1 -1
  420. package/fesm2020/primeng-image.mjs +42 -28
  421. package/fesm2020/primeng-image.mjs.map +1 -1
  422. package/fesm2020/primeng-inplace.mjs +14 -14
  423. package/fesm2020/primeng-inplace.mjs.map +1 -1
  424. package/fesm2020/primeng-inputmask.mjs +10 -10
  425. package/fesm2020/primeng-inputmask.mjs.map +1 -1
  426. package/fesm2020/primeng-inputnumber.mjs +8 -8
  427. package/fesm2020/primeng-inputnumber.mjs.map +1 -1
  428. package/fesm2020/primeng-inputswitch.mjs +8 -8
  429. package/fesm2020/primeng-inputswitch.mjs.map +1 -1
  430. package/fesm2020/primeng-inputtext.mjs +7 -7
  431. package/fesm2020/primeng-inputtext.mjs.map +1 -1
  432. package/fesm2020/primeng-inputtextarea.mjs +7 -7
  433. package/fesm2020/primeng-inputtextarea.mjs.map +1 -1
  434. package/fesm2020/primeng-keyfilter.mjs +7 -7
  435. package/fesm2020/primeng-keyfilter.mjs.map +1 -1
  436. package/fesm2020/primeng-knob.mjs +8 -8
  437. package/fesm2020/primeng-knob.mjs.map +1 -1
  438. package/fesm2020/primeng-lightbox.mjs +8 -8
  439. package/fesm2020/primeng-lightbox.mjs.map +1 -1
  440. package/fesm2020/primeng-listbox.mjs +48 -17
  441. package/fesm2020/primeng-listbox.mjs.map +1 -1
  442. package/fesm2020/primeng-megamenu.mjs +21 -11
  443. package/fesm2020/primeng-megamenu.mjs.map +1 -1
  444. package/fesm2020/primeng-menu.mjs +22 -16
  445. package/fesm2020/primeng-menu.mjs.map +1 -1
  446. package/fesm2020/primeng-menubar.mjs +21 -17
  447. package/fesm2020/primeng-menubar.mjs.map +1 -1
  448. package/fesm2020/primeng-message.mjs +8 -8
  449. package/fesm2020/primeng-message.mjs.map +1 -1
  450. package/fesm2020/primeng-messages.mjs +13 -13
  451. package/fesm2020/primeng-messages.mjs.map +1 -1
  452. package/fesm2020/primeng-multiselect.mjs +192 -127
  453. package/fesm2020/primeng-multiselect.mjs.map +1 -1
  454. package/fesm2020/primeng-orderlist.mjs +43 -17
  455. package/fesm2020/primeng-orderlist.mjs.map +1 -1
  456. package/fesm2020/primeng-organizationchart.mjs +12 -12
  457. package/fesm2020/primeng-organizationchart.mjs.map +1 -1
  458. package/fesm2020/primeng-overlaypanel.mjs +23 -9
  459. package/fesm2020/primeng-overlaypanel.mjs.map +1 -1
  460. package/fesm2020/primeng-paginator.mjs +13 -13
  461. package/fesm2020/primeng-paginator.mjs.map +1 -1
  462. package/fesm2020/primeng-panel.mjs +15 -17
  463. package/fesm2020/primeng-panel.mjs.map +1 -1
  464. package/fesm2020/primeng-panelmenu.mjs +35 -31
  465. package/fesm2020/primeng-panelmenu.mjs.map +1 -1
  466. package/fesm2020/primeng-password.mjs +15 -13
  467. package/fesm2020/primeng-password.mjs.map +1 -1
  468. package/fesm2020/primeng-picklist.mjs +85 -36
  469. package/fesm2020/primeng-picklist.mjs.map +1 -1
  470. package/fesm2020/primeng-progressbar.mjs +8 -8
  471. package/fesm2020/primeng-progressbar.mjs.map +1 -1
  472. package/fesm2020/primeng-progressspinner.mjs +8 -8
  473. package/fesm2020/primeng-progressspinner.mjs.map +1 -1
  474. package/fesm2020/primeng-radiobutton.mjs +11 -11
  475. package/fesm2020/primeng-radiobutton.mjs.map +1 -1
  476. package/fesm2020/primeng-rating.mjs +8 -8
  477. package/fesm2020/primeng-rating.mjs.map +1 -1
  478. package/fesm2020/primeng-ripple.mjs +7 -7
  479. package/fesm2020/primeng-ripple.mjs.map +1 -1
  480. package/fesm2020/primeng-scroller.mjs +745 -0
  481. package/fesm2020/primeng-scroller.mjs.map +1 -0
  482. package/fesm2020/primeng-scrollpanel.mjs +8 -8
  483. package/fesm2020/primeng-scrollpanel.mjs.map +1 -1
  484. package/fesm2020/primeng-scrolltop.mjs +8 -8
  485. package/fesm2020/primeng-scrolltop.mjs.map +1 -1
  486. package/fesm2020/primeng-selectbutton.mjs +8 -8
  487. package/fesm2020/primeng-selectbutton.mjs.map +1 -1
  488. package/fesm2020/primeng-sidebar.mjs +9 -9
  489. package/fesm2020/primeng-sidebar.mjs.map +1 -1
  490. package/fesm2020/primeng-skeleton.mjs +8 -8
  491. package/fesm2020/primeng-skeleton.mjs.map +1 -1
  492. package/fesm2020/primeng-slidemenu.mjs +21 -15
  493. package/fesm2020/primeng-slidemenu.mjs.map +1 -1
  494. package/fesm2020/primeng-slider.mjs +8 -8
  495. package/fesm2020/primeng-slider.mjs.map +1 -1
  496. package/fesm2020/primeng-speeddial.mjs +10 -10
  497. package/fesm2020/primeng-speeddial.mjs.map +1 -1
  498. package/fesm2020/primeng-spinner.mjs +8 -8
  499. package/fesm2020/primeng-spinner.mjs.map +1 -1
  500. package/fesm2020/primeng-splitbutton.mjs +11 -11
  501. package/fesm2020/primeng-splitbutton.mjs.map +1 -1
  502. package/fesm2020/primeng-splitter.mjs +8 -8
  503. package/fesm2020/primeng-splitter.mjs.map +1 -1
  504. package/fesm2020/primeng-steps.mjs +8 -8
  505. package/fesm2020/primeng-steps.mjs.map +1 -1
  506. package/fesm2020/primeng-styleclass.mjs +7 -7
  507. package/fesm2020/primeng-styleclass.mjs.map +1 -1
  508. package/fesm2020/primeng-table.mjs +279 -259
  509. package/fesm2020/primeng-table.mjs.map +1 -1
  510. package/fesm2020/primeng-tabmenu.mjs +50 -12
  511. package/fesm2020/primeng-tabmenu.mjs.map +1 -1
  512. package/fesm2020/primeng-tabview.mjs +14 -14
  513. package/fesm2020/primeng-tabview.mjs.map +1 -1
  514. package/fesm2020/primeng-tag.mjs +8 -8
  515. package/fesm2020/primeng-tag.mjs.map +1 -1
  516. package/fesm2020/primeng-terminal.mjs +11 -11
  517. package/fesm2020/primeng-terminal.mjs.map +1 -1
  518. package/fesm2020/primeng-tieredmenu.mjs +28 -17
  519. package/fesm2020/primeng-tieredmenu.mjs.map +1 -1
  520. package/fesm2020/primeng-timeline.mjs +8 -8
  521. package/fesm2020/primeng-timeline.mjs.map +1 -1
  522. package/fesm2020/primeng-toast.mjs +13 -13
  523. package/fesm2020/primeng-toast.mjs.map +1 -1
  524. package/fesm2020/primeng-togglebutton.mjs +10 -10
  525. package/fesm2020/primeng-togglebutton.mjs.map +1 -1
  526. package/fesm2020/primeng-toolbar.mjs +8 -8
  527. package/fesm2020/primeng-toolbar.mjs.map +1 -1
  528. package/fesm2020/primeng-tooltip.mjs +22 -11
  529. package/fesm2020/primeng-tooltip.mjs.map +1 -1
  530. package/fesm2020/primeng-tree.mjs +143 -82
  531. package/fesm2020/primeng-tree.mjs.map +1 -1
  532. package/fesm2020/primeng-treeselect.mjs +13 -13
  533. package/fesm2020/primeng-treeselect.mjs.map +1 -1
  534. package/fesm2020/primeng-treetable.mjs +179 -154
  535. package/fesm2020/primeng-treetable.mjs.map +1 -1
  536. package/fesm2020/primeng-tristatecheckbox.mjs +8 -8
  537. package/fesm2020/primeng-tristatecheckbox.mjs.map +1 -1
  538. package/fesm2020/primeng-virtualscroller.mjs +56 -97
  539. package/fesm2020/primeng-virtualscroller.mjs.map +1 -1
  540. package/fieldset/fieldset.d.ts +1 -1
  541. package/fileupload/fileupload.d.ts +1 -1
  542. package/focustrap/focustrap.d.ts +1 -1
  543. package/fullcalendar/fullcalendar.d.ts +1 -1
  544. package/galleria/galleria.d.ts +5 -5
  545. package/gmap/gmap.d.ts +1 -1
  546. package/image/image.d.ts +6 -2
  547. package/inplace/inplace.d.ts +3 -3
  548. package/inputmask/inputmask.d.ts +1 -1
  549. package/inputnumber/inputnumber.d.ts +1 -1
  550. package/inputswitch/inputswitch.d.ts +1 -1
  551. package/inputtext/inputtext.d.ts +1 -1
  552. package/inputtextarea/inputtextarea.d.ts +1 -1
  553. package/keyfilter/keyfilter.d.ts +1 -1
  554. package/knob/knob.d.ts +1 -1
  555. package/lightbox/lightbox.d.ts +1 -1
  556. package/listbox/listbox.d.ts +10 -1
  557. package/megamenu/megamenu.d.ts +1 -1
  558. package/menu/menu.d.ts +2 -2
  559. package/menubar/menubar.d.ts +4 -3
  560. package/message/message.d.ts +1 -1
  561. package/messages/messages.d.ts +1 -1
  562. package/multiselect/multiselect.d.ts +25 -8
  563. package/orderlist/orderlist.d.ts +9 -1
  564. package/organizationchart/organizationchart.d.ts +2 -2
  565. package/overlaypanel/overlaypanel.d.ts +2 -1
  566. package/package.json +12 -4
  567. package/paginator/paginator.d.ts +1 -1
  568. package/panel/panel.d.ts +1 -1
  569. package/panelmenu/panelmenu.d.ts +2 -2
  570. package/password/password.d.ts +2 -2
  571. package/picklist/picklist.d.ts +14 -2
  572. package/progressbar/progressbar.d.ts +1 -1
  573. package/progressspinner/progressspinner.d.ts +1 -1
  574. package/radiobutton/radiobutton.d.ts +1 -1
  575. package/rating/rating.d.ts +1 -1
  576. package/resources/components/accordion/accordion.css +8 -0
  577. package/resources/components/fieldset/fieldset.css +8 -0
  578. package/resources/components/image/image.css +5 -0
  579. package/resources/components/inputtext/inputtext.css +16 -1
  580. package/resources/components/megamenu/megamenu.css +5 -0
  581. package/resources/components/menu/menu.css +5 -0
  582. package/resources/components/messages/messages.css +4 -0
  583. package/resources/components/orderlist/orderlist.css +1 -0
  584. package/resources/components/panel/panel.css +8 -0
  585. package/resources/components/panelmenu/panelmenu.css +10 -0
  586. package/resources/components/scroller/scroller.css +51 -0
  587. package/resources/components/table/table.css +12 -5
  588. package/resources/components/tree/tree.css +6 -1
  589. package/resources/components/treetable/treetable.css +11 -1
  590. package/resources/primeng.css +15 -1
  591. package/resources/primeng.min.css +1 -1
  592. package/resources/themes/arya-blue/theme.css +101 -14
  593. package/resources/themes/arya-green/theme.css +101 -14
  594. package/resources/themes/arya-orange/theme.css +101 -14
  595. package/resources/themes/arya-purple/theme.css +101 -14
  596. package/resources/themes/bootstrap4-dark-blue/theme.css +101 -14
  597. package/resources/themes/bootstrap4-dark-purple/theme.css +101 -14
  598. package/resources/themes/bootstrap4-light-blue/theme.css +100 -13
  599. package/resources/themes/bootstrap4-light-purple/theme.css +100 -13
  600. package/resources/themes/fluent-light/theme.css +101 -14
  601. package/resources/themes/lara-dark-blue/theme.css +101 -14
  602. package/resources/themes/lara-dark-indigo/theme.css +101 -14
  603. package/resources/themes/lara-dark-purple/theme.css +101 -14
  604. package/resources/themes/lara-dark-teal/theme.css +101 -14
  605. package/resources/themes/lara-light-blue/theme.css +101 -14
  606. package/resources/themes/lara-light-indigo/theme.css +101 -14
  607. package/resources/themes/lara-light-purple/theme.css +101 -14
  608. package/resources/themes/lara-light-teal/theme.css +101 -14
  609. package/resources/themes/luna-amber/theme.css +101 -14
  610. package/resources/themes/luna-blue/theme.css +101 -14
  611. package/resources/themes/luna-green/theme.css +101 -14
  612. package/resources/themes/luna-pink/theme.css +101 -14
  613. package/resources/themes/md-dark-deeppurple/theme.css +101 -14
  614. package/resources/themes/md-dark-indigo/theme.css +101 -14
  615. package/resources/themes/md-light-deeppurple/theme.css +101 -14
  616. package/resources/themes/md-light-indigo/theme.css +101 -14
  617. package/resources/themes/mdc-dark-deeppurple/theme.css +101 -14
  618. package/resources/themes/mdc-dark-indigo/theme.css +101 -14
  619. package/resources/themes/mdc-light-deeppurple/theme.css +101 -14
  620. package/resources/themes/mdc-light-indigo/theme.css +101 -14
  621. package/resources/themes/nova/theme.css +102 -15
  622. package/resources/themes/nova-accent/theme.css +102 -15
  623. package/resources/themes/nova-alt/theme.css +102 -15
  624. package/resources/themes/rhea/theme.css +102 -15
  625. package/resources/themes/saga-blue/theme.css +101 -14
  626. package/resources/themes/saga-green/theme.css +101 -14
  627. package/resources/themes/saga-orange/theme.css +101 -14
  628. package/resources/themes/saga-purple/theme.css +101 -14
  629. package/resources/themes/tailwind-light/theme.css +101 -14
  630. package/resources/themes/vela-blue/theme.css +101 -14
  631. package/resources/themes/vela-green/theme.css +101 -14
  632. package/resources/themes/vela-orange/theme.css +101 -14
  633. package/resources/themes/vela-purple/theme.css +101 -14
  634. package/ripple/ripple.d.ts +1 -1
  635. package/scroller/package.json +10 -0
  636. package/scroller/primeng-scroller.d.ts +5 -0
  637. package/scroller/public_api.d.ts +1 -0
  638. package/scroller/scroller.d.ts +223 -0
  639. package/scrollpanel/scrollpanel.d.ts +1 -1
  640. package/scrolltop/scrolltop.d.ts +1 -1
  641. package/selectbutton/selectbutton.d.ts +1 -1
  642. package/sidebar/sidebar.d.ts +1 -1
  643. package/skeleton/skeleton.d.ts +1 -1
  644. package/slidemenu/slidemenu.d.ts +2 -2
  645. package/slider/slider.d.ts +1 -1
  646. package/speeddial/speeddial.d.ts +1 -1
  647. package/spinner/spinner.d.ts +1 -1
  648. package/splitbutton/splitbutton.d.ts +1 -1
  649. package/splitter/splitter.d.ts +1 -1
  650. package/steps/steps.d.ts +1 -1
  651. package/styleclass/styleclass.d.ts +1 -1
  652. package/table/table.d.ts +50 -45
  653. package/tabmenu/tabmenu.d.ts +9 -4
  654. package/tabview/tabview.d.ts +2 -2
  655. package/tag/tag.d.ts +1 -1
  656. package/terminal/terminal.d.ts +1 -1
  657. package/tieredmenu/tieredmenu.d.ts +3 -3
  658. package/timeline/timeline.d.ts +1 -1
  659. package/toast/toast.d.ts +2 -2
  660. package/togglebutton/togglebutton.d.ts +1 -1
  661. package/toolbar/toolbar.d.ts +1 -1
  662. package/tooltip/tooltip.d.ts +3 -1
  663. package/tree/tree.d.ts +29 -17
  664. package/treeselect/treeselect.d.ts +1 -1
  665. package/treetable/treetable.d.ts +33 -25
  666. package/tristatecheckbox/tristatecheckbox.d.ts +1 -1
  667. package/virtualscroller/virtualscroller.d.ts +12 -27
  668. package/resources/components/virtualscroller/virtualscroller.css +0 -3
@@ -0,0 +1,738 @@
1
+ import { NgModule, Component, Input, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, ContentChildren, Output, EventEmitter } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DomHandler } from 'primeng/dom';
4
+ import { PrimeTemplate } from 'primeng/api';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class Scroller {
8
+ constructor(cd, zone) {
9
+ this.cd = cd;
10
+ this.zone = zone;
11
+ this.onLazyLoad = new EventEmitter();
12
+ this.onScroll = new EventEmitter();
13
+ this.onScrollIndexChange = new EventEmitter();
14
+ this._tabindex = 0;
15
+ this._itemSize = 0;
16
+ this._orientation = 'vertical';
17
+ this._delay = 0;
18
+ this._resizeDelay = 10;
19
+ this._lazy = false;
20
+ this._disabled = false;
21
+ this._loaderDisabled = false;
22
+ this._showSpacer = true;
23
+ this._showLoader = false;
24
+ this._autoSize = false;
25
+ this.d_loading = false;
26
+ this.first = 0;
27
+ this.last = 0;
28
+ this.numItemsInViewport = 0;
29
+ this.lastScrollPos = 0;
30
+ this.loaderArr = [];
31
+ this.spacerStyle = {};
32
+ this.contentStyle = {};
33
+ this.initialized = false;
34
+ if (!this._disabled) {
35
+ this.zone.runOutsideAngular(() => {
36
+ this.windowResizeListener = this.onWindowResize.bind(this);
37
+ window.addEventListener('resize', this.windowResizeListener);
38
+ window.addEventListener('orientationchange', this.windowResizeListener);
39
+ });
40
+ }
41
+ }
42
+ get id() { return this._id; }
43
+ set id(val) { this._id = val; }
44
+ get style() { return this._style; }
45
+ set style(val) { this._style = val; }
46
+ get styleClass() { return this._styleClass; }
47
+ set styleClass(val) { this._styleClass = val; }
48
+ get tabindex() { return this._tabindex; }
49
+ set tabindex(val) { this._tabindex = val; }
50
+ get items() { return this._items; }
51
+ set items(val) { this._items = val; }
52
+ get itemSize() { return this._itemSize; }
53
+ set itemSize(val) { this._itemSize = val; }
54
+ get scrollHeight() { return this._scrollHeight; }
55
+ set scrollHeight(val) { this._scrollHeight = val; }
56
+ get scrollWidth() { return this._scrollWidth; }
57
+ set scrollWidth(val) { this._scrollWidth = val; }
58
+ get orientation() { return this._orientation; }
59
+ set orientation(val) { this._orientation = val; }
60
+ get delay() { return this._delay; }
61
+ set delay(val) { this._delay = val; }
62
+ get resizeDelay() { return this._resizeDelay; }
63
+ set resizeDelay(val) { this._resizeDelay = val; }
64
+ get lazy() { return this._lazy; }
65
+ set lazy(val) { this._lazy = val; }
66
+ get disabled() { return this._disabled; }
67
+ set disabled(val) { this._disabled = val; }
68
+ get loaderDisabled() { return this._loaderDisabled; }
69
+ set loaderDisabled(val) { this._loaderDisabled = val; }
70
+ get columns() { return this._columns; }
71
+ set columns(val) { this._columns = val; }
72
+ get showSpacer() { return this._showSpacer; }
73
+ set showSpacer(val) { this._showSpacer = val; }
74
+ get showLoader() { return this._showLoader; }
75
+ set showLoader(val) { this._showLoader = val; }
76
+ get numToleratedItems() { return this._numToleratedItems; }
77
+ set numToleratedItems(val) { this._numToleratedItems = val; }
78
+ get loading() { return this._loading; }
79
+ set loading(val) { this._loading = val; }
80
+ get autoSize() { return this._autoSize; }
81
+ set autoSize(val) { this._autoSize = val; }
82
+ get trackBy() { return this._trackBy; }
83
+ set trackBy(val) { this._trackBy = val; }
84
+ get options() { return this._options; }
85
+ set options(val) {
86
+ this._options = val;
87
+ if (val && typeof val === 'object') {
88
+ Object.entries(val).forEach(([k, v]) => this[`_${k}`] !== v && (this[`_${k}`] = v));
89
+ }
90
+ }
91
+ get vertical() {
92
+ return this._orientation === 'vertical';
93
+ }
94
+ get horizontal() {
95
+ return this._orientation === 'horizontal';
96
+ }
97
+ get both() {
98
+ return this._orientation === 'both';
99
+ }
100
+ get loadedItems() {
101
+ if (this._items && !this.d_loading) {
102
+ if (this.both)
103
+ return this._items.slice(this.first.rows, this.last.rows).map(item => this._columns ? item : item.slice(this.first.cols, this.last.cols));
104
+ else if (this.horizontal && this._columns)
105
+ return this._items;
106
+ else
107
+ return this._items.slice(this.first, this.last);
108
+ }
109
+ return [];
110
+ }
111
+ get loadedRows() {
112
+ return this.d_loading ? (this._loaderDisabled ? this.loaderArr : []) : this.loadedItems;
113
+ }
114
+ get loadedColumns() {
115
+ if (this._columns && (this.both || this.horizontal)) {
116
+ return this.d_loading && this._loaderDisabled ?
117
+ (this.both ? this.loaderArr[0] : this.loaderArr) :
118
+ this._columns.slice((this.both ? this.first.cols : this.first), (this.both ? this.last.cols : this.last));
119
+ }
120
+ return this._columns;
121
+ }
122
+ ngOnInit() {
123
+ this.setInitialState();
124
+ }
125
+ ngOnChanges(simpleChanges) {
126
+ if (this.initialized) {
127
+ let areItemsChanged = false;
128
+ if (simpleChanges.items) {
129
+ const { previousValue: prevItems, currentValue: currentItems } = simpleChanges.items;
130
+ areItemsChanged = !prevItems || prevItems.length !== (currentItems || []).length;
131
+ }
132
+ const isChanged = (areItemsChanged || simpleChanges.itemSize || simpleChanges.scrollHeight || simpleChanges.scrollWidth);
133
+ isChanged && this.init();
134
+ }
135
+ if (simpleChanges.orientation) {
136
+ this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0;
137
+ }
138
+ if (simpleChanges.loading) {
139
+ const { previousValue, currentValue } = simpleChanges.loading;
140
+ if (this.lazy && previousValue !== currentValue && currentValue !== this.d_loading) {
141
+ this.d_loading = currentValue;
142
+ }
143
+ }
144
+ if (simpleChanges.numToleratedItems) {
145
+ const { previousValue, currentValue } = simpleChanges.numToleratedItems;
146
+ if (previousValue !== currentValue && currentValue !== this.d_numToleratedItems) {
147
+ this.d_numToleratedItems = currentValue;
148
+ }
149
+ }
150
+ if (simpleChanges.options) {
151
+ const { previousValue, currentValue } = simpleChanges.options;
152
+ if (this.lazy && previousValue?.loading !== currentValue?.loading && currentValue?.loading !== this.d_loading) {
153
+ this.d_loading = currentValue.loading;
154
+ }
155
+ if (previousValue?.numToleratedItems !== currentValue?.numToleratedItems && currentValue?.numToleratedItems !== this.d_numToleratedItems) {
156
+ this.d_numToleratedItems = currentValue.numToleratedItems;
157
+ }
158
+ }
159
+ }
160
+ ngAfterContentInit() {
161
+ this.templates.forEach((item) => {
162
+ switch (item.getType()) {
163
+ case 'content':
164
+ this.contentTemplate = item.template;
165
+ break;
166
+ case 'item':
167
+ this.itemTemplate = item.template;
168
+ break;
169
+ case 'loader':
170
+ this.loaderTemplate = item.template;
171
+ break;
172
+ case 'loadericon':
173
+ this.loaderIconTemplate = item.template;
174
+ break;
175
+ default:
176
+ this.itemTemplate = item.template;
177
+ break;
178
+ }
179
+ });
180
+ }
181
+ ngAfterViewInit() {
182
+ this.setContentEl(this.contentEl);
183
+ this.init();
184
+ this.defaultWidth = DomHandler.getWidth(this.elementViewChild.nativeElement);
185
+ this.defaultHeight = DomHandler.getHeight(this.elementViewChild.nativeElement);
186
+ this.initialized = true;
187
+ }
188
+ ngAfterViewChecked() {
189
+ this.calculateAutoSize();
190
+ }
191
+ ngOnDestroy() {
192
+ if (this.windowResizeListener) {
193
+ window.removeEventListener('resize', this.windowResizeListener);
194
+ window.removeEventListener('orientationchange', this.windowResizeListener);
195
+ this.windowResizeListener = null;
196
+ }
197
+ }
198
+ init() {
199
+ if (!this._disabled) {
200
+ this.setSize();
201
+ this.calculateOptions();
202
+ this.setSpacerSize();
203
+ this.cd.detectChanges();
204
+ }
205
+ }
206
+ setContentEl(el) {
207
+ this.contentEl = el || this.contentViewChild?.nativeElement || DomHandler.findSingle(this.elementViewChild?.nativeElement, '.p-scroller-content');
208
+ }
209
+ setInitialState() {
210
+ this.first = this.both ? { rows: 0, cols: 0 } : 0;
211
+ this.last = this.both ? { rows: 0, cols: 0 } : 0;
212
+ this.numItemsInViewport = this.both ? { rows: 0, cols: 0 } : 0;
213
+ this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0;
214
+ this.d_loading = this._loading || false;
215
+ this.d_numToleratedItems = this._numToleratedItems;
216
+ }
217
+ getElementRef() {
218
+ return this.elementViewChild;
219
+ }
220
+ scrollTo(options) {
221
+ this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0;
222
+ this.elementViewChild?.nativeElement?.scrollTo(options);
223
+ }
224
+ scrollToIndex(index, behavior = 'auto') {
225
+ const { numToleratedItems } = this.calculateNumItems();
226
+ const contentPos = this.getContentPosition();
227
+ const calculateFirst = (_index = 0, _numT) => (_index <= _numT ? 0 : _index);
228
+ const calculateCoord = (_first, _size, _cpos) => (_first * _size) + _cpos;
229
+ const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior });
230
+ if (this.both) {
231
+ const newFirst = { rows: calculateFirst(index[0], numToleratedItems[0]), cols: calculateFirst(index[1], numToleratedItems[1]) };
232
+ if (newFirst.rows !== this.first.rows || newFirst.cols !== this.first.cols) {
233
+ scrollTo(calculateCoord(newFirst.cols, this._itemSize[1], contentPos.left), calculateCoord(newFirst.rows, this._itemSize[0], contentPos.top));
234
+ }
235
+ }
236
+ else {
237
+ const newFirst = calculateFirst(index, numToleratedItems);
238
+ if (newFirst !== this.first) {
239
+ this.horizontal ? scrollTo(calculateCoord(newFirst, this._itemSize, contentPos.left), 0) : scrollTo(0, calculateCoord(newFirst, this._itemSize, contentPos.top));
240
+ }
241
+ }
242
+ }
243
+ scrollInView(index, to, behavior = 'auto') {
244
+ if (to) {
245
+ const { first, viewport } = this.getRenderedRange();
246
+ const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior });
247
+ const isToStart = to === 'to-start';
248
+ const isToEnd = to === 'to-end';
249
+ if (isToStart) {
250
+ if (this.both) {
251
+ if (viewport.first.rows - first.rows > index[0]) {
252
+ scrollTo(viewport.first.cols * this._itemSize[1], (viewport.first.rows - 1) * this._itemSize[0]);
253
+ }
254
+ else if (viewport.first.cols - first.cols > index[1]) {
255
+ scrollTo((viewport.first.cols - 1) * this._itemSize[1], viewport.first.rows * this._itemSize[0]);
256
+ }
257
+ }
258
+ else {
259
+ if (viewport.first - first > index) {
260
+ const pos = (viewport.first - 1) * this._itemSize;
261
+ this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos);
262
+ }
263
+ }
264
+ }
265
+ else if (isToEnd) {
266
+ if (this.both) {
267
+ if (viewport.last.rows - first.rows <= index[0] + 1) {
268
+ scrollTo(viewport.first.cols * this._itemSize[1], (viewport.first.rows + 1) * this._itemSize[0]);
269
+ }
270
+ else if (viewport.last.cols - first.cols <= index[1] + 1) {
271
+ scrollTo((viewport.first.cols + 1) * this._itemSize[1], viewport.first.rows * this._itemSize[0]);
272
+ }
273
+ }
274
+ else {
275
+ if (viewport.last - first <= index + 1) {
276
+ const pos = (viewport.first + 1) * this._itemSize;
277
+ this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos);
278
+ }
279
+ }
280
+ }
281
+ }
282
+ else {
283
+ this.scrollToIndex(index, behavior);
284
+ }
285
+ }
286
+ getRenderedRange() {
287
+ const calculateFirstInViewport = (_pos, _size) => Math.floor(_pos / (_size || _pos));
288
+ let firstInViewport = this.first;
289
+ let lastInViewport = 0;
290
+ if (this.elementViewChild?.nativeElement) {
291
+ const { scrollTop, scrollLeft } = this.elementViewChild.nativeElement;
292
+ if (this.both) {
293
+ firstInViewport = { rows: calculateFirstInViewport(scrollTop, this._itemSize[0]), cols: calculateFirstInViewport(scrollLeft, this._itemSize[1]) };
294
+ lastInViewport = { rows: firstInViewport.rows + this.numItemsInViewport.rows, cols: firstInViewport.cols + this.numItemsInViewport.cols };
295
+ }
296
+ else {
297
+ const scrollPos = this.horizontal ? scrollLeft : scrollTop;
298
+ firstInViewport = calculateFirstInViewport(scrollPos, this._itemSize);
299
+ lastInViewport = firstInViewport + this.numItemsInViewport;
300
+ }
301
+ }
302
+ return {
303
+ first: this.first,
304
+ last: this.last,
305
+ viewport: {
306
+ first: firstInViewport,
307
+ last: lastInViewport
308
+ }
309
+ };
310
+ }
311
+ calculateNumItems() {
312
+ const contentPos = this.getContentPosition();
313
+ const contentWidth = this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetWidth - contentPos.left : 0;
314
+ const contentHeight = this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetHeight - contentPos.top : 0;
315
+ const calculateNumItemsInViewport = (_contentSize, _itemSize) => Math.ceil(_contentSize / (_itemSize || _contentSize));
316
+ const calculateNumToleratedItems = (_numItems) => Math.ceil(_numItems / 2);
317
+ const numItemsInViewport = this.both ?
318
+ { rows: calculateNumItemsInViewport(contentHeight, this._itemSize[0]), cols: calculateNumItemsInViewport(contentWidth, this._itemSize[1]) } :
319
+ calculateNumItemsInViewport((this.horizontal ? contentWidth : contentHeight), this._itemSize);
320
+ const numToleratedItems = this.d_numToleratedItems || (this.both ?
321
+ [calculateNumToleratedItems(numItemsInViewport.rows), calculateNumToleratedItems(numItemsInViewport.cols)] :
322
+ calculateNumToleratedItems(numItemsInViewport));
323
+ return { numItemsInViewport, numToleratedItems };
324
+ }
325
+ calculateOptions() {
326
+ const { numItemsInViewport, numToleratedItems } = this.calculateNumItems();
327
+ const calculateLast = (_first, _num, _numT, _isCols = false) => this.getLast(_first + _num + ((_first < _numT ? 2 : 3) * _numT), _isCols);
328
+ const first = this.first;
329
+ const last = this.both ?
330
+ { rows: calculateLast(this.first.rows, numItemsInViewport.rows, numToleratedItems[0]), cols: calculateLast(this.first.cols, numItemsInViewport.cols, numToleratedItems[1], true) } :
331
+ calculateLast(this.first, numItemsInViewport, numToleratedItems);
332
+ this.last = last;
333
+ this.numItemsInViewport = numItemsInViewport;
334
+ this.d_numToleratedItems = numToleratedItems;
335
+ if (this.showLoader) {
336
+ this.loaderArr = this.both ?
337
+ Array.from({ length: numItemsInViewport.rows }).map(() => Array.from({ length: numItemsInViewport.cols })) :
338
+ Array.from({ length: numItemsInViewport });
339
+ }
340
+ if (this._lazy) {
341
+ this.handleEvents('onLazyLoad', { first, last });
342
+ }
343
+ }
344
+ calculateAutoSize() {
345
+ if (this._autoSize && !this.d_loading) {
346
+ Promise.resolve().then(() => {
347
+ if (this.contentEl) {
348
+ this.contentEl.style.minHeight = this.contentEl.style.minWidth = 'auto';
349
+ const { offsetWidth, offsetHeight } = this.contentEl;
350
+ (this.both || this.horizontal) && (this.elementViewChild.nativeElement.style.width = (offsetWidth < this.defaultWidth ? offsetWidth : this.defaultWidth) + 'px');
351
+ (this.both || this.vertical) && (this.elementViewChild.nativeElement.style.height = (offsetHeight < this.defaultHeight ? offsetHeight : this.defaultHeight) + 'px');
352
+ this.contentEl.style.minHeight = this.contentEl.style.minWidth = '';
353
+ }
354
+ });
355
+ }
356
+ }
357
+ getLast(last = 0, isCols = false) {
358
+ return this._items ? Math.min((isCols ? (this._columns || this._items[0]).length : this._items.length), last) : 0;
359
+ }
360
+ getContentPosition() {
361
+ if (this.contentEl) {
362
+ const style = getComputedStyle(this.contentEl);
363
+ const left = parseInt(style.paddingLeft, 10) + Math.max(parseInt(style.left, 10), 0);
364
+ const right = parseInt(style.paddingRight, 10) + Math.max(parseInt(style.right, 10), 0);
365
+ const top = parseInt(style.paddingTop, 10) + Math.max(parseInt(style.top, 10), 0);
366
+ const bottom = parseInt(style.paddingBottom, 10) + Math.max(parseInt(style.bottom, 10), 0);
367
+ return { left, right, top, bottom, x: left + right, y: top + bottom };
368
+ }
369
+ return { left: 0, right: 0, top: 0, bottom: 0, x: 0, y: 0 };
370
+ }
371
+ setSize() {
372
+ if (this.elementViewChild?.nativeElement) {
373
+ const parentElement = this.elementViewChild.nativeElement.parentElement.parentElement;
374
+ const width = this._scrollWidth || `${(this.elementViewChild.nativeElement.offsetWidth || parentElement.offsetWidth)}px`;
375
+ const height = this._scrollHeight || `${(this.elementViewChild.nativeElement.offsetHeight || parentElement.offsetHeight)}px`;
376
+ const setProp = (_name, _value) => this.elementViewChild.nativeElement.style[_name] = _value;
377
+ if (this.both || this.horizontal) {
378
+ setProp('height', height);
379
+ setProp('width', width);
380
+ }
381
+ else {
382
+ setProp('height', height);
383
+ }
384
+ }
385
+ }
386
+ setSpacerSize() {
387
+ if (this._items) {
388
+ const contentPos = this.getContentPosition();
389
+ const setProp = (_name, _value, _size, _cpos = 0) => this.spacerStyle = { ...this.spacerStyle, ...{ [`${_name}`]: (((_value || []).length * _size) + _cpos) + 'px' } };
390
+ if (this.both) {
391
+ setProp('height', this._items, this._itemSize[0], contentPos.y);
392
+ setProp('width', (this._columns || this._items[1]), this._itemSize[1], contentPos.x);
393
+ }
394
+ else {
395
+ this.horizontal ? setProp('width', (this._columns || this._items), this._itemSize, contentPos.x) : setProp('height', this._items, this._itemSize, contentPos.y);
396
+ }
397
+ }
398
+ }
399
+ setContentPosition(pos) {
400
+ if (this.contentEl) {
401
+ const first = pos ? pos.first : this.first;
402
+ const calculateTranslateVal = (_first, _size) => (_first * _size);
403
+ const setTransform = (_x = 0, _y = 0) => this.contentStyle = { ...this.contentStyle, ...{ transform: `translate3d(${_x}px, ${_y}px, 0)` } };
404
+ if (this.both) {
405
+ setTransform(calculateTranslateVal(first.cols, this._itemSize[1]), calculateTranslateVal(first.rows, this._itemSize[0]));
406
+ }
407
+ else {
408
+ const translateVal = calculateTranslateVal(first, this._itemSize);
409
+ this.horizontal ? setTransform(translateVal, 0) : setTransform(0, translateVal);
410
+ }
411
+ }
412
+ }
413
+ onScrollPositionChange(event) {
414
+ const target = event.target;
415
+ const contentPos = this.getContentPosition();
416
+ const calculateScrollPos = (_pos, _cpos) => _pos ? (_pos > _cpos ? _pos - _cpos : _pos) : 0;
417
+ const calculateCurrentIndex = (_pos, _size) => Math.floor(_pos / (_size || _pos));
418
+ const calculateTriggerIndex = (_currentIndex, _first, _last, _num, _numT, _isScrollDownOrRight) => {
419
+ return (_currentIndex <= _numT ? _numT : (_isScrollDownOrRight ? (_last - _num - _numT) : (_first + _numT - 1)));
420
+ };
421
+ const calculateFirst = (_currentIndex, _triggerIndex, _first, _last, _num, _numT, _isScrollDownOrRight) => {
422
+ if (_currentIndex <= _numT)
423
+ return 0;
424
+ else
425
+ return Math.max(0, _isScrollDownOrRight ?
426
+ (_currentIndex < _triggerIndex ? _first : _currentIndex - _numT) :
427
+ (_currentIndex > _triggerIndex ? _first : _currentIndex - (2 * _numT)));
428
+ };
429
+ const calculateLast = (_currentIndex, _first, _last, _num, _numT, _isCols = false) => {
430
+ let lastValue = _first + _num + (2 * _numT);
431
+ if (_currentIndex >= _numT) {
432
+ lastValue += (_numT + 1);
433
+ }
434
+ return this.getLast(lastValue, _isCols);
435
+ };
436
+ const scrollTop = calculateScrollPos(target.scrollTop, contentPos.top);
437
+ const scrollLeft = calculateScrollPos(target.scrollLeft, contentPos.left);
438
+ let newFirst = this.both ? { rows: 0, cols: 0 } : 0;
439
+ let newLast = this.last;
440
+ let isRangeChanged = false;
441
+ let newScrollPos = this.lastScrollPos;
442
+ if (this.both) {
443
+ const isScrollDown = this.lastScrollPos.top <= scrollTop;
444
+ const isScrollRight = this.lastScrollPos.left <= scrollLeft;
445
+ const currentIndex = { rows: calculateCurrentIndex(scrollTop, this._itemSize[0]), cols: calculateCurrentIndex(scrollLeft, this._itemSize[1]) };
446
+ const triggerIndex = {
447
+ rows: calculateTriggerIndex(currentIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown),
448
+ cols: calculateTriggerIndex(currentIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight)
449
+ };
450
+ newFirst = {
451
+ rows: calculateFirst(currentIndex.rows, triggerIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown),
452
+ cols: calculateFirst(currentIndex.cols, triggerIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight)
453
+ };
454
+ newLast = {
455
+ rows: calculateLast(currentIndex.rows, newFirst.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0]),
456
+ cols: calculateLast(currentIndex.cols, newFirst.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], true)
457
+ };
458
+ isRangeChanged = (newFirst.rows !== this.first.rows || newLast.rows !== this.last.rows) || (newFirst.cols !== this.first.cols || newLast.cols !== this.last.cols);
459
+ newScrollPos = { top: scrollTop, left: scrollLeft };
460
+ }
461
+ else {
462
+ const scrollPos = this.horizontal ? scrollLeft : scrollTop;
463
+ const isScrollDownOrRight = this.lastScrollPos <= scrollPos;
464
+ const currentIndex = calculateCurrentIndex(scrollPos, this._itemSize);
465
+ const triggerIndex = calculateTriggerIndex(currentIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight);
466
+ newFirst = calculateFirst(currentIndex, triggerIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight);
467
+ newLast = calculateLast(currentIndex, newFirst, this.last, this.numItemsInViewport, this.d_numToleratedItems);
468
+ isRangeChanged = newFirst !== this.first || newLast !== this.last;
469
+ newScrollPos = scrollPos;
470
+ }
471
+ return {
472
+ first: newFirst,
473
+ last: newLast,
474
+ isRangeChanged,
475
+ scrollPos: newScrollPos
476
+ };
477
+ }
478
+ onScrollChange(event) {
479
+ const { first, last, isRangeChanged, scrollPos } = this.onScrollPositionChange(event);
480
+ if (isRangeChanged) {
481
+ const newState = { first, last };
482
+ this.setContentPosition(newState);
483
+ this.first = first;
484
+ this.last = last;
485
+ this.lastScrollPos = scrollPos;
486
+ this.handleEvents('onScrollIndexChange', newState);
487
+ if (this._lazy) {
488
+ this.handleEvents('onLazyLoad', newState);
489
+ }
490
+ }
491
+ }
492
+ onContainerScroll(event) {
493
+ this.handleEvents('onScroll', { originalEvent: event });
494
+ if (this._delay) {
495
+ if (this.scrollTimeout) {
496
+ clearTimeout(this.scrollTimeout);
497
+ }
498
+ if (!this.d_loading && this.showLoader) {
499
+ const { isRangeChanged: changed } = this.onScrollPositionChange(event);
500
+ if (changed) {
501
+ this.d_loading = true;
502
+ this.cd.detectChanges();
503
+ }
504
+ }
505
+ this.scrollTimeout = setTimeout(() => {
506
+ this.onScrollChange(event);
507
+ if (this.d_loading && this.showLoader && (!this._lazy || this._loading === undefined)) {
508
+ this.d_loading = false;
509
+ this.cd.detectChanges();
510
+ }
511
+ }, this._delay);
512
+ }
513
+ else {
514
+ this.onScrollChange(event);
515
+ }
516
+ }
517
+ onWindowResize() {
518
+ if (this.resizeTimeout) {
519
+ clearTimeout(this.resizeTimeout);
520
+ }
521
+ this.resizeTimeout = setTimeout(() => {
522
+ if (this.elementViewChild) {
523
+ const [width, height] = [DomHandler.getWidth(this.elementViewChild.nativeElement), DomHandler.getHeight(this.elementViewChild.nativeElement)];
524
+ const [isDiffWidth, isDiffHeight] = [width !== this.defaultWidth, height !== this.defaultHeight];
525
+ const reinit = this.both ? (isDiffWidth || isDiffHeight) : (this.horizontal ? isDiffWidth : (this.vertical ? isDiffHeight : false));
526
+ reinit && this.zone.run(() => {
527
+ this.d_numToleratedItems = this._numToleratedItems;
528
+ this.defaultWidth = width;
529
+ this.defaultHeight = height;
530
+ this.init();
531
+ });
532
+ }
533
+ }, this._resizeDelay);
534
+ }
535
+ handleEvents(name, params) {
536
+ return this.options && this.options[name] ? this.options[name](params) : this[name].emit(params);
537
+ }
538
+ getContentOptions() {
539
+ return {
540
+ contentStyleClass: `p-scroller-content ${this.d_loading ? 'p-scroller-loading' : ''}`,
541
+ items: this.loadedItems,
542
+ getItemOptions: (index) => this.getOptions(index),
543
+ loading: this.d_loading,
544
+ getLoaderOptions: (index, options) => this.getLoaderOptions(index, options),
545
+ itemSize: this._itemSize,
546
+ rows: this.loadedRows,
547
+ columns: this.loadedColumns,
548
+ spacerStyle: this.spacerStyle,
549
+ contentStyle: this.contentStyle,
550
+ vertical: this.vertical,
551
+ horizontal: this.horizontal,
552
+ both: this.both
553
+ };
554
+ }
555
+ getOptions(renderedIndex) {
556
+ const count = (this._items || []).length;
557
+ const index = this.both ? this.first.rows + renderedIndex : this.first + renderedIndex;
558
+ return {
559
+ index,
560
+ count,
561
+ first: index === 0,
562
+ last: index === (count - 1),
563
+ even: index % 2 === 0,
564
+ odd: index % 2 !== 0
565
+ };
566
+ }
567
+ getLoaderOptions(index, extOptions) {
568
+ const count = this.loaderArr.length;
569
+ return {
570
+ index,
571
+ count,
572
+ first: index === 0,
573
+ last: index === (count - 1),
574
+ even: index % 2 === 0,
575
+ odd: index % 2 !== 0,
576
+ ...extOptions
577
+ };
578
+ }
579
+ }
580
+ Scroller.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: Scroller, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
581
+ Scroller.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: Scroller, selector: "p-scroller", inputs: { id: "id", style: "style", styleClass: "styleClass", tabindex: "tabindex", items: "items", itemSize: "itemSize", scrollHeight: "scrollHeight", scrollWidth: "scrollWidth", orientation: "orientation", delay: "delay", resizeDelay: "resizeDelay", lazy: "lazy", disabled: "disabled", loaderDisabled: "loaderDisabled", columns: "columns", showSpacer: "showSpacer", showLoader: "showLoader", numToleratedItems: "numToleratedItems", loading: "loading", autoSize: "autoSize", trackBy: "trackBy", options: "options" }, outputs: { onLazyLoad: "onLazyLoad", onScroll: "onScroll", onScrollIndexChange: "onScrollIndexChange" }, host: { classAttribute: "p-scroller-viewport p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "elementViewChild", first: true, predicate: ["element"], descendants: true }, { propertyName: "contentViewChild", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
582
+ <ng-container *ngIf="!_disabled; else disabledContainer">
583
+ <div #element [attr.id]="_id" [attr.tabindex]="tabindex" [ngStyle]="_style" [class]="_styleClass"
584
+ [ngClass]="{'p-scroller': true, 'p-both-scroll': both, 'p-horizontal-scroll': horizontal}"
585
+ (scroll)="onContainerScroll($event)">
586
+ <ng-container *ngIf="contentTemplate; else buildInContent">
587
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: loadedItems, options: getContentOptions()}"></ng-container>
588
+ </ng-container>
589
+ <ng-template #buildInContent>
590
+ <div #content class="p-scroller-content" [ngClass]="{'p-scroller-loading': d_loading}" [ngStyle]="contentStyle">
591
+ <ng-container *ngFor="let item of loadedItems; let index = index; trackBy: _trackBy || index">
592
+ <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item, options: getOptions(index)}"></ng-container>
593
+ </ng-container>
594
+ </div>
595
+ </ng-template>
596
+ <div *ngIf="_showSpacer" class="p-scroller-spacer" [ngStyle]="spacerStyle"></div>
597
+ <div *ngIf="!loaderDisabled && _showLoader && d_loading" class="p-scroller-loader" [ngClass]="{'p-component-overlay': !loaderTemplate}">
598
+ <ng-container *ngIf="loaderTemplate; else buildInLoader">
599
+ <ng-container *ngFor="let item of loaderArr; let index = index">
600
+ <ng-container *ngTemplateOutlet="loaderTemplate; context: {options: getLoaderOptions(index, both && { numCols: _numItemsInViewport.cols })}"></ng-container>
601
+ </ng-container>
602
+ </ng-container>
603
+ <ng-template #buildInLoader>
604
+ <ng-container *ngIf="loaderIconTemplate; else buildInLoaderIcon">
605
+ <ng-container *ngTemplateOutlet="loaderIconTemplate; context: {options: { styleClass: 'p-scroller-loading-icon' }}"></ng-container>
606
+ </ng-container>
607
+ <ng-template #buildInLoaderIcon>
608
+ <i class="p-scroller-loading-icon pi pi-spinner pi-spin"></i>
609
+ </ng-template>
610
+ </ng-template>
611
+ </div>
612
+ </div>
613
+ </ng-container>
614
+ <ng-template #disabledContainer>
615
+ <ng-content></ng-content>
616
+ <ng-container *ngIf="contentTemplate">
617
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: items, options: {rows: _items, columns: loadedColumns}}"></ng-container>
618
+ </ng-container>
619
+ </ng-template>
620
+ `, isInline: true, styles: ["p-scroller{flex:1;outline:0 none}.p-scroller{position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;outline:0 none}.p-scroller-content{position:absolute;top:0;left:0;min-height:100%;min-width:100%;will-change:transform}.p-scroller-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;pointer-events:none}.p-scroller-loader{position:sticky;top:0;left:0;width:100%;height:100%}.p-scroller-loader.p-component-overlay{display:flex;align-items:center;justify-content:center}.p-scroller-loading-icon{font-size:2rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
621
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: Scroller, decorators: [{
622
+ type: Component,
623
+ args: [{ selector: 'p-scroller', template: `
624
+ <ng-container *ngIf="!_disabled; else disabledContainer">
625
+ <div #element [attr.id]="_id" [attr.tabindex]="tabindex" [ngStyle]="_style" [class]="_styleClass"
626
+ [ngClass]="{'p-scroller': true, 'p-both-scroll': both, 'p-horizontal-scroll': horizontal}"
627
+ (scroll)="onContainerScroll($event)">
628
+ <ng-container *ngIf="contentTemplate; else buildInContent">
629
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: loadedItems, options: getContentOptions()}"></ng-container>
630
+ </ng-container>
631
+ <ng-template #buildInContent>
632
+ <div #content class="p-scroller-content" [ngClass]="{'p-scroller-loading': d_loading}" [ngStyle]="contentStyle">
633
+ <ng-container *ngFor="let item of loadedItems; let index = index; trackBy: _trackBy || index">
634
+ <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item, options: getOptions(index)}"></ng-container>
635
+ </ng-container>
636
+ </div>
637
+ </ng-template>
638
+ <div *ngIf="_showSpacer" class="p-scroller-spacer" [ngStyle]="spacerStyle"></div>
639
+ <div *ngIf="!loaderDisabled && _showLoader && d_loading" class="p-scroller-loader" [ngClass]="{'p-component-overlay': !loaderTemplate}">
640
+ <ng-container *ngIf="loaderTemplate; else buildInLoader">
641
+ <ng-container *ngFor="let item of loaderArr; let index = index">
642
+ <ng-container *ngTemplateOutlet="loaderTemplate; context: {options: getLoaderOptions(index, both && { numCols: _numItemsInViewport.cols })}"></ng-container>
643
+ </ng-container>
644
+ </ng-container>
645
+ <ng-template #buildInLoader>
646
+ <ng-container *ngIf="loaderIconTemplate; else buildInLoaderIcon">
647
+ <ng-container *ngTemplateOutlet="loaderIconTemplate; context: {options: { styleClass: 'p-scroller-loading-icon' }}"></ng-container>
648
+ </ng-container>
649
+ <ng-template #buildInLoaderIcon>
650
+ <i class="p-scroller-loading-icon pi pi-spinner pi-spin"></i>
651
+ </ng-template>
652
+ </ng-template>
653
+ </div>
654
+ </div>
655
+ </ng-container>
656
+ <ng-template #disabledContainer>
657
+ <ng-content></ng-content>
658
+ <ng-container *ngIf="contentTemplate">
659
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: items, options: {rows: _items, columns: loadedColumns}}"></ng-container>
660
+ </ng-container>
661
+ </ng-template>
662
+ `, changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, host: {
663
+ 'class': 'p-scroller-viewport p-element'
664
+ }, styles: ["p-scroller{flex:1;outline:0 none}.p-scroller{position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;outline:0 none}.p-scroller-content{position:absolute;top:0;left:0;min-height:100%;min-width:100%;will-change:transform}.p-scroller-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;pointer-events:none}.p-scroller-loader{position:sticky;top:0;left:0;width:100%;height:100%}.p-scroller-loader.p-component-overlay{display:flex;align-items:center;justify-content:center}.p-scroller-loading-icon{font-size:2rem}\n"] }]
665
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { id: [{
666
+ type: Input
667
+ }], style: [{
668
+ type: Input
669
+ }], styleClass: [{
670
+ type: Input
671
+ }], tabindex: [{
672
+ type: Input
673
+ }], items: [{
674
+ type: Input
675
+ }], itemSize: [{
676
+ type: Input
677
+ }], scrollHeight: [{
678
+ type: Input
679
+ }], scrollWidth: [{
680
+ type: Input
681
+ }], orientation: [{
682
+ type: Input
683
+ }], delay: [{
684
+ type: Input
685
+ }], resizeDelay: [{
686
+ type: Input
687
+ }], lazy: [{
688
+ type: Input
689
+ }], disabled: [{
690
+ type: Input
691
+ }], loaderDisabled: [{
692
+ type: Input
693
+ }], columns: [{
694
+ type: Input
695
+ }], showSpacer: [{
696
+ type: Input
697
+ }], showLoader: [{
698
+ type: Input
699
+ }], numToleratedItems: [{
700
+ type: Input
701
+ }], loading: [{
702
+ type: Input
703
+ }], autoSize: [{
704
+ type: Input
705
+ }], trackBy: [{
706
+ type: Input
707
+ }], options: [{
708
+ type: Input
709
+ }], elementViewChild: [{
710
+ type: ViewChild,
711
+ args: ['element']
712
+ }], contentViewChild: [{
713
+ type: ViewChild,
714
+ args: ['content']
715
+ }], templates: [{
716
+ type: ContentChildren,
717
+ args: [PrimeTemplate]
718
+ }], onLazyLoad: [{
719
+ type: Output
720
+ }], onScroll: [{
721
+ type: Output
722
+ }], onScrollIndexChange: [{
723
+ type: Output
724
+ }] } });
725
+ export class ScrollerModule {
726
+ }
727
+ ScrollerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ScrollerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
728
+ ScrollerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ScrollerModule, declarations: [Scroller], imports: [CommonModule], exports: [Scroller] });
729
+ ScrollerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ScrollerModule, imports: [CommonModule] });
730
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ScrollerModule, decorators: [{
731
+ type: NgModule,
732
+ args: [{
733
+ imports: [CommonModule],
734
+ exports: [Scroller],
735
+ declarations: [Scroller]
736
+ }]
737
+ }] });
738
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvc2Nyb2xsZXIvc2Nyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBdUMsZUFBZSxFQUEwQixNQUFNLEVBQUUsWUFBWSxFQUE4RCxNQUFNLGVBQWUsQ0FBQztBQUM5UixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7QUFpRjVDLE1BQU0sT0FBTyxRQUFRO0lBaU5qQixZQUFvQixFQUFxQixFQUFVLElBQVk7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBaklyRCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkQsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELHdCQUFtQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBUXRFLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFJdEIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQU1uQixpQkFBWSxHQUFXLFVBQVUsQ0FBQztRQUVsQyxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRW5CLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBRTFCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFdkIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUUzQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUlqQyxnQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQU03QixjQUFTLEdBQVksS0FBSyxDQUFDO1FB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QUdPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBR08sVUFBVTtzQkFBdEIsS0FBSztnQkFHTyxpQkFBaUI7c0JBQTdCLEtBQUs7Z0JBR08sT0FBTztzQkFBbkIsS0FBSztnQkFHTyxRQUFRO3NCQUFwQixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUs7Z0JBR08sT0FBTztzQkFBbkIsS0FBSztnQkFTZ0IsZ0JBQWdCO3NCQUFyQyxTQUFTO3VCQUFDLFNBQVM7Z0JBRUUsZ0JBQWdCO3NCQUFyQyxTQUFTO3VCQUFDLFNBQVM7Z0JBRVksU0FBUztzQkFBeEMsZUFBZTt1QkFBQyxhQUFhO2dCQUVwQixVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNOztBQWdyQlgsTUFBTSxPQUFPLGNBQWM7OzJHQUFkLGNBQWM7NEdBQWQsY0FBYyxpQkFwd0JkLFFBQVEsYUFnd0JQLFlBQVksYUFod0JiLFFBQVE7NEdBb3dCUixjQUFjLFlBSmIsWUFBWTsyRkFJYixjQUFjO2tCQUwxQixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO29CQUNuQixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIENvbXBvbmVudCwgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIFZpZXdFbmNhcHN1bGF0aW9uLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJDb250ZW50SW5pdCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICdwcmltZW5nL2RvbSc7XG5pbXBvcnQgeyBQcmltZVRlbXBsYXRlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuXG5leHBvcnQgdHlwZSBTY3JvbGxlclRvVHlwZSA9ICd0by1zdGFydCcgfCAndG8tZW5kJyB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgU2Nyb2xsZXJPcmllbnRhdGlvblR5cGUgPSAndmVydGljYWwnIHwgJ2hvcml6b250YWwnIHwgJ2JvdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3R5bGU/OiBhbnk7XG4gICAgc3R5bGVDbGFzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0YWJpbmRleD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpdGVtcz86IGFueVtdO1xuICAgIGl0ZW1TaXplPzogYW55O1xuICAgIHNjcm9sbEhlaWdodD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzY3JvbGxXaWR0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBvcmllbnRhdGlvbj86IFNjcm9sbGVyT3JpZW50YXRpb25UeXBlO1xuICAgIGRlbGF5PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxhenk/OiBib29sZWFuO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICBsb2FkZXJEaXNhYmxlZD86IGJvb2xlYW47XG4gICAgY29sdW1ucz86IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIHNob3dTcGFjZXI/OiBib29sZWFuO1xuICAgIHNob3dMb2FkZXI/OiBib29sZWFuO1xuICAgIG51bVRvbGVyYXRlZEl0ZW1zPzogYW55O1xuICAgIGxvYWRpbmc/OiBib29sZWFuO1xuICAgIGF1dG9TaXplPzogYm9vbGVhbjtcbiAgICB0cmFja0J5PzogYW55O1xuICAgIG9uTGF6eUxvYWQ/OiBGdW5jdGlvbiB8IHVuZGVmaW5lZDtcbiAgICBvblNjcm9sbD86IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICAgIG9uU2Nyb2xsSW5kZXhDaGFuZ2U/OiBGdW5jdGlvbiB8IHVuZGVmaW5lZDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwLXNjcm9sbGVyJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9kaXNhYmxlZDsgZWxzZSBkaXNhYmxlZENvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiAjZWxlbWVudCBbYXR0ci5pZF09XCJfaWRcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIFtuZ1N0eWxlXT1cIl9zdHlsZVwiIFtjbGFzc109XCJfc3R5bGVDbGFzc1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwLXNjcm9sbGVyJzogdHJ1ZSwgJ3AtYm90aC1zY3JvbGwnOiBib3RoLCAncC1ob3Jpem9udGFsLXNjcm9sbCc6IGhvcml6b250YWx9XCJcbiAgICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uQ29udGFpbmVyU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFRlbXBsYXRlOyBlbHNlIGJ1aWxkSW5Db250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50VGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGxvYWRlZEl0ZW1zLCBvcHRpb25zOiBnZXRDb250ZW50T3B0aW9ucygpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnVpbGRJbkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI2NvbnRlbnQgY2xhc3M9XCJwLXNjcm9sbGVyLWNvbnRlbnRcIiBbbmdDbGFzc109XCJ7J3Atc2Nyb2xsZXItbG9hZGluZyc6IGRfbG9hZGluZ31cIiBbbmdTdHlsZV09XCJjb250ZW50U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbG9hZGVkSXRlbXM7IGxldCBpbmRleCA9IGluZGV4OyB0cmFja0J5OiBfdHJhY2tCeSB8fCBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW0sIG9wdGlvbnM6IGdldE9wdGlvbnMoaW5kZXgpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIl9zaG93U3BhY2VyXCIgY2xhc3M9XCJwLXNjcm9sbGVyLXNwYWNlclwiIFtuZ1N0eWxlXT1cInNwYWNlclN0eWxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkZXJEaXNhYmxlZCAmJiBfc2hvd0xvYWRlciAmJiBkX2xvYWRpbmdcIiBjbGFzcz1cInAtc2Nyb2xsZXItbG9hZGVyXCIgW25nQ2xhc3NdPVwieydwLWNvbXBvbmVudC1vdmVybGF5JzogIWxvYWRlclRlbXBsYXRlfVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGVyVGVtcGxhdGU7IGVsc2UgYnVpbGRJbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsb2FkZXJBcnI7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRlclRlbXBsYXRlOyBjb250ZXh0OiB7b3B0aW9uczogZ2V0TG9hZGVyT3B0aW9ucyhpbmRleCwgYm90aCAmJiB7IG51bUNvbHM6IF9udW1JdGVtc0luVmlld3BvcnQuY29scyB9KX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidWlsZEluTG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlckljb25UZW1wbGF0ZTsgZWxzZSBidWlsZEluTG9hZGVySWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkZXJJY29uVGVtcGxhdGU7IGNvbnRleHQ6IHtvcHRpb25zOiB7IHN0eWxlQ2xhc3M6ICdwLXNjcm9sbGVyLWxvYWRpbmctaWNvbicgfX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidWlsZEluTG9hZGVySWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInAtc2Nyb2xsZXItbG9hZGluZy1pY29uIHBpIHBpLXNwaW5uZXIgcGktc3BpblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWRDb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbXMsIG9wdGlvbnM6IHtyb3dzOiBfaXRlbXMsIGNvbHVtbnM6IGxvYWRlZENvbHVtbnN9fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdHlsZVVybHM6IFsnLi9zY3JvbGxlci5jc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdjbGFzcyc6ICdwLXNjcm9sbGVyLXZpZXdwb3J0IHAtZWxlbWVudCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGVyIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5faWQ7IH1cbiAgICBzZXQgaWQodmFsOiBzdHJpbmcpIHsgdGhpcy5faWQgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBzdHlsZSgpIHsgcmV0dXJuIHRoaXMuX3N0eWxlOyB9XG4gICAgc2V0IHN0eWxlKHZhbDogYW55KSB7IHRoaXMuX3N0eWxlID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgc3R5bGVDbGFzcygpIHsgcmV0dXJuIHRoaXMuX3N0eWxlQ2xhc3M7IH1cbiAgICBzZXQgc3R5bGVDbGFzcyh2YWw6IHN0cmluZykgeyB0aGlzLl9zdHlsZUNsYXNzID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgdGFiaW5kZXgoKSB7IHJldHVybiB0aGlzLl90YWJpbmRleDsgfVxuICAgIHNldCB0YWJpbmRleCh2YWw6IG51bWJlcikgeyB0aGlzLl90YWJpbmRleCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGl0ZW1zKCkgeyByZXR1cm4gdGhpcy5faXRlbXM7IH1cbiAgICBzZXQgaXRlbXModmFsOiBhbnlbXSkgeyB0aGlzLl9pdGVtcyA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5faXRlbVNpemU7IH1cbiAgICBzZXQgaXRlbVNpemUodmFsOiBhbnkpIHsgdGhpcy5faXRlbVNpemUgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBzY3JvbGxIZWlnaHQoKSB7IHJldHVybiB0aGlzLl9zY3JvbGxIZWlnaHQ7IH1cbiAgICBzZXQgc2Nyb2xsSGVpZ2h0KHZhbDogc3RyaW5nKSB7IHRoaXMuX3Njcm9sbEhlaWdodCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IHNjcm9sbFdpZHRoKCkgeyByZXR1cm4gdGhpcy5fc2Nyb2xsV2lkdGg7IH1cbiAgICBzZXQgc2Nyb2xsV2lkdGgodmFsOiBzdHJpbmcpIHsgdGhpcy5fc2Nyb2xsV2lkdGggPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBvcmllbnRhdGlvbigpIHsgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uOyB9XG4gICAgc2V0IG9yaWVudGF0aW9uKHZhbDogc3RyaW5nKSB7IHRoaXMuX29yaWVudGF0aW9uID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgZGVsYXkoKSB7IHJldHVybiB0aGlzLl9kZWxheTsgfVxuICAgIHNldCBkZWxheSh2YWw6IG51bWJlcikgeyB0aGlzLl9kZWxheSA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IHJlc2l6ZURlbGF5KCkgeyByZXR1cm4gdGhpcy5fcmVzaXplRGVsYXk7IH1cbiAgICBzZXQgcmVzaXplRGVsYXkodmFsOiBudW1iZXIpIHsgdGhpcy5fcmVzaXplRGVsYXkgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBsYXp5KCkgeyByZXR1cm4gdGhpcy5fbGF6eTsgfVxuICAgIHNldCBsYXp5KHZhbDogYm9vbGVhbikgeyB0aGlzLl9sYXp5ID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICAgIHNldCBkaXNhYmxlZCh2YWw6IGJvb2xlYW4pIHsgdGhpcy5fZGlzYWJsZWQgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBsb2FkZXJEaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2xvYWRlckRpc2FibGVkOyB9XG4gICAgc2V0IGxvYWRlckRpc2FibGVkKHZhbDogYm9vbGVhbikgeyB0aGlzLl9sb2FkZXJEaXNhYmxlZCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGNvbHVtbnMoKSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9XG4gICAgc2V0IGNvbHVtbnModmFsOiBhbnlbXSkgeyB0aGlzLl9jb2x1bW5zID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgc2hvd1NwYWNlcigpIHsgcmV0dXJuIHRoaXMuX3Nob3dTcGFjZXI7IH1cbiAgICBzZXQgc2hvd1NwYWNlcih2YWw6IGJvb2xlYW4pIHsgdGhpcy5fc2hvd1NwYWNlciA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IHNob3dMb2FkZXIoKSB7IHJldHVybiB0aGlzLl9zaG93TG9hZGVyOyB9XG4gICAgc2V0IHNob3dMb2FkZXIodmFsOiBib29sZWFuKSB7IHRoaXMuX3Nob3dMb2FkZXIgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBudW1Ub2xlcmF0ZWRJdGVtcygpIHsgcmV0dXJuIHRoaXMuX251bVRvbGVyYXRlZEl0ZW1zOyB9XG4gICAgc2V0IG51bVRvbGVyYXRlZEl0ZW1zKHZhbDogbnVtYmVyKSB7IHRoaXMuX251bVRvbGVyYXRlZEl0ZW1zID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgbG9hZGluZygpIHsgcmV0dXJuIHRoaXMuX2xvYWRpbmc7IH1cbiAgICBzZXQgbG9hZGluZyh2YWw6IGJvb2xlYW4pIHsgdGhpcy5fbG9hZGluZyA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGF1dG9TaXplKCkgeyByZXR1cm4gdGhpcy5fYXV0b1NpemU7IH1cbiAgICBzZXQgYXV0b1NpemUodmFsOiBib29sZWFuKSB7IHRoaXMuX2F1dG9TaXplID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgdHJhY2tCeSgpIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnk7IH1cbiAgICBzZXQgdHJhY2tCeSh2YWw6IGFueSkgeyB0aGlzLl90cmFja0J5ID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgb3B0aW9ucygpIHsgcmV0dXJuIHRoaXMuX29wdGlvbnM7IH1cbiAgICBzZXQgb3B0aW9ucyh2YWw6IFNjcm9sbGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdmFsO1xuXG4gICAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbCkuZm9yRWFjaCgoW2ssIHZdKSA9PiB0aGlzW2BfJHtrfWBdICE9PSB2ICYmICh0aGlzW2BfJHtrfWBdID0gdikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnZWxlbWVudCcpIGVsZW1lbnRWaWV3Q2hpbGQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdjb250ZW50JykgY29udGVudFZpZXdDaGlsZDogRWxlbWVudFJlZjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8YW55PjtcblxuICAgIEBPdXRwdXQoKSBvbkxhenlMb2FkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKSBvblNjcm9sbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KCkgb25TY3JvbGxJbmRleENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBfaWQ6IHN0cmluZztcblxuICAgIF9zdHlsZTogYW55O1xuXG4gICAgX3N0eWxlQ2xhc3M6IHN0cmluZztcblxuICAgIF90YWJpbmRleDogbnVtYmVyID0gMDtcblxuICAgIF9pdGVtczogYW55W107XG5cbiAgICBfaXRlbVNpemU6IGFueSA9IDA7XG5cbiAgICBfc2Nyb2xsSGVpZ2h0OiBzdHJpbmc7XG5cbiAgICBfc2Nyb2xsV2lkdGg6IHN0cmluZztcblxuICAgIF9vcmllbnRhdGlvbjogc3RyaW5nID0gJ3ZlcnRpY2FsJztcblxuICAgIF9kZWxheTogbnVtYmVyID0gMDtcblxuICAgIF9yZXNpemVEZWxheTogbnVtYmVyID0gMTA7XG5cbiAgICBfbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfbG9hZGVyRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF9jb2x1bW5zOiBhbnlbXTtcblxuICAgIF9zaG93U3BhY2VyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIF9zaG93TG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfbnVtVG9sZXJhdGVkSXRlbXM6IGFueTtcblxuICAgIF9sb2FkaW5nOiBib29sZWFuO1xuXG4gICAgX2F1dG9TaXplOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfdHJhY2tCeTogYW55O1xuXG4gICAgX29wdGlvbnM6IFNjcm9sbGVyT3B0aW9ucztcblxuICAgIGRfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZF9udW1Ub2xlcmF0ZWRJdGVtczogYW55O1xuXG4gICAgY29udGVudEVsOiBhbnk7XG5cbiAgICBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBsb2FkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGxvYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGZpcnN0OiBhbnkgPSAwO1xuXG4gICAgbGFzdDogYW55ID0gMDtcblxuICAgIG51bUl0ZW1zSW5WaWV3cG9ydDogYW55ID0gMDtcblxuICAgIGxhc3RTY3JvbGxQb3M6IGFueSA9IDA7XG5cbiAgICBsb2FkZXJBcnI6IGFueVtdID0gW107XG5cbiAgICBzcGFjZXJTdHlsZTogYW55ID0ge307XG5cbiAgICBjb250ZW50U3R5bGU6IGFueSA9IHt9O1xuXG4gICAgc2Nyb2xsVGltZW91dDogYW55O1xuXG4gICAgcmVzaXplVGltZW91dDogYW55O1xuXG4gICAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBhbnk7XG5cbiAgICBkZWZhdWx0V2lkdGg6IG51bWJlcjtcblxuICAgIGRlZmF1bHRIZWlnaHQ6IG51bWJlcjtcblxuICAgIGdldCB2ZXJ0aWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uID09PSAndmVydGljYWwnO1xuICAgIH1cblxuICAgIGdldCBob3Jpem9udGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICB9XG5cbiAgICBnZXQgYm90aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uID09PSAnYm90aCc7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRlZEl0ZW1zKCkge1xuICAgICAgICBpZiAodGhpcy5faXRlbXMgJiYgIXRoaXMuZF9sb2FkaW5nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ib3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSh0aGlzLmZpcnN0LnJvd3MsIHRoaXMubGFzdC5yb3dzKS5tYXAoaXRlbSA9PiB0aGlzLl9jb2x1bW5zID8gaXRlbSA6IGl0ZW0uc2xpY2UodGhpcy5maXJzdC5jb2xzLCB0aGlzLmxhc3QuY29scykpO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsICYmIHRoaXMuX2NvbHVtbnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSh0aGlzLmZpcnN0LCB0aGlzLmxhc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGdldCBsb2FkZWRSb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kX2xvYWRpbmcgPyAodGhpcy5fbG9hZGVyRGlzYWJsZWQgPyB0aGlzLmxvYWRlckFyciA6IFtdKSA6IHRoaXMubG9hZGVkSXRlbXM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRlZENvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb2x1bW5zICYmICh0aGlzLmJvdGggfHwgdGhpcy5ob3Jpem9udGFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZF9sb2FkaW5nICYmIHRoaXMuX2xvYWRlckRpc2FibGVkID9cbiAgICAgICAgICAgICAgICAodGhpcy5ib3RoID8gdGhpcy5sb2FkZXJBcnJbMF0gOiB0aGlzLmxvYWRlckFycikgOlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuc2xpY2UoKHRoaXMuYm90aCA/IHRoaXMuZmlyc3QuY29scyA6IHRoaXMuZmlyc3QpLCAodGhpcy5ib3RoID8gdGhpcy5sYXN0LmNvbHMgOiB0aGlzLmxhc3QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSB0aGlzLm9uV2luZG93UmVzaXplLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKHNpbXBsZUNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGxldCBhcmVJdGVtc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzaW1wbGVDaGFuZ2VzLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcmV2aW91c1ZhbHVlOiBwcmV2SXRlbXMsIGN1cnJlbnRWYWx1ZTogY3VycmVudEl0ZW1zIH0gPSBzaW1wbGVDaGFuZ2VzLml0ZW1zO1xuICAgICAgICAgICAgICAgIGFyZUl0ZW1zQ2hhbmdlZCA9ICFwcmV2SXRlbXMgfHwgcHJldkl0ZW1zLmxlbmd0aCAhPT0gKGN1cnJlbnRJdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc0NoYW5nZWQgPSAoYXJlSXRlbXNDaGFuZ2VkIHx8IHNpbXBsZUNoYW5nZXMuaXRlbVNpemUgfHwgc2ltcGxlQ2hhbmdlcy5zY3JvbGxIZWlnaHQgfHwgc2ltcGxlQ2hhbmdlcy5zY3JvbGxXaWR0aCk7XG4gICAgICAgICAgICBpc0NoYW5nZWQgJiYgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlcy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2Nyb2xsUG9zID0gdGhpcy5ib3RoID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlcy5sb2FkaW5nKSB7XG4gICAgICAgICAgICBjb25zdCB7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9ID0gc2ltcGxlQ2hhbmdlcy5sb2FkaW5nO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5ICYmIHByZXZpb3VzVmFsdWUgIT09IGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUgIT09IHRoaXMuZF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kX2xvYWRpbmcgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlcy5udW1Ub2xlcmF0ZWRJdGVtcykge1xuICAgICAgICAgICAgY29uc3QgeyBwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUgfSA9IHNpbXBsZUNoYW5nZXMubnVtVG9sZXJhdGVkSXRlbXM7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlICE9PSB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2ltcGxlQ2hhbmdlcy5vcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9ID0gc2ltcGxlQ2hhbmdlcy5vcHRpb25zO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5ICYmIHByZXZpb3VzVmFsdWU/LmxvYWRpbmcgIT09IGN1cnJlbnRWYWx1ZT8ubG9hZGluZyAmJiBjdXJyZW50VmFsdWU/LmxvYWRpbmcgIT09IHRoaXMuZF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kX2xvYWRpbmcgPSBjdXJyZW50VmFsdWUubG9hZGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWU/Lm51bVRvbGVyYXRlZEl0ZW1zICE9PSBjdXJyZW50VmFsdWU/Lm51bVRvbGVyYXRlZEl0ZW1zICYmIGN1cnJlbnRWYWx1ZT8ubnVtVG9sZXJhdGVkSXRlbXMgIT09IHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcyA9IGN1cnJlbnRWYWx1ZS5udW1Ub2xlcmF0ZWRJdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnaXRlbSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbVRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdsb2FkZXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdsb2FkZXJpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZXJJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbVRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50RWwodGhpcy5jb250ZW50RWwpO1xuICAgICAgICB0aGlzLmluaXQoKTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IERvbUhhbmRsZXIuZ2V0V2lkdGgodGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSBEb21IYW5kbGVyLmdldEhlaWdodCh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBdXRvU2l6ZSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcikge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcik7XG4gICAgICAgICAgICB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSgpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVPcHRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLnNldFNwYWNlclNpemUoKTtcblxuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb250ZW50RWwoZWw/OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRFbCA9IGVsIHx8IHRoaXMuY29udGVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCB8fCBEb21IYW5kbGVyLmZpbmRTaW5nbGUodGhpcy5lbGVtZW50Vmlld0NoaWxkPy5uYXRpdmVFbGVtZW50LCAnLnAtc2Nyb2xsZXItY29udGVudCcpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRoaXMuYm90aCA/IHsgcm93czogMCwgY29sczogMCB9IDogMDtcbiAgICAgICAgdGhpcy5sYXN0ID0gdGhpcy5ib3RoID8geyByb3dzOiAwLCBjb2xzOiAwIH0gOiAwO1xuICAgICAgICB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydCA9IHRoaXMuYm90aCA/IHsgcm93czogMCwgY29sczogMCB9IDogMDtcbiAgICAgICAgdGhpcy5sYXN0U2Nyb2xsUG9zID0gdGhpcy5ib3RoID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IDA7XG4gICAgICAgIHRoaXMuZF9sb2FkaW5nID0gdGhpcy5fbG9hZGluZyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zID0gdGhpcy5fbnVtVG9sZXJhdGVkSXRlbXM7XG4gICAgfVxuXG4gICAgZ2V0RWxlbWVudFJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFZpZXdDaGlsZDtcbiAgICB9XG5cbiAgICBzY3JvbGxUbyhvcHRpb25zOiBTY3JvbGxUb09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sYXN0U2Nyb2xsUG9zID0gdGhpcy5ib3RoID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IDA7XG4gICAgICAgIHRoaXMuZWxlbWVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsVG8ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgc2Nyb2xsVG9JbmRleChpbmRleDogbnVtYmVyLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSAnYXV0bycpIHtcbiAgICAgICAgY29uc3QgeyBudW1Ub2xlcmF0ZWRJdGVtcyB9ID0gdGhpcy5jYWxjdWxhdGVOdW1JdGVtcygpO1xuICAgICAgICBjb25zdCBjb250ZW50UG9zID0gdGhpcy5nZXRDb250ZW50UG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlRmlyc3QgPSAoX2luZGV4ID0gMCwgX251bVQpID0+IChfaW5kZXggPD0gX251bVQgPyAwIDogX2luZGV4KTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlQ29vcmQgPSAoX2ZpcnN0LCBfc2l6ZSwgX2Nwb3MpID0+IChfZmlyc3QgKiBfc2l6ZSkgKyBfY3BvcztcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG8gPSAobGVmdCA9IDAsIHRvcCA9IDApID0+IHRoaXMuc2Nyb2xsVG8oeyBsZWZ0LCB0b3AsIGJlaGF2aW9yIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmJvdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ZpcnN0ID0geyByb3dzOiBjYWxjdWxhdGVGaXJzdChpbmRleFswXSwgbnVtVG9sZXJhdGVkSXRlbXNbMF0pLCBjb2xzOiBjYWxjdWxhdGVGaXJzdChpbmRleFsxXSwgbnVtVG9sZXJhdGVkSXRlbXNbMV0pIH07XG4gICAgICAgICAgICBpZiAobmV3Rmlyc3Qucm93cyAhPT0gdGhpcy5maXJzdC5yb3dzIHx8IG5ld0ZpcnN0LmNvbHMgIT09IHRoaXMuZmlyc3QuY29scykge1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvKGNhbGN1bGF0ZUNvb3JkKG5ld0ZpcnN0LmNvbHMsIHRoaXMuX2l0ZW1TaXplWzFdLCBjb250ZW50UG9zLmxlZnQpLCBjYWxjdWxhdGVDb29yZChuZXdGaXJzdC5yb3dzLCB0aGlzLl9pdGVtU2l6ZVswXSwgY29udGVudFBvcy50b3ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ZpcnN0ID0gY2FsY3VsYXRlRmlyc3QoaW5kZXgsIG51bVRvbGVyYXRlZEl0ZW1zKTtcblxuICAgICAgICAgICAgaWYgKG5ld0ZpcnN0ICE9PSB0aGlzLmZpcnN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3Jpem9udGFsID8gc2Nyb2xsVG8oY2FsY3VsYXRlQ29vcmQobmV3Rmlyc3QsIHRoaXMuX2l0ZW1TaXplLCBjb250ZW50UG9zLmxlZnQpLCAwKSA6IHNjcm9sbFRvKDAsIGNhbGN1bGF0ZUNvb3JkKG5ld0ZpcnN0LCB0aGlzLl9pdGVtU2l6ZSwgY29udGVudFBvcy50b3ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjcm9sbEluVmlldyhpbmRleDogbnVtYmVyLCB0bzogU2Nyb2xsZXJUb1R5cGUsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdhdXRvJykge1xuICAgICAgICBpZiAodG8pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZmlyc3QsIHZpZXdwb3J0IH0gPSB0aGlzLmdldFJlbmRlcmVkUmFuZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvID0gKGxlZnQgPSAwLCB0b3AgPSAwKSA9PiB0aGlzLnNjcm9sbFRvKHsgbGVmdCwgdG9wLCBiZWhhdmlvciB9KTtcbiAgICAgICAgICAgIGNvbnN0IGlzVG9TdGFydCA9IHRvID09PSAndG8tc3RhcnQnO1xuICAgICAgICAgICAgY29uc3QgaXNUb0VuZCA9IHRvID09PSAndG8tZW5kJztcblxuICAgICAgICAgICAgaWYgKGlzVG9TdGFydCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0LmZpcnN0LnJvd3MgLSBmaXJzdC5yb3dzID4gaW5kZXhbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvKHZpZXdwb3J0LmZpcnN0LmNvbHMgKiB0aGlzLl9pdGVtU2l6ZVsxXSwgKHZpZXdwb3J0LmZpcnN0LnJvd3MgLSAxKSAqIHRoaXMuX2l0ZW1TaXplWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2aWV3cG9ydC5maXJzdC5jb2xzIC0gZmlyc3QuY29scyA+IGluZGV4WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUbygodmlld3BvcnQuZmlyc3QuY29scyAtIDEpICogdGhpcy5faXRlbVNpemVbMV0sIHZpZXdwb3J0LmZpcnN0LnJvd3MgKiB0aGlzLl9pdGVtU2l6ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydC5maXJzdCAtIGZpcnN0ID4gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9ICh2aWV3cG9ydC5maXJzdCAtIDEpICogdGhpcy5faXRlbVNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPyBzY3JvbGxUbyhwb3MsIDApIDogc2Nyb2xsVG8oMCwgcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVG9FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydC5sYXN0LnJvd3MgLSBmaXJzdC5yb3dzIDw9IGluZGV4WzBdICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG8odmlld3BvcnQuZmlyc3QuY29scyAqIHRoaXMuX2l0ZW1TaXplWzFdLCAodmlld3BvcnQuZmlyc3Qucm93cyArIDEpICogdGhpcy5faXRlbVNpemVbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpZXdwb3J0Lmxhc3QuY29scyAtIGZpcnN0LmNvbHMgPD0gaW5kZXhbMV0gKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUbygodmlld3BvcnQuZmlyc3QuY29scyArIDEpICogdGhpcy5faXRlbVNpemVbMV0sIHZpZXdwb3J0LmZpcnN0LnJvd3MgKiB0aGlzLl9pdGVtU2l6ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3cG9ydC5sYXN0IC0gZmlyc3QgPD0gaW5kZXggKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSAodmlld3BvcnQuZmlyc3QgKyAxKSAqIHRoaXMuX2l0ZW1TaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3Jpem9udGFsID8gc2Nyb2xsVG8ocG9zLCAwKSA6IHNjcm9sbFRvKDAsIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGJlaGF2aW9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJlbmRlcmVkUmFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUZpcnN0SW5WaWV3cG9ydCA9IChfcG9zLCBfc2l6ZSkgPT4gTWF0aC5mbG9vcihfcG9zIC8gKF9zaXplIHx8IF9wb3MpKTtcblxuICAgICAgICBsZXQgZmlyc3RJblZpZXdwb3J0ID0gdGhpcy5maXJzdDtcbiAgICAgICAgbGV0IGxhc3RJblZpZXdwb3J0OiBhbnkgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0gPSB0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYm90aCkge1xuICAgICAgICAgICAgICAgIGZpcnN0SW5WaWV3cG9ydCA9IHsgcm93czogY2FsY3VsYXRlRmlyc3RJblZpZXdwb3J0KHNjcm9sbFRvcCwgdGhpcy5faXRlbVNpemVbMF0pLCBjb2xzOiBjYWxjdWxhdGVGaXJzdEluVmlld3BvcnQoc2Nyb2xsTGVmdCwgdGhpcy5faXRlbVNpemVbMV0pIH07XG4gICAgICAgICAgICAgICAgbGFzdEluVmlld3BvcnQgPSB7IHJvd3M6IGZpcnN0SW5WaWV3cG9ydC5yb3dzICsgdGhpcy5udW1JdGVtc0luVmlld3BvcnQucm93cywgY29sczogZmlyc3RJblZpZXdwb3J0LmNvbHMgKyB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydC5jb2xzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxQb3MgPSB0aGlzLmhvcml6b250YWwgPyBzY3JvbGxMZWZ0IDogc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIGZpcnN0SW5WaWV3cG9ydCA9IGNhbGN1bGF0ZUZpcnN0SW5WaWV3cG9ydChzY3JvbGxQb3MsIHRoaXMuX2l0ZW1TaXplKTtcbiAgICAgICAgICAgICAgICBsYXN0SW5WaWV3cG9ydCA9IGZpcnN0SW5WaWV3cG9ydCArIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0OiB0aGlzLmZpcnN0LFxuICAgICAgICAgICAgbGFzdDogdGhpcy5sYXN0LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgICAgICBmaXJzdDogZmlyc3RJblZpZXdwb3J0LFxuICAgICAgICAgICAgICAgIGxhc3Q6IGxhc3RJblZpZXdwb3J0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjdWxhdGVOdW1JdGVtcygpIHtcbiAgICAgICAgY29uc3QgY29udGVudFBvcyA9IHRoaXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRoaXMuZWxlbWVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCA/IHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gY29udGVudFBvcy5sZWZ0IDogMDtcbiAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IHRoaXMuZWxlbWVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCA/IHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIGNvbnRlbnRQb3MudG9wIDogMDtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlTnVtSXRlbXNJblZpZXdwb3J0ID0gKF9jb250ZW50U2l6ZSwgX2l0ZW1TaXplKSA9PiBNYXRoLmNlaWwoX2NvbnRlbnRTaXplIC8gKF9pdGVtU2l6ZSB8fCBfY29udGVudFNpemUpKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlTnVtVG9sZXJhdGVkSXRlbXMgPSAoX251bUl0ZW1zKSA9PiBNYXRoLmNlaWwoX251bUl0ZW1zIC8gMik7XG4gICAgICAgIGNvbnN0IG51bUl0ZW1zSW5WaWV3cG9ydDogYW55ID0gdGhpcy5ib3RoID9cbiAgICAgICAgICAgIHsgcm93czogY2FsY3VsYXRlTnVtSXRlbXNJblZpZXdwb3J0KGNvbnRlbnRIZWlnaHQsIHRoaXMuX2l0ZW1TaXplWzBdKSwgY29sczogY2FsY3VsYXRlTnVtSXRlbXNJblZpZXdwb3J0KGNvbnRlbnRXaWR0aCwgdGhpcy5faXRlbVNpemVbMV0pIH0gOlxuICAgICAgICAgICAgY2FsY3VsYXRlTnVtSXRlbXNJblZpZXdwb3J0KCh0aGlzLmhvcml6b250YWwgPyBjb250ZW50V2lkdGggOiBjb250ZW50SGVpZ2h0KSwgdGhpcy5faXRlbVNpemUpO1xuXG4gICAgICAgIGNvbnN0IG51bVRvbGVyYXRlZEl0ZW1zID0gdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zIHx8ICh0aGlzLmJvdGggP1xuICAgICAgICAgICAgW2NhbGN1bGF0ZU51bVRvbGVyYXRlZEl0ZW1zKG51bUl0ZW1zSW5WaWV3cG9ydC5yb3dzKSwgY2FsY3VsYXRlTnVtVG9sZXJhdGVkSXRlbXMobnVtSXRlbXNJblZpZXdwb3J0LmNvbHMpXSA6XG4gICAgICAgICAgICBjYWxjdWxhdGVOdW1Ub2xlcmF0ZWRJdGVtcyhudW1JdGVtc0luVmlld3BvcnQpKTtcblxuICAgICAgICByZXR1cm4geyBudW1JdGVtc0luVmlld3BvcnQsIG51bVRvbGVyYXRlZEl0ZW1zIH07XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3QgeyBudW1JdGVtc0luVmlld3BvcnQsIG51bVRvbGVyYXRlZEl0ZW1zIH0gPSB0aGlzLmNhbGN1bGF0ZU51bUl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUxhc3QgPSAoX2ZpcnN0LCBfbnVtLCBfbnVtVCwgX2lzQ29scyA9IGZhbHNlKSA9PiB0aGlzLmdldExhc3QoX2ZpcnN0ICsgX251bSArICgoX2ZpcnN0IDwgX251bVQgPyAyIDogMykgKiBfbnVtVCksIF9pc0NvbHMpO1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZmlyc3Q7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJvdGggP1xuICAgICAgICAgICAgeyByb3dzOiBjYWxjdWxhdGVMYXN0KHRoaXMuZmlyc3Qucm93cywgbnVtSXRlbXNJblZpZXdwb3J0LnJvd3MsIG51bVRvbGVyYXRlZEl0ZW1zWzBdKSwgY29sczogY2FsY3VsYXRlTGFzdCh0aGlzLmZpcnN0LmNvbHMsIG51bUl0ZW1zSW5WaWV3cG9ydC5jb2xzLCBudW1Ub2xlcmF0ZWRJdGVtc1sxXSwgdHJ1ZSkgfSA6XG4gICAgICAgICAgICBjYWxjdWxhdGVMYXN0KHRoaXMuZmlyc3QsIG51bUl0ZW1zSW5WaWV3cG9ydCwgbnVtVG9sZXJhdGVkSXRlbXMpO1xuXG4gICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7XG4gICAgICAgIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0ID0gbnVtSXRlbXNJblZpZXdwb3J0O1xuICAgICAgICB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMgPSBudW1Ub2xlcmF0ZWRJdGVtcztcblxuICAgICAgICBpZiAodGhpcy5zaG93TG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlckFyciA9IHRoaXMuYm90aCA/XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtSXRlbXNJblZpZXdwb3J0LnJvd3MgfSkubWFwKCgpID0+IEFycmF5LmZyb20oeyBsZW5ndGg6IG51bUl0ZW1zSW5WaWV3cG9ydC5jb2xzIH0pKSA6XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtSXRlbXNJblZpZXdwb3J0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhenkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKCdvbkxhenlMb2FkJywgeyBmaXJzdCwgbGFzdCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbGN1bGF0ZUF1dG9TaXplKCkge1xuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemUgJiYgIXRoaXMuZF9sb2FkaW5nKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50RWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RWwuc3R5bGUubWluSGVpZ2h0ID0gdGhpcy5jb250ZW50RWwuc3R5bGUubWluV2lkdGggPSAnYXV0byc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0IH0gPSB0aGlzLmNvbnRlbnRFbDtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcy5ib3RoIHx8IHRoaXMuaG9yaXpvbnRhbCkgJiYgKHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gKG9mZnNldFdpZHRoIDwgdGhpcy5kZWZhdWx0V2lkdGggPyBvZmZzZXRXaWR0aCA6IHRoaXMuZGVmYXVsdFdpZHRoKSArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ib3RoIHx8IHRoaXMudmVydGljYWwpICYmICh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAob2Zmc2V0SGVpZ2h0IDwgdGhpcy5kZWZhdWx0SGVpZ2h0ID8gb2Zmc2V0SGVpZ2h0IDogdGhpcy5kZWZhdWx0SGVpZ2h0KSArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLmNvbnRlbnRFbC5zdHlsZS5taW5XaWR0aCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGFzdChsYXN0ID0gMCwgaXNDb2xzID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zID8gTWF0aC5taW4oKGlzQ29scyA/ICh0aGlzLl9jb2x1bW5zIHx8IHRoaXMuX2l0ZW1zWzBdKS5sZW5ndGggOiB0aGlzLl9pdGVtcy5sZW5ndGgpLCBsYXN0KSA6IDA7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRlbnRFbCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArIE1hdGgubWF4KHBhcnNlSW50KHN0eWxlLmxlZnQsIDEwKSwgMCk7XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApICsgTWF0aC5tYXgocGFyc2VJbnQoc3R5bGUucmlnaHQsIDEwKSwgMCk7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgKyBNYXRoLm1heChwYXJzZUludChzdHlsZS50b3AsIDEwKSwgMCk7XG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBwYXJzZUludChzdHlsZS5wYWRkaW5nQm90dG9tLCAxMCkgKyBNYXRoLm1heChwYXJzZUludChzdHlsZS5ib3R0b20sIDEwKSwgMCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgeDogbGVmdCArIHJpZ2h0LCB5OiB0b3AgKyBib3R0b20gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGxlZnQ6IDAsIHJpZ2h0OiAwLCB0b3A6IDAsIGJvdHRvbTogMCwgeDogMCwgeTogMCB9O1xuICAgIH1cblxuICAgIHNldFNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX3Njcm9sbFdpZHRoIHx8IGAkeyh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCBwYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoKX1weGA7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9zY3JvbGxIZWlnaHQgfHwgYCR7KHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCB8fCBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCl9cHhgO1xuICAgICAgICAgICAgY29uc3Qgc2V0UHJvcCA9IChfbmFtZSwgX3ZhbHVlKSA9PiB0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5zdHlsZVtfbmFtZV0gPSBfdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJvdGggfHwgdGhpcy5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJvcCgnaGVpZ2h0JywgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBzZXRQcm9wKCd3aWR0aCcsIHdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFByb3AoJ2hlaWdodCcsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTcGFjZXJTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5faXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb3MgPSB0aGlzLmdldENvbnRlbnRQb3NpdGlvbigpO1xuICAgICAgICAgICAgY29uc3Qgc2V0UHJvcCA9IChfbmFtZSwgX3ZhbHVlLCBfc2l6ZSwgX2Nwb3MgPSAwKSA9PiB0aGlzLnNwYWNlclN0eWxlID0geyAuLi50aGlzLnNwYWNlclN0eWxlLCAuLi57IFtgJHtfbmFtZX1gXTogKCgoX3ZhbHVlIHx8IFtdKS5sZW5ndGggKiBfc2l6ZSkgKyBfY3BvcykgKyAncHgnIH0gfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYm90aCkge1xuICAgICAgICAgICAgICAgIHNldFByb3AoJ2hlaWdodCcsIHRoaXMuX2l0ZW1zLCB0aGlzLl9pdGVtU2l6ZVswXSwgY29udGVudFBvcy55KTtcbiAgICAgICAgICAgICAgICBzZXRQcm9wKCd3aWR0aCcsICh0aGlzLl9jb2x1bW5zIHx8IHRoaXMuX2l0ZW1zWzFdKSwgdGhpcy5faXRlbVNpemVbMV0sIGNvbnRlbnRQb3MueCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPyBzZXRQcm9wKCd3aWR0aCcsICh0aGlzLl9jb2x1bW5zIHx8IHRoaXMuX2l0ZW1zKSwgdGhpcy5faXRlbVNpemUsIGNvbnRlbnRQb3MueCkgOiBzZXRQcm9wKCdoZWlnaHQnLCB0aGlzLl9pdGVtcywgdGhpcy5faXRlbVNpemUsIGNvbnRlbnRQb3MueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb250ZW50UG9zaXRpb24ocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRFbCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBwb3MgPyBwb3MuZmlyc3QgOiB0aGlzLmZpcnN0O1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlVHJhbnNsYXRlVmFsID0gKF9maXJzdCwgX3NpemUpID0+IChfZmlyc3QgKiBfc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBzZXRUcmFuc2Zvcm0gPSAoX3ggPSAwLCBfeSA9IDApID0+IHRoaXMuY29udGVudFN0eWxlID0geyAuLi50aGlzLmNvbnRlbnRTdHlsZSwgLi4ueyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke194fXB4LCAke195fXB4LCAwKWAgfSB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNmb3JtKGNhbGN1bGF0ZVRyYW5zbGF0ZVZhbChmaXJzdC5jb2xzLCB0aGlzLl9pdGVtU2l6ZVsxXSksIGNhbGN1bGF0ZVRyYW5zbGF0ZVZhbChmaXJzdC5yb3dzLCB0aGlzLl9pdGVtU2l6ZVswXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlVmFsID0gY2FsY3VsYXRlVHJhbnNsYXRlVmFsKGZpcnN0LCB0aGlzLl9pdGVtU2l6ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3Jpem9udGFsID8gc2V0VHJhbnNmb3JtKHRyYW5zbGF0ZVZhbCwgMCkgOiBzZXRUcmFuc2Zvcm0oMCwgdHJhbnNsYXRlVmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2Nyb2xsUG9zaXRpb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBjb250ZW50UG9zID0gdGhpcy5nZXRDb250ZW50UG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlU2Nyb2xsUG9zID0gKF9wb3MsIF9jcG9zKSA9PiBfcG9zID8gKF9wb3MgPiBfY3BvcyA/IF9wb3MgLSBfY3BvcyA6IF9wb3MpIDogMDtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlQ3VycmVudEluZGV4ID0gKF9wb3MsIF9zaXplKSA9PiBNYXRoLmZsb29yKF9wb3MgLyAoX3NpemUgfHwgX3BvcykpO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVUcmlnZ2VySW5kZXggPSAoX2N1cnJlbnRJbmRleCwgX2ZpcnN0LCBfbGFzdCwgX251bSwgX251bVQsIF9pc1Njcm9sbERvd25PclJpZ2h0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKF9jdXJyZW50SW5kZXggPD0gX251bVQgPyBfbnVtVCA6IChfaXNTY3JvbGxEb3duT3JSaWdodCA/IChfbGFzdCAtIF9udW0gLSBfbnVtVCkgOiAoX2ZpcnN0ICsgX251bVQgLSAxKSkpXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUZpcnN0ID0gKF9jdXJyZW50SW5kZXgsIF90cmlnZ2VySW5kZXgsIF9maXJzdCwgX2xhc3QsIF9udW0sIF9udW1ULCBfaXNTY3JvbGxEb3duT3JSaWdodCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9jdXJyZW50SW5kZXggPD0gX251bVQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIF9pc1Njcm9sbERvd25PclJpZ2h0ID9cbiAgICAgICAgICAgICAgICAgICAgKF9jdXJyZW50SW5kZXggPCBfdHJpZ2dlckluZGV4ID8gX2ZpcnN0IDogX2N1cnJlbnRJbmRleCAtIF9udW1UKSA6XG4gICAgICAgICAgICAgICAgICAgIChfY3VycmVudEluZGV4ID4gX3RyaWdnZXJJbmRleCA/IF9maXJzdCA6IF9jdXJyZW50SW5kZXggLSAoMiAqIF9udW1UKSkpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVMYXN0ID0gKF9jdXJyZW50SW5kZXgsIF9maXJzdCwgX2xhc3QsIF9udW0sIF9udW1ULCBfaXNDb2xzID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgIGxldCBsYXN0VmFsdWUgPSBfZmlyc3QgKyBfbnVtICsgKDIgKiBfbnVtVCk7XG5cbiAgICAgICAgICAgIGlmIChfY3VycmVudEluZGV4ID49IF9udW1UKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZhbHVlICs9IChfbnVtVCArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXN0KGxhc3RWYWx1ZSwgX2lzQ29scyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gY2FsY3VsYXRlU2Nyb2xsUG9zKHRhcmdldC5zY3JvbGxUb3AsIGNvbnRlbnRQb3MudG9wKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGNhbGN1bGF0ZVNjcm9sbFBvcyh0YXJnZXQuc2Nyb2xsTGVmdCwgY29udGVudFBvcy5sZWZ0KTtcblxuICAgICAgICBsZXQgbmV3Rmlyc3QgPSB0aGlzLmJvdGggPyB7IHJvd3M6IDAsIGNvbHM6IDAgfSA6IDA7XG4gICAgICAgIGxldCBuZXdMYXN0ID0gdGhpcy5sYXN0O1xuICAgICAgICBsZXQgaXNSYW5nZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5ld1Njcm9sbFBvcyA9IHRoaXMubGFzdFNjcm9sbFBvcztcblxuICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICBjb25zdCBpc1Njcm9sbERvd24gPSB0aGlzLmxhc3RTY3JvbGxQb3MudG9wIDw9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGlzU2Nyb2xsUmlnaHQgPSB0aGlzLmxhc3RTY3JvbGxQb3MubGVmdCA8PSBzY3JvbGxMZWZ0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0geyByb3dzOiBjYWxjdWxhdGVDdXJyZW50SW5kZXgoc2Nyb2xsVG9wLCB0aGlzLl9pdGVtU2l6ZVswXSksIGNvbHM6IGNhbGN1bGF0ZUN1cnJlbnRJbmRleChzY3JvbGxMZWZ0LCB0aGlzLl9pdGVtU2l6ZVsxXSkgfTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJJbmRleCA9IHtcbiAgICAgICAgICAgICAgICByb3dzOiBjYWxjdWxhdGVUcmlnZ2VySW5kZXgoY3VycmVudEluZGV4LnJvd3MsIHRoaXMuZmlyc3Qucm93cywgdGhpcy5sYXN0LnJvd3MsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LnJvd3MsIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtc1swXSwgaXNTY3JvbGxEb3duKSxcbiAgICAgICAgICAgICAgICBjb2xzOiBjYWxjdWxhdGVUcmlnZ2VySW5kZXgoY3VycmVudEluZGV4LmNvbHMsIHRoaXMuZmlyc3QuY29scywgdGhpcy5sYXN0LmNvbHMsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LmNvbHMsIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtc1sxXSwgaXNTY3JvbGxSaWdodClcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5ld0ZpcnN0ID0ge1xuICAgICAgICAgICAgICAgIHJvd3M6IGNhbGN1bGF0ZUZpcnN0KGN1cnJlbnRJbmRleC5yb3dzLCB0cmlnZ2VySW5kZXgucm93cywgdGhpcy5maXJzdC5yb3dzLCB0aGlzLmxhc3Qucm93cywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQucm93cywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzBdLCBpc1Njcm9sbERvd24pLFxuICAgICAgICAgICAgICAgIGNvbHM6IGNhbGN1bGF0ZUZpcnN0KGN1cnJlbnRJbmRleC5jb2xzLCB0cmlnZ2VySW5kZXguY29scywgdGhpcy5maXJzdC5jb2xzLCB0aGlzLmxhc3QuY29scywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQuY29scywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzFdLCBpc1Njcm9sbFJpZ2h0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSB7XG4gICAgICAgICAgICAgICAgcm93czogY2FsY3VsYXRlTGFzdChjdXJyZW50SW5kZXgucm93cywgbmV3Rmlyc3Qucm93cywgdGhpcy5sYXN0LnJvd3MsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LnJvd3MsIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtc1swXSksXG4gICAgICAgICAgICAgICAgY29sczogY2FsY3VsYXRlTGFzdChjdXJyZW50SW5kZXguY29scywgbmV3Rmlyc3QuY29scywgdGhpcy5sYXN0LmNvbHMsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LmNvbHMsIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtc1sxXSwgdHJ1ZSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlzUmFuZ2VDaGFuZ2VkID0gKG5ld0ZpcnN0LnJvd3MgIT09IHRoaXMuZmlyc3Qucm93cyB8fCBuZXdMYXN0LnJvd3MgIT09IHRoaXMubGFzdC5yb3dzKSB8fCAobmV3Rmlyc3QuY29scyAhPT0gdGhpcy5maXJzdC5jb2xzIHx8IG5ld0xhc3QuY29scyAhPT0gdGhpcy5sYXN0LmNvbHMpO1xuICAgICAgICAgICAgbmV3U2Nyb2xsUG9zID0geyB0b3A6IHNjcm9sbFRvcCwgbGVmdDogc2Nyb2xsTGVmdCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5ob3Jpem9udGFsID8gc2Nyb2xsTGVmdCA6IHNjcm9sbFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGlzU2Nyb2xsRG93bk9yUmlnaHQgPSB0aGlzLmxhc3RTY3JvbGxQb3MgPD0gc2Nyb2xsUG9zO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY2FsY3VsYXRlQ3VycmVudEluZGV4KHNjcm9sbFBvcywgdGhpcy5faXRlbVNpemUpO1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlckluZGV4ID0gY2FsY3VsYXRlVHJpZ2dlckluZGV4KGN1cnJlbnRJbmRleCwgdGhpcy5maXJzdCwgdGhpcy5sYXN0LCB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydCwgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zLCBpc1Njcm9sbERvd25PclJpZ2h0KTtcblxuICAgICAgICAgICAgbmV3Rmlyc3QgPSBjYWxjdWxhdGVGaXJzdChjdXJyZW50SW5kZXgsIHRyaWdnZXJJbmRleCwgdGhpcy5maXJzdCwgdGhpcy5sYXN0LCB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydCwgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zLCBpc1Njcm9sbERvd25PclJpZ2h0KTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSBjYWxjdWxhdGVMYXN0KGN1cnJlbnRJbmRleCwgbmV3Rmlyc3QsIHRoaXMubGFzdCwgdGhpcy5udW1JdGVtc0luVmlld3BvcnQsIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcyk7XG4gICAgICAgICAgICBpc1JhbmdlQ2hhbmdlZCA9IG5ld0ZpcnN0ICE9PSB0aGlzLmZpcnN0IHx8IG5ld0xhc3QgIT09IHRoaXMubGFzdDtcbiAgICAgICAgICAgIG5ld1Njcm9sbFBvcyA9IHNjcm9sbFBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaXJzdDogbmV3Rmlyc3QsXG4gICAgICAgICAgICBsYXN0OiBuZXdMYXN0LFxuICAgICAgICAgICAgaXNSYW5nZUNoYW5nZWQsXG4gICAgICAgICAgICBzY3JvbGxQb3M6IG5ld1Njcm9sbFBvc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TY3JvbGxDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBmaXJzdCwgbGFzdCwgaXNSYW5nZUNoYW5nZWQsIHNjcm9sbFBvcyB9ID0gdGhpcy5vblNjcm9sbFBvc2l0aW9uQ2hhbmdlKGV2ZW50KTtcblxuICAgICAgICBpZiAoaXNSYW5nZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0geyBmaXJzdCwgbGFzdCB9O1xuXG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRQb3NpdGlvbihuZXdTdGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSBzY3JvbGxQb3M7XG5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKCdvblNjcm9sbEluZGV4Q2hhbmdlJywgbmV3U3RhdGUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fbGF6eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKCdvbkxhenlMb2FkJywgbmV3U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Db250YWluZXJTY3JvbGwoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoJ29uU2Nyb2xsJywgeyBvcmlnaW5hbEV2ZW50OiBldmVudCB9KTtcblxuICAgICAgICBpZiAodGhpcy5fZGVsYXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmRfbG9hZGluZyAmJiB0aGlzLnNob3dMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGlzUmFuZ2VDaGFuZ2VkOiBjaGFuZ2VkIH0gPSB0aGlzLm9uU2Nyb2xsUG9zaXRpb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZF9sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2UoZXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZF9sb2FkaW5nICYmIHRoaXMuc2hvd0xvYWRlciAmJiAoIXRoaXMuX2xhenkgfHwgdGhpcy5fbG9hZGluZyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRfbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMuX2RlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25XaW5kb3dSZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Vmlld0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gW0RvbUhhbmRsZXIuZ2V0V2lkdGgodGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQpLCBEb21IYW5kbGVyLmdldEhlaWdodCh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtpc0RpZmZXaWR0aCwgaXNEaWZmSGVpZ2h0XSA9IFt3aWR0aCAhPT0gdGhpcy5kZWZhdWx0V2lkdGgsIGhlaWdodCAhPT0gdGhpcy5kZWZhdWx0SGVpZ2h0XTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWluaXQgPSB0aGlzLmJvdGggPyAoaXNEaWZmV2lkdGggfHwgaXNEaWZmSGVpZ2h0KSA6ICh0aGlzLmhvcml6b250YWwgPyBpc0RpZmZXaWR0aCA6ICh0aGlzLnZlcnRpY2FsID8gaXNEaWZmSGVpZ2h0IDogZmFsc2UpKTtcblxuICAgICAgICAgICAgICAgIHJlaW5pdCAmJiB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zID0gdGhpcy5fbnVtVG9sZXJhdGVkSXRlbXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fcmVzaXplRGVsYXkpO1xuICAgIH1cblxuICAgIGhhbmRsZUV2ZW50cyhuYW1lLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbbmFtZV0gPyB0aGlzLm9wdGlvbnNbbmFtZV0ocGFyYW1zKSA6IHRoaXNbbmFtZV0uZW1pdChwYXJhbXMpO1xuICAgIH1cblxuICAgIGdldENvbnRlbnRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudFN0eWxlQ2xhc3M6IGBwLXNjcm9sbGVyLWNvbnRlbnQgJHt0aGlzLmRfbG9hZGluZyA/ICdwLXNjcm9sbGVyLWxvYWRpbmcnIDogJyd9YCxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmxvYWRlZEl0ZW1zLFxuICAgICAgICAgICAgZ2V0SXRlbU9wdGlvbnM6IChpbmRleCkgPT4gdGhpcy5nZXRPcHRpb25zKGluZGV4KSxcbiAgICAgICAgICAgIGxvYWRpbmc6IHRoaXMuZF9sb2FkaW5nLFxuICAgICAgICAgICAgZ2V0TG9hZGVyT3B0aW9uczogKGluZGV4LCBvcHRpb25zPykgPT4gdGhpcy5nZXRMb2FkZXJPcHRpb25zKGluZGV4LCBvcHRpb25zKSxcbiAgICAgICAgICAgIGl0ZW1TaXplOiB0aGlzLl9pdGVtU2l6ZSxcbiAgICAgICAgICAgIHJvd3M6IHRoaXMubG9hZGVkUm93cyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMubG9hZGVkQ29sdW1ucyxcbiAgICAgICAgICAgIHNwYWNlclN0eWxlOiB0aGlzLnNwYWNlclN0eWxlLFxuICAgICAgICAgICAgY29udGVudFN0eWxlOiB0aGlzLmNvbnRlbnRTdHlsZSxcbiAgICAgICAgICAgIHZlcnRpY2FsOiB0aGlzLnZlcnRpY2FsLFxuICAgICAgICAgICAgaG9yaXpvbnRhbDogdGhpcy5ob3Jpem9udGFsLFxuICAgICAgICAgICAgYm90aDogdGhpcy5ib3RoXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPcHRpb25zKHJlbmRlcmVkSW5kZXgpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSAodGhpcy5faXRlbXMgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmJvdGggPyB0aGlzLmZpcnN0LnJvd3MgKyByZW5kZXJlZEluZGV4IDogdGhpcy5maXJzdCArIHJlbmRlcmVkSW5kZXg7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICBmaXJzdDogaW5kZXggPT09IDAsXG4gICAgICAgICAgICBsYXN0OiBpbmRleCA9PT0gKGNvdW50IC0gMSksXG4gICAgICAgICAgICBldmVuOiBpbmRleCAlIDIgPT09IDAsXG4gICAgICAgICAgICBvZGQ6IGluZGV4ICUgMiAhPT0gMFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TG9hZGVyT3B0aW9ucyhpbmRleCwgZXh0T3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMubG9hZGVyQXJyLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgIGZpcnN0OiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgIGxhc3Q6IGluZGV4ID09PSAoY291bnQgLSAxKSxcbiAgICAgICAgICAgIGV2ZW46IGluZGV4ICUgMiA9PT0gMCxcbiAgICAgICAgICAgIG9kZDogaW5kZXggJSAyICE9PSAwLFxuICAgICAgICAgICAgLi4uZXh0T3B0aW9uc1xuICAgICAgICB9XG4gICAgfVxufVxuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIGV4cG9ydHM6IFtTY3JvbGxlcl0sXG4gICAgZGVjbGFyYXRpb25zOiBbU2Nyb2xsZXJdXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGVyTW9kdWxlIHsgfVxuIl19