@coreui/angular-pro 5.1.0-next.0 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +1 -1
  2. package/esm2022/lib/accordion/accordion/accordion.component.mjs +4 -4
  3. package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +4 -4
  4. package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +4 -4
  5. package/esm2022/lib/accordion/accordion.module.mjs +5 -5
  6. package/esm2022/lib/accordion/accordion.service.mjs +4 -4
  7. package/esm2022/lib/alert/alert-heading.directive.mjs +4 -4
  8. package/esm2022/lib/alert/alert-link.directive.mjs +4 -4
  9. package/esm2022/lib/alert/alert.component.mjs +4 -4
  10. package/esm2022/lib/alert/alert.module.mjs +5 -5
  11. package/esm2022/lib/avatar/avatar.component.mjs +4 -4
  12. package/esm2022/lib/avatar/avatar.module.mjs +5 -5
  13. package/esm2022/lib/backdrop/backdrop.service.mjs +4 -4
  14. package/esm2022/lib/badge/badge.component.mjs +4 -4
  15. package/esm2022/lib/badge/badge.module.mjs +5 -5
  16. package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +4 -4
  17. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +4 -4
  18. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +4 -4
  19. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +4 -4
  20. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +5 -5
  21. package/esm2022/lib/button/button-close.directive.mjs +4 -4
  22. package/esm2022/lib/button/button.directive.mjs +4 -4
  23. package/esm2022/lib/button/button.module.mjs +5 -5
  24. package/esm2022/lib/button-group/button-group/button-group.component.mjs +4 -4
  25. package/esm2022/lib/button-group/button-group.module.mjs +5 -5
  26. package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +4 -4
  27. package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +4 -4
  28. package/esm2022/lib/calendar/calendar/calendar.component.mjs +4 -4
  29. package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +4 -4
  30. package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +4 -4
  31. package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +4 -4
  32. package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +4 -4
  33. package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +4 -4
  34. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +4 -4
  35. package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +4 -4
  36. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +4 -4
  37. package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +4 -4
  38. package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +4 -4
  39. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +4 -4
  40. package/esm2022/lib/calendar/calendar.module.mjs +5 -5
  41. package/esm2022/lib/calendar/calendar.service.mjs +4 -4
  42. package/esm2022/lib/callout/callout.component.mjs +4 -4
  43. package/esm2022/lib/callout/callout.module.mjs +5 -5
  44. package/esm2022/lib/card/card-body.component.mjs +4 -4
  45. package/esm2022/lib/card/card-footer.component.mjs +4 -4
  46. package/esm2022/lib/card/card-group.component.mjs +4 -4
  47. package/esm2022/lib/card/card-header-actions.component.mjs +4 -4
  48. package/esm2022/lib/card/card-header.component.mjs +4 -4
  49. package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +4 -4
  50. package/esm2022/lib/card/card-img.directive.mjs +4 -4
  51. package/esm2022/lib/card/card-link.directive.mjs +4 -4
  52. package/esm2022/lib/card/card-subtitle.directive.mjs +4 -4
  53. package/esm2022/lib/card/card-text.directive.mjs +4 -4
  54. package/esm2022/lib/card/card-title.directive.mjs +4 -4
  55. package/esm2022/lib/card/card.component.mjs +4 -4
  56. package/esm2022/lib/card/card.module.mjs +5 -5
  57. package/esm2022/lib/carousel/carousel/carousel.component.mjs +4 -4
  58. package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +4 -4
  59. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +4 -4
  60. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +4 -4
  61. package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +4 -4
  62. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +4 -4
  63. package/esm2022/lib/carousel/carousel-state.mjs +4 -4
  64. package/esm2022/lib/carousel/carousel.config.mjs +4 -4
  65. package/esm2022/lib/carousel/carousel.module.mjs +5 -5
  66. package/esm2022/lib/carousel/carousel.service.mjs +4 -4
  67. package/esm2022/lib/collapse/collapse.directive.mjs +4 -4
  68. package/esm2022/lib/collapse/collapse.module.mjs +5 -5
  69. package/esm2022/lib/coreui.types.mjs +1 -1
  70. package/esm2022/lib/date-picker/date-picker.component.mjs +4 -4
  71. package/esm2022/lib/date-picker/date-picker.module.mjs +5 -5
  72. package/esm2022/lib/date-range-picker/date-range-picker/custom-range-key.pipe.mjs +4 -4
  73. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +4 -4
  74. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +5 -5
  75. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +50 -33
  76. package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +4 -4
  77. package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +4 -4
  78. package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +4 -4
  79. package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +4 -4
  80. package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +4 -4
  81. package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +4 -4
  82. package/esm2022/lib/dropdown/dropdown.module.mjs +5 -5
  83. package/esm2022/lib/dropdown/dropdown.service.mjs +4 -4
  84. package/esm2022/lib/element-cover/element-cover.component.mjs +4 -4
  85. package/esm2022/lib/element-cover/element-cover.module.mjs +5 -5
  86. package/esm2022/lib/footer/footer.component.mjs +4 -4
  87. package/esm2022/lib/footer/footer.module.mjs +5 -5
  88. package/esm2022/lib/form/form/form.directive.mjs +4 -4
  89. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +4 -4
  90. package/esm2022/lib/form/form-check/form-check-label.directive.mjs +4 -4
  91. package/esm2022/lib/form/form-check/form-check.component.mjs +4 -4
  92. package/esm2022/lib/form/form-control/form-control.directive.mjs +4 -4
  93. package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +4 -4
  94. package/esm2022/lib/form/form-floating/form-floating.directive.mjs +4 -4
  95. package/esm2022/lib/form/form-label/form-label.directive.mjs +4 -4
  96. package/esm2022/lib/form/form-select/form-select.directive.mjs +4 -4
  97. package/esm2022/lib/form/form-text/form-text.directive.mjs +4 -4
  98. package/esm2022/lib/form/form.module.mjs +5 -5
  99. package/esm2022/lib/form/input-group/input-group.component.mjs +4 -4
  100. package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +4 -4
  101. package/esm2022/lib/grid/col.component.mjs +4 -4
  102. package/esm2022/lib/grid/col.directive.mjs +4 -4
  103. package/esm2022/lib/grid/container.component.mjs +4 -4
  104. package/esm2022/lib/grid/grid.module.mjs +5 -5
  105. package/esm2022/lib/grid/gutter.directive.mjs +4 -4
  106. package/esm2022/lib/grid/row.component.mjs +4 -4
  107. package/esm2022/lib/grid/row.directive.mjs +4 -4
  108. package/esm2022/lib/header/header/header.component.mjs +4 -4
  109. package/esm2022/lib/header/header-brand/header-brand.component.mjs +4 -4
  110. package/esm2022/lib/header/header-divider/header-divider.component.mjs +4 -4
  111. package/esm2022/lib/header/header-nav/header-nav.component.mjs +4 -4
  112. package/esm2022/lib/header/header-text/header-text.component.mjs +4 -4
  113. package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +4 -4
  114. package/esm2022/lib/header/header.module.mjs +5 -5
  115. package/esm2022/lib/image/img.directive.mjs +4 -4
  116. package/esm2022/lib/image/img.module.mjs +5 -5
  117. package/esm2022/lib/list-group/list-group-item.directive.mjs +4 -4
  118. package/esm2022/lib/list-group/list-group.directive.mjs +4 -4
  119. package/esm2022/lib/list-group/list-group.module.mjs +5 -5
  120. package/esm2022/lib/loading-button/loading-button.component.mjs +4 -4
  121. package/esm2022/lib/loading-button/loading-button.module.mjs +5 -5
  122. package/esm2022/lib/modal/modal/modal.component.mjs +4 -4
  123. package/esm2022/lib/modal/modal-body/modal-body.component.mjs +4 -4
  124. package/esm2022/lib/modal/modal-content/modal-content.component.mjs +4 -4
  125. package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +4 -4
  126. package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +4 -4
  127. package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +4 -4
  128. package/esm2022/lib/modal/modal-header/modal-header.component.mjs +4 -4
  129. package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +4 -4
  130. package/esm2022/lib/modal/modal.module.mjs +5 -5
  131. package/esm2022/lib/modal/modal.service.mjs +4 -4
  132. package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +4 -4
  133. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +4 -4
  134. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +4 -4
  135. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +4 -4
  136. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +4 -4
  137. package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +4 -4
  138. package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +4 -4
  139. package/esm2022/lib/multi-select/multi-select.module.mjs +5 -5
  140. package/esm2022/lib/multi-select/multi-select.service.mjs +4 -4
  141. package/esm2022/lib/nav/nav-item.component.mjs +4 -4
  142. package/esm2022/lib/nav/nav-link.directive.mjs +4 -4
  143. package/esm2022/lib/nav/nav.component.mjs +4 -4
  144. package/esm2022/lib/nav/nav.module.mjs +5 -5
  145. package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +4 -4
  146. package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +4 -4
  147. package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +4 -4
  148. package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +4 -4
  149. package/esm2022/lib/navbar/navbar.component.mjs +4 -4
  150. package/esm2022/lib/navbar/navbar.module.mjs +5 -5
  151. package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +4 -4
  152. package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +4 -4
  153. package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +4 -4
  154. package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +4 -4
  155. package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +4 -4
  156. package/esm2022/lib/offcanvas/offcanvas.module.mjs +5 -5
  157. package/esm2022/lib/offcanvas/offcanvas.service.mjs +4 -4
  158. package/esm2022/lib/pagination/page-item/page-item.component.mjs +4 -4
  159. package/esm2022/lib/pagination/page-item/page-item.directive.mjs +4 -4
  160. package/esm2022/lib/pagination/page-link/page-link.directive.mjs +4 -4
  161. package/esm2022/lib/pagination/pagination/pagination.component.mjs +4 -4
  162. package/esm2022/lib/pagination/pagination.module.mjs +5 -5
  163. package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +4 -4
  164. package/esm2022/lib/placeholder/placeholder.directive.mjs +4 -4
  165. package/esm2022/lib/placeholder/placeholder.module.mjs +5 -5
  166. package/esm2022/lib/popover/popover/popover.component.mjs +4 -4
  167. package/esm2022/lib/popover/popover.directive.mjs +4 -4
  168. package/esm2022/lib/popover/popover.module.mjs +5 -5
  169. package/esm2022/lib/progress/progress-bar.component.mjs +4 -4
  170. package/esm2022/lib/progress/progress-bar.directive.mjs +4 -4
  171. package/esm2022/lib/progress/progress-stacked.component.mjs +4 -4
  172. package/esm2022/lib/progress/progress.component.mjs +4 -4
  173. package/esm2022/lib/progress/progress.module.mjs +5 -5
  174. package/esm2022/lib/rating/rating-item-label/rating-item-label.component.mjs +40 -0
  175. package/esm2022/lib/rating/rating.component.mjs +224 -59
  176. package/esm2022/lib/rating/rating.module.mjs +5 -5
  177. package/esm2022/lib/services/class-toggle.service.mjs +4 -4
  178. package/esm2022/lib/services/color-mode.service.mjs +4 -4
  179. package/esm2022/lib/services/in-memory-storage.service.mjs +4 -4
  180. package/esm2022/lib/services/intersection.service.mjs +4 -4
  181. package/esm2022/lib/services/listeners.service.mjs +25 -14
  182. package/esm2022/lib/services/local-storage.service.mjs +4 -4
  183. package/esm2022/lib/shared/element-ref.directive.mjs +18 -0
  184. package/esm2022/lib/shared/html-attr.directive.mjs +4 -4
  185. package/esm2022/lib/shared/public_api.mjs +3 -2
  186. package/esm2022/lib/shared/shared.module.mjs +9 -8
  187. package/esm2022/lib/shared/template-id.directive.mjs +9 -9
  188. package/esm2022/lib/shared/theme.directive.mjs +4 -4
  189. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +4 -4
  190. package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +4 -4
  191. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +4 -4
  192. package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +4 -4
  193. package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +4 -4
  194. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +4 -4
  195. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +4 -4
  196. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +4 -4
  197. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +4 -4
  198. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +4 -4
  199. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +4 -4
  200. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +7 -7
  201. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +4 -4
  202. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +4 -4
  203. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +7 -7
  204. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +7 -7
  205. package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +4 -4
  206. package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.mjs +4 -4
  207. package/esm2022/lib/sidebar/sidebar.module.mjs +5 -5
  208. package/esm2022/lib/sidebar/sidebar.service.mjs +4 -4
  209. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +4 -4
  210. package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +5 -5
  211. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +4 -4
  212. package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +4 -4
  213. package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +4 -4
  214. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +4 -4
  215. package/esm2022/lib/smart-table/smart-table-head/smart-table-column-label.pipe.mjs +4 -4
  216. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +4 -4
  217. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +4 -4
  218. package/esm2022/lib/smart-table/smart-table.module.mjs +5 -5
  219. package/esm2022/lib/spinner/spinner.component.mjs +4 -4
  220. package/esm2022/lib/spinner/spinner.module.mjs +5 -5
  221. package/esm2022/lib/table/table-active.directive.mjs +4 -4
  222. package/esm2022/lib/table/table-color.directive.mjs +4 -4
  223. package/esm2022/lib/table/table.directive.mjs +4 -4
  224. package/esm2022/lib/table/table.module.mjs +5 -5
  225. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +4 -4
  226. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +4 -4
  227. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +4 -4
  228. package/esm2022/lib/tabs/tab.service.mjs +4 -4
  229. package/esm2022/lib/tabs/tabs.module.mjs +5 -5
  230. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +7 -7
  231. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +7 -7
  232. package/esm2022/lib/time-picker/time-picker.component.mjs +4 -4
  233. package/esm2022/lib/time-picker/time-picker.module.mjs +5 -5
  234. package/esm2022/lib/toast/toast/toast.component.mjs +4 -4
  235. package/esm2022/lib/toast/toast-body/toast-body.component.mjs +4 -4
  236. package/esm2022/lib/toast/toast-close.directive.mjs +4 -4
  237. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +4 -4
  238. package/esm2022/lib/toast/toast.module.mjs +5 -5
  239. package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +4 -4
  240. package/esm2022/lib/toast/toaster/toaster.component.mjs +4 -4
  241. package/esm2022/lib/toast/toaster/toaster.service.mjs +4 -4
  242. package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +4 -4
  243. package/esm2022/lib/tooltip/tooltip.directive.mjs +77 -81
  244. package/esm2022/lib/tooltip/tooltip.module.mjs +5 -5
  245. package/esm2022/lib/utilities/align.directive.mjs +4 -4
  246. package/esm2022/lib/utilities/bg-color.directive.mjs +4 -4
  247. package/esm2022/lib/utilities/border.directive.mjs +4 -4
  248. package/esm2022/lib/utilities/rounded.directive.mjs +4 -4
  249. package/esm2022/lib/utilities/shadow-on-scroll.directive.mjs +4 -4
  250. package/esm2022/lib/utilities/text-bg-color.directive.mjs +4 -4
  251. package/esm2022/lib/utilities/text-color.directive.mjs +4 -4
  252. package/esm2022/lib/utilities/utilities.module.mjs +5 -5
  253. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +4 -4
  254. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +4 -4
  255. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +4 -4
  256. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +4 -4
  257. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +4 -4
  258. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +4 -4
  259. package/esm2022/lib/widget/widget.module.mjs +5 -5
  260. package/fesm2022/coreui-angular-pro.mjs +1233 -991
  261. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  262. package/lib/coreui.types.d.ts +1 -1
  263. package/lib/dropdown/dropdown/dropdown.component.d.ts +9 -7
  264. package/lib/rating/rating-item-label/rating-item-label.component.d.ts +13 -0
  265. package/lib/rating/rating.component.d.ts +80 -7
  266. package/lib/services/listeners.service.d.ts +2 -3
  267. package/lib/shared/element-ref.directive.d.ts +7 -0
  268. package/lib/shared/public_api.d.ts +2 -1
  269. package/lib/shared/shared.module.d.ts +5 -4
  270. package/lib/shared/template-id.directive.d.ts +1 -2
  271. package/lib/tooltip/tooltip.directive.d.ts +30 -16
  272. package/package.json +3 -3
@@ -0,0 +1,40 @@
1
+ import { ChangeDetectionStrategy, Component, effect, ElementRef, inject, input, Renderer2, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class RatingItemLabelComponent {
4
+ constructor() {
5
+ this.#elementRef = inject(ElementRef);
6
+ this.#renderer = inject(Renderer2);
7
+ this.label = input('');
8
+ this.value = input.required();
9
+ this.focusable = signal(false);
10
+ this.focusableEffect = effect(() => {
11
+ this.#renderer.setAttribute(this.#elementRef.nativeElement, 'tabindex', this.focusable() ? '0' : '-1');
12
+ });
13
+ }
14
+ #elementRef;
15
+ #renderer;
16
+ // @HostBinding('attr.tabindex')
17
+ // get tabIndex() {
18
+ // // console.log('active', this.active(), this.active() ? '0' : '-1')
19
+ // console.log('focusable', this.value(), this.focusable(), this.focusable() ? '0' : '-1');
20
+ // return this.focusable() ? '0' : '-1';
21
+ // }
22
+ focus(origin) {
23
+ this.#elementRef.nativeElement.focus();
24
+ }
25
+ getLabel() {
26
+ return this.label() || this.value().toString();
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: RatingItemLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.10", type: RatingItemLabelComponent, isStandalone: true, selector: "c-rating-item-label", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: RatingItemLabelComponent, decorators: [{
32
+ type: Component,
33
+ args: [{
34
+ selector: 'c-rating-item-label',
35
+ standalone: true,
36
+ template: '<ng-content />',
37
+ changeDetection: ChangeDetectionStrategy.OnPush,
38
+ }]
39
+ }] });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLWl0ZW0tbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9yYXRpbmcvcmF0aW5nLWl0ZW0tbGFiZWwvcmF0aW5nLWl0ZW0tbGFiZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBU3pILE1BQU0sT0FBTyx3QkFBd0I7SUFOckM7UUFPVyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLFVBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsVUFBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNqQyxjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5DLG9CQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO0tBZ0JKO0lBeEJVLFdBQVcsQ0FBc0I7SUFDakMsU0FBUyxDQUFxQjtJQVN2QyxnQ0FBZ0M7SUFDaEMsbUJBQW1CO0lBQ25CLHdFQUF3RTtJQUN4RSw2RkFBNkY7SUFDN0YsMENBQTBDO0lBQzFDLElBQUk7SUFFSixLQUFLLENBQUMsTUFBb0I7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakQsQ0FBQzsrR0F4QlUsd0JBQXdCO21HQUF4Qix3QkFBd0IsMFVBSHpCLGdCQUFnQjs7NEZBR2Ysd0JBQXdCO2tCQU5wQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIFJlbmRlcmVyMiwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2N1c2FibGVPcHRpb24sIEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLXJhdGluZy1pdGVtLWxhYmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudCAvPicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSYXRpbmdJdGVtTGFiZWxDb21wb25lbnQgaW1wbGVtZW50cyBGb2N1c2FibGVPcHRpb24ge1xuICByZWFkb25seSAjZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcmVhZG9ubHkgI3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQoJycpO1xuICByZWFkb25seSB2YWx1ZSA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgZm9jdXNhYmxlID0gc2lnbmFsKGZhbHNlKTtcblxuICBmb2N1c2FibGVFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0YWJpbmRleCcsIHRoaXMuZm9jdXNhYmxlKCkgPyAnMCcgOiAnLTEnKTtcbiAgfSk7XG5cbiAgLy8gQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgLy8gZ2V0IHRhYkluZGV4KCkge1xuICAvLyAgIC8vIGNvbnNvbGUubG9nKCdhY3RpdmUnLCB0aGlzLmFjdGl2ZSgpLCB0aGlzLmFjdGl2ZSgpID8gJzAnIDogJy0xJylcbiAgLy8gICBjb25zb2xlLmxvZygnZm9jdXNhYmxlJywgdGhpcy52YWx1ZSgpLCB0aGlzLmZvY3VzYWJsZSgpLCB0aGlzLmZvY3VzYWJsZSgpID8gJzAnIDogJy0xJyk7XG4gIC8vICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlKCkgPyAnMCcgOiAnLTEnO1xuICAvLyB9XG5cbiAgZm9jdXMob3JpZ2luPzogRm9jdXNPcmlnaW4pOiB2b2lkIHtcbiAgICB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGdldExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWwoKSB8fCB0aGlzLnZhbHVlKCkudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
@@ -1,31 +1,134 @@
1
- import { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, HostBinding, HostListener, inject, input, model, numberAttribute, output, signal } from '@angular/core';
1
+ import { FocusKeyManager } from '@angular/cdk/a11y';
2
+ import { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, HostBinding, HostListener, inject, input, model, numberAttribute, output, signal, untracked, viewChildren, } from '@angular/core';
2
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
4
5
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
- import { fromEvent, merge } from 'rxjs';
6
+ import { fromEvent, merge, takeWhile } from 'rxjs';
6
7
  import { filter, tap } from 'rxjs/operators';
7
8
  import { TooltipDirective } from '../tooltip';
8
- import { TemplateIdDirective } from '../shared';
9
+ import { ElementRefDirective, TemplateIdDirective } from '../shared';
10
+ import { RatingItemLabelComponent } from './rating-item-label/rating-item-label.component';
9
11
  import * as i0 from "@angular/core";
10
12
  export const coerceStringArray = (value) => Array.isArray(value) ? [...value] : [value];
11
13
  export const coerceRatingPrecision = (value) => [1, 0.5, 0.25].includes(numberAttribute(value)) ? numberAttribute(value) : 1;
14
+ export const coerceNumber = (value) => Number(value ?? 0);
12
15
  export class RatingComponent {
13
16
  constructor() {
14
- this.activeIcon = input([], { transform: coerceStringArray });
17
+ this.#destroyRef = inject(DestroyRef);
18
+ this.#elementRef = inject(ElementRef);
19
+ /**
20
+ * The default icon to display when the item is selected.
21
+ * @type: string | string[]
22
+ */
23
+ this.activeIcon = input([], {
24
+ transform: coerceStringArray,
25
+ });
26
+ /**
27
+ * Enables the clearing upon clicking the selected item again.
28
+ * @type: boolean
29
+ * @default: false
30
+ */
15
31
  this.allowClear = input(false, { transform: booleanAttribute });
32
+ /**
33
+ * Toggle the disabled state for the component.
34
+ * @type: boolean
35
+ * @default: false
36
+ */
16
37
  this.disabled = input(false, { transform: booleanAttribute });
38
+ this.#disabledState = signal(this.disabled());
39
+ /**
40
+ * If enabled, only the currently selected icon will be visibly highlighted.
41
+ * @type: boolean
42
+ * @default: false
43
+ */
17
44
  this.highlightOnlySelected = input(false, { transform: booleanAttribute });
18
- this.icon = input([], { transform: coerceStringArray });
45
+ /**
46
+ * The default icon to display when the item is not selected.
47
+ * @type: string | string[]
48
+ */
49
+ this.icon = input([], {
50
+ transform: coerceStringArray,
51
+ });
52
+ /**
53
+ * Specifies the total number of stars to be displayed in the star rating component. This property determines the scale of the rating,
54
+ * such as out of 5 stars, 10 stars, etc.
55
+ * @type: number
56
+ * @default: 5
57
+ */
19
58
  this.itemCount = input(5, { transform: numberAttribute });
59
+ /**
60
+ * Minimum increment value change allowed.
61
+ * @type: number
62
+ * @default: 1
63
+ */
20
64
  this.precision = input(1, { transform: numberAttribute });
65
+ /**
66
+ * Allows to click fractions
67
+ * @type: boolean
68
+ * @default: false
69
+ */
70
+ // readonly precisionClick = input(false, { transform: booleanAttribute });
71
+ /**
72
+ * Toggle the readonly state for the component.
73
+ * @type: boolean
74
+ * @default: false
75
+ */
21
76
  this.readOnly = input(false, { transform: booleanAttribute });
77
+ /**
78
+ * Size the component small, large, or custom if you define custom icons with custom height.
79
+ * @type: 'sm' | 'lg' | 'custom' | undefined
80
+ * @default: undefined
81
+ */
22
82
  this.size = input(undefined);
83
+ /**
84
+ * Enable tooltips with default values or set specific labels for each icon.
85
+ * @type: boolean | string[] | undefined
86
+ * @default: undefined
87
+ */
23
88
  this.tooltips = input(undefined);
89
+ /**
90
+ * The `value` attribute of component.
91
+ * @type: number | null
92
+ * @default: null
93
+ * Emits `valueChange` on value change
94
+ */
24
95
  this.value = model(null);
25
- this.hoverValueChange = output();
96
+ /**
97
+ * Event emitted on hoverValue change.
98
+ * @type: number | null
99
+ */
26
100
  this.hoverValue = signal(null);
101
+ this.hoverValueChange = output();
102
+ this.hoverValueEffect = effect(() => {
103
+ this.hoverValueChange.emit(this.hoverValue());
104
+ if (!this.hoverValue()) {
105
+ this.hoveredItem.set(undefined);
106
+ }
107
+ }, { allowSignalWrites: true });
108
+ this.#cleared = signal(false);
109
+ this.hoveredItem = signal(undefined);
27
110
  this.tooltipValue = signal(null);
28
- this.ratingDisabled = computed(() => this.disabled() || this.readOnly());
111
+ this.ratingDisabled = computed(() => this.disabled() || this.readOnly() || this.#disabledState());
112
+ this.ratingDisabledEffect = effect(() => {
113
+ if (!this.ratingDisabled()) {
114
+ const focusIn$ = fromEvent(this.#elementRef.nativeElement, 'focusin');
115
+ const focusOut$ = fromEvent(this.#elementRef.nativeElement, 'focusout');
116
+ const mouseLeave$ = fromEvent(this.#elementRef.nativeElement, 'mouseleave');
117
+ merge(focusIn$, focusOut$, mouseLeave$)
118
+ .pipe(filter((event) => !this.ratingDisabled()), tap(($event) => {
119
+ switch ($event.type) {
120
+ case 'focusin':
121
+ this.onTouched();
122
+ break;
123
+ case 'focusout':
124
+ case 'mouseleave':
125
+ this.hoverValue.set(null);
126
+ break;
127
+ }
128
+ }), takeWhile(() => !this.ratingDisabled()), takeUntilDestroyed(this.#destroyRef))
129
+ .subscribe();
130
+ }
131
+ });
29
132
  this.contentTemplates = contentChildren(TemplateIdDirective);
30
133
  this.iconTemplates = computed(() => {
31
134
  const templateArray = this.contentTemplates().map((child) => {
@@ -34,7 +137,6 @@ export class RatingComponent {
34
137
  return Object.fromEntries(templateArray);
35
138
  });
36
139
  this.numberOfSubItems = computed(() => {
37
- // return 1 / this.precision();
38
140
  return parseInt((1 / this.precision()).toFixed());
39
141
  });
40
142
  this.ratingItems = computed(() => {
@@ -45,33 +147,70 @@ export class RatingComponent {
45
147
  return Array.from({ length: this.numberOfSubItems() }, (_, subIndex) => itemIndex + (subIndex + 1) * this.precision());
46
148
  });
47
149
  });
48
- this.#destroyRef = inject(DestroyRef);
49
- this.#elementRef = inject(ElementRef);
150
+ this.ratingItemLabels = viewChildren(RatingItemLabelComponent);
151
+ this.ratingItemLabelsEffect = effect(() => {
152
+ if (untracked(this.ratingDisabled)) {
153
+ return;
154
+ }
155
+ this.#focusKeyManager = new FocusKeyManager(this.ratingItemLabels())
156
+ .withHorizontalOrientation('ltr')
157
+ .withWrap();
158
+ const activeItemIndex = this.ratingItems()
159
+ .flat()
160
+ .findIndex((value) => value === coerceNumber(this.value() ?? 0));
161
+ this.#focusKeyManager?.updateActiveItem(activeItemIndex < 0 ? 0 : activeItemIndex);
162
+ this.#focusKeyManager.tabOut
163
+ .pipe(tap((x) => {
164
+ const activeItemIndex = untracked(this.ratingItems)
165
+ .flat()
166
+ .findIndex((value) => value === coerceNumber(untracked(this.value) ?? 0));
167
+ this.#focusKeyManager.updateActiveItem(activeItemIndex === -1 ? 0 : activeItemIndex);
168
+ this.updateFocusableItems();
169
+ }), takeUntilDestroyed(this.#destroyRef))
170
+ .subscribe();
171
+ this.#focusKeyManager.change
172
+ .pipe(tap((value) => {
173
+ this.ratingItemLabels().forEach((label, index) => {
174
+ label.focusable.set(index === this.#focusKeyManager.activeItemIndex);
175
+ if (index === this.#focusKeyManager.activeItemIndex) {
176
+ const value = untracked(label.value);
177
+ this.handleClick(value);
178
+ }
179
+ });
180
+ }), takeUntilDestroyed(this.#destroyRef))
181
+ .subscribe();
182
+ }, { allowSignalWrites: true });
50
183
  this.onChange = (value) => { };
51
- this.valueEffect = effect(() => {
52
- this.onChange(this.value());
53
- });
54
184
  this.onTouched = () => { };
55
- const mouseLeave$ = fromEvent(this.#elementRef.nativeElement, 'mouseleave');
56
- const focusOut$ = fromEvent(this.#elementRef.nativeElement, 'focusout');
57
- const focusIn$ = fromEvent(this.#elementRef.nativeElement, 'focusin');
58
- merge(mouseLeave$, focusOut$, focusIn$)
59
- .pipe(filter((event) => !this.ratingDisabled()), tap(($event) => {
60
- this.hoverValue.set(null);
61
- this.hoverValueChange.emit('');
62
- if ($event.type === 'focusin') {
63
- this.onTouched();
185
+ // keep it at the bottom of the code
186
+ this.valueEffect = effect(() => {
187
+ const ratingValue = this.value();
188
+ this.onChange(ratingValue);
189
+ if (untracked(this.ratingDisabled)) {
190
+ return;
64
191
  }
65
- }), takeUntilDestroyed(this.#destroyRef)).subscribe();
192
+ if (untracked(this.#cleared)) {
193
+ this.#cleared.set(false);
194
+ return;
195
+ }
196
+ const activeItemIndex = this.ratingItems()
197
+ .flat()
198
+ .findIndex((value) => value === coerceNumber(ratingValue ?? 0));
199
+ this.#focusKeyManager?.updateActiveItem(activeItemIndex < 0 ? 0 : activeItemIndex);
200
+ this.updateFocusableItems();
201
+ }, { allowSignalWrites: true });
66
202
  }
67
203
  #destroyRef;
68
204
  #elementRef;
205
+ #disabledState;
206
+ #cleared;
207
+ #focusKeyManager;
69
208
  get hostClasses() {
70
209
  return {
71
210
  rating: true,
72
211
  [`rating-${this.size()}`]: this.size(),
73
- disabled: this.disabled(),
74
- readonly: this.readOnly()
212
+ disabled: this.disabled() || this.#disabledState(),
213
+ readonly: this.readOnly(),
75
214
  };
76
215
  }
77
216
  get ariaValueNow() {
@@ -80,22 +219,37 @@ export class RatingComponent {
80
219
  get ariaValueMax() {
81
220
  return this.itemCount();
82
221
  }
83
- onClick($event) {
222
+ get role() {
223
+ return 'radiogroup';
224
+ }
225
+ onKeydown($event) {
84
226
  if (this.ratingDisabled()) {
85
227
  return false;
86
228
  }
87
- this.onTouched();
229
+ if (['Space', 'Enter'].includes($event.code)) {
230
+ $event.preventDefault();
231
+ const item = this.ratingItemLabels().find((label, index) => index === this.#focusKeyManager?.activeItemIndex);
232
+ this.handleClick(item?.value() ?? -1);
233
+ return;
234
+ }
235
+ if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes($event.key)) {
236
+ this.#focusKeyManager.onKeydown($event);
237
+ return;
238
+ }
239
+ if (['Tab'].includes($event.key)) {
240
+ this.#focusKeyManager?.tabOut.next();
241
+ }
88
242
  return;
89
243
  }
90
244
  registerOnChange(fn) {
91
245
  this.onChange = fn;
92
246
  }
93
- // setDisabledState(isDisabled: boolean): void {
94
- // this.disabled.set(isDisabled);
95
- // }
96
247
  registerOnTouched(fn) {
97
248
  this.onTouched = fn;
98
249
  }
250
+ setDisabledState(isDisabled) {
251
+ this.#disabledState.set(isDisabled);
252
+ }
99
253
  writeValue(value) {
100
254
  this.value.set(value);
101
255
  }
@@ -106,18 +260,21 @@ export class RatingComponent {
106
260
  notLastItemStyle(value) {
107
261
  return {
108
262
  zIndex: this.numberOfSubItems() - value,
109
- // zIndex: 1 / this.precision() - value,
110
263
  position: 'absolute',
111
264
  width: `${this.precision() * (value + 1) * 100}%`,
112
265
  overflow: 'hidden',
113
- opacity: .1
266
+ opacity: 0.1,
114
267
  };
115
268
  }
269
+ handleFocusIn($event, itemValue) {
270
+ this.handleMouseEnter($event, itemValue);
271
+ }
116
272
  handleClick(value) {
117
- if (this.disabled() || this.readOnly()) {
273
+ if (this.ratingDisabled()) {
118
274
  return;
119
275
  }
120
276
  if (this.allowClear() && value === this.value()) {
277
+ this.#cleared.set(true);
121
278
  this.value.set(null);
122
279
  this.hoverValue.set(null);
123
280
  }
@@ -125,54 +282,59 @@ export class RatingComponent {
125
282
  this.value.set(value);
126
283
  }
127
284
  }
128
- handleKeyUp($event, value) {
129
- if ($event.key === 'Enter') {
130
- this.handleClick(value);
131
- }
132
- if ($event.key === 'Tab') {
133
- this.handleMouseEnter(value);
134
- }
135
- }
136
- handleMouseEnter(value) {
137
- if (this.disabled() || this.readOnly()) {
285
+ handleMouseEnter($event, value) {
286
+ if (this.ratingDisabled()) {
138
287
  return;
139
288
  }
140
289
  this.hoverValue.set(null);
141
290
  this.hoverValue.set(value);
142
291
  this.tooltipValue.set(value);
143
- this.hoverValueChange.emit(value.toString());
144
292
  }
145
293
  getTooltipValue(index) {
294
+ if (!this.hoverValue() || this.hoveredItem() !== index) {
295
+ return undefined;
296
+ }
146
297
  if (Array.isArray(this.tooltips())) {
147
298
  const tooltips = this.tooltips();
148
299
  return tooltips[index];
149
300
  }
150
- return this.precision() ? this.tooltipValue()?.toString() ?? '' : this.ratingItems() ? (this.ratingItems()[index].at(-1) ?? '').toString() : '';
301
+ return this.precision()
302
+ ? this.tooltipValue()?.toString() ?? ''
303
+ : this.ratingItems()
304
+ ? (this.ratingItems()[index].at(-1) ?? '').toString()
305
+ : '';
151
306
  }
152
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
153
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.6", type: RatingComponent, isStandalone: true, selector: "c-rating", inputs: { activeIcon: { classPropertyName: "activeIcon", publicName: "activeIcon", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, highlightOnlySelected: { classPropertyName: "highlightOnlySelected", publicName: "highlightOnlySelected", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, itemCount: { classPropertyName: "itemCount", publicName: "itemCount", isSignal: true, isRequired: false, transformFunction: null }, precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, tooltips: { classPropertyName: "tooltips", publicName: "tooltips", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", hoverValueChange: "hoverValueChange" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class": "this.hostClasses", "attr.aria-valuenow": "this.ariaValueNow", "attr.aria-valuemax": "this.ariaValueMax" } }, providers: [
307
+ updateFocusableItems() {
308
+ this.ratingItemLabels().forEach((label, index) => {
309
+ label.focusable.set(index === this.#focusKeyManager?.activeItemIndex);
310
+ });
311
+ }
312
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
313
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.10", type: RatingComponent, isStandalone: true, selector: "c-rating", inputs: { activeIcon: { classPropertyName: "activeIcon", publicName: "activeIcon", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, highlightOnlySelected: { classPropertyName: "highlightOnlySelected", publicName: "highlightOnlySelected", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, itemCount: { classPropertyName: "itemCount", publicName: "itemCount", isSignal: true, isRequired: false, transformFunction: null }, precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, tooltips: { classPropertyName: "tooltips", publicName: "tooltips", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", hoverValueChange: "hoverValueChange" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "this.hostClasses", "attr.aria-valuenow": "this.ariaValueNow", "attr.aria-valuemax": "this.ariaValueMax", "attr.role": "this.role" } }, providers: [
154
314
  {
155
315
  provide: NG_VALUE_ACCESSOR,
156
316
  useExisting: forwardRef(() => RatingComponent),
157
- multi: true
158
- }
159
- ], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, isSignal: true }], exportAs: ["cRating"], ngImport: i0, template: "@for (item of ratingItems(); track item; let itemIndex = $index, last = $last) {\n @if (tooltips()) {\n <div class=\"rating-item\" [cTooltip]=\"getTooltipValue(itemIndex)\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: {$implicit: item, itemIndex}\" />\n </div>\n } @else {\n <div class=\"rating-item\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: {$implicit: item, itemIndex}\" />\n </div>\n }\n}\n\n<ng-template let-item let-itemIndex=\"itemIndex\" #ratingItemLabel>\n @for (itemValue of item; track radioIndex; let radioIndex = $index, last = $last) {\n <div\n class=\"rating-item-label d-inline-block\"\n (click)=\"handleClick(itemValue)\"\n (keyup)=\"handleKeyUp($event, itemValue)\"\n [ngClass]=\"{ active: isItemActive(itemValue) }\"\n (mouseenter)=\"handleMouseEnter(itemValue)\"\n [ngStyle]=\"radioIndex + 1 < numberOfSubItems() ? notLastItemStyle(radioIndex) : {}\"\n [tabindex]=\"ratingDisabled() ? -1 : 0\"\n >\n @if (iconTemplates()[icon()[itemIndex] ?? icon()]) {\n <ng-container *ngTemplateOutlet=\"customIconTemplate; context: {$implicit: icon()?.[itemIndex] ?? icon()}\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultIconTemplate\" />\n }\n @if (iconTemplates()[activeIcon()[itemIndex] ?? activeIcon()]) {\n <ng-container\n *ngTemplateOutlet=\"customIconActiveTemplate; context: {$implicit: activeIcon()?.[itemIndex] ?? activeIcon()}\" />\n }\n </div>\n }\n</ng-template>\n\n<ng-template #tooltipContent>\n <span>{{ hoverValue() }}</span>\n</ng-template>\n\n<ng-template #defaultIconTemplate>\n <div class=\"rating-item-icon\"></div>\n</ng-template>\n\n<ng-template #customIconTemplate let-icon>\n <div class=\"rating-item-custom-icon\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || defaultIconTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #customIconActiveTemplate let-icon>\n <div class=\"rating-item-custom-icon-active\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || customIconTemplate\" />\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(() => TooltipDirective), selector: "[cTooltip]", inputs: ["cTooltip", "cTooltipOptions", "cTooltipPlacement", "cTooltipTrigger", "cTooltipVisible"], exportAs: ["cTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
317
+ multi: true,
318
+ },
319
+ ], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, isSignal: true }], viewQueries: [{ propertyName: "ratingItemLabels", predicate: RatingItemLabelComponent, descendants: true, isSignal: true }], exportAs: ["cRating"], ngImport: i0, template: "@for (item of ratingItems(); track item; let itemIndex = $index, last = $last) {\n @if (tooltips()) {\n <div\n class=\"rating-item\"\n [cTooltip]=\"getTooltipValue(itemIndex)\"\n [cTooltipTrigger]=\"['hover', 'focusin']\"\n (mouseenter)=\"hoveredItem.set(itemIndex)\"\n (focusin)=\"hoveredItem.set(itemIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: { $implicit: item, itemIndex }\" />\n </div>\n } @else {\n <div class=\"rating-item\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: { $implicit: item, itemIndex }\" />\n </div>\n }\n}\n\n<ng-template let-item let-itemIndex=\"itemIndex\" #ratingItemLabel>\n @for (itemValue of item; track radioIndex; let radioIndex = $index, last = $last) {\n <c-rating-item-label\n class=\"rating-item-label d-inline-block\"\n role=\"radio\"\n (click)=\"handleClick(itemValue)\"\n (focus)=\"handleFocusIn($event, itemValue)\"\n [ngClass]=\"{ active: isItemActive(itemValue) }\"\n (mouseenter)=\"handleMouseEnter($event, itemValue)\"\n [ngStyle]=\"radioIndex + 1 < numberOfSubItems() ? notLastItemStyle(radioIndex) : {}\"\n [value]=\"itemValue\"\n [attr.aria-label]=\"itemValue\"\n [attr.aria-checked]=\"itemValue === value()\"\n >\n @if (iconTemplates()[icon()[itemIndex] ?? icon()]) {\n <ng-container *ngTemplateOutlet=\"customIconTemplate; context: { $implicit: icon()?.[itemIndex] ?? icon() }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultIconTemplate\" />\n }\n @if (iconTemplates()[activeIcon()[itemIndex] ?? activeIcon()]) {\n <ng-container *ngTemplateOutlet=\"customIconActiveTemplate; context: { $implicit: activeIcon()?.[itemIndex] ?? activeIcon() }\" />\n }\n </c-rating-item-label>\n }\n</ng-template>\n\n<ng-template #tooltipContent>\n <span>{{ hoverValue() }}</span>\n</ng-template>\n\n<ng-template #defaultIconTemplate>\n <div class=\"rating-item-icon\"></div>\n</ng-template>\n\n<ng-template #customIconTemplate let-icon>\n <div class=\"rating-item-custom-icon\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || defaultIconTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #customIconActiveTemplate let-icon>\n <div class=\"rating-item-custom-icon-active\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || customIconTemplate\" />\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}:is(:host.disabled,:host.readonly) .rating-item-label{cursor:default}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(() => TooltipDirective), selector: "[cTooltip]", inputs: ["cTooltip", "cTooltipOptions", "cTooltipPlacement", "cTooltipRef", "cTooltipTrigger", "cTooltipVisible"], outputs: ["cTooltipVisibleChange"], exportAs: ["cTooltip"] }, { kind: "component", type: i0.forwardRef(() => RatingItemLabelComponent), selector: "c-rating-item-label", inputs: ["label", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
160
320
  }
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: RatingComponent, decorators: [{
321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: RatingComponent, decorators: [{
162
322
  type: Component,
163
323
  args: [{ selector: 'c-rating', exportAs: 'cRating', standalone: true, imports: [
164
324
  NgClass,
165
325
  NgStyle,
166
326
  NgTemplateOutlet,
167
- forwardRef(() => TooltipDirective)
327
+ forwardRef(() => TooltipDirective),
328
+ ElementRefDirective,
329
+ RatingItemLabelComponent,
168
330
  ], providers: [
169
331
  {
170
332
  provide: NG_VALUE_ACCESSOR,
171
333
  useExisting: forwardRef(() => RatingComponent),
172
- multi: true
173
- }
174
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (item of ratingItems(); track item; let itemIndex = $index, last = $last) {\n @if (tooltips()) {\n <div class=\"rating-item\" [cTooltip]=\"getTooltipValue(itemIndex)\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: {$implicit: item, itemIndex}\" />\n </div>\n } @else {\n <div class=\"rating-item\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: {$implicit: item, itemIndex}\" />\n </div>\n }\n}\n\n<ng-template let-item let-itemIndex=\"itemIndex\" #ratingItemLabel>\n @for (itemValue of item; track radioIndex; let radioIndex = $index, last = $last) {\n <div\n class=\"rating-item-label d-inline-block\"\n (click)=\"handleClick(itemValue)\"\n (keyup)=\"handleKeyUp($event, itemValue)\"\n [ngClass]=\"{ active: isItemActive(itemValue) }\"\n (mouseenter)=\"handleMouseEnter(itemValue)\"\n [ngStyle]=\"radioIndex + 1 < numberOfSubItems() ? notLastItemStyle(radioIndex) : {}\"\n [tabindex]=\"ratingDisabled() ? -1 : 0\"\n >\n @if (iconTemplates()[icon()[itemIndex] ?? icon()]) {\n <ng-container *ngTemplateOutlet=\"customIconTemplate; context: {$implicit: icon()?.[itemIndex] ?? icon()}\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultIconTemplate\" />\n }\n @if (iconTemplates()[activeIcon()[itemIndex] ?? activeIcon()]) {\n <ng-container\n *ngTemplateOutlet=\"customIconActiveTemplate; context: {$implicit: activeIcon()?.[itemIndex] ?? activeIcon()}\" />\n }\n </div>\n }\n</ng-template>\n\n<ng-template #tooltipContent>\n <span>{{ hoverValue() }}</span>\n</ng-template>\n\n<ng-template #defaultIconTemplate>\n <div class=\"rating-item-icon\"></div>\n</ng-template>\n\n<ng-template #customIconTemplate let-icon>\n <div class=\"rating-item-custom-icon\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || defaultIconTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #customIconActiveTemplate let-icon>\n <div class=\"rating-item-custom-icon-active\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || customIconTemplate\" />\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}\n"] }]
175
- }], ctorParameters: () => [], propDecorators: { hostClasses: [{
334
+ multi: true,
335
+ },
336
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (item of ratingItems(); track item; let itemIndex = $index, last = $last) {\n @if (tooltips()) {\n <div\n class=\"rating-item\"\n [cTooltip]=\"getTooltipValue(itemIndex)\"\n [cTooltipTrigger]=\"['hover', 'focusin']\"\n (mouseenter)=\"hoveredItem.set(itemIndex)\"\n (focusin)=\"hoveredItem.set(itemIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: { $implicit: item, itemIndex }\" />\n </div>\n } @else {\n <div class=\"rating-item\">\n <ng-container *ngTemplateOutlet=\"ratingItemLabel; context: { $implicit: item, itemIndex }\" />\n </div>\n }\n}\n\n<ng-template let-item let-itemIndex=\"itemIndex\" #ratingItemLabel>\n @for (itemValue of item; track radioIndex; let radioIndex = $index, last = $last) {\n <c-rating-item-label\n class=\"rating-item-label d-inline-block\"\n role=\"radio\"\n (click)=\"handleClick(itemValue)\"\n (focus)=\"handleFocusIn($event, itemValue)\"\n [ngClass]=\"{ active: isItemActive(itemValue) }\"\n (mouseenter)=\"handleMouseEnter($event, itemValue)\"\n [ngStyle]=\"radioIndex + 1 < numberOfSubItems() ? notLastItemStyle(radioIndex) : {}\"\n [value]=\"itemValue\"\n [attr.aria-label]=\"itemValue\"\n [attr.aria-checked]=\"itemValue === value()\"\n >\n @if (iconTemplates()[icon()[itemIndex] ?? icon()]) {\n <ng-container *ngTemplateOutlet=\"customIconTemplate; context: { $implicit: icon()?.[itemIndex] ?? icon() }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultIconTemplate\" />\n }\n @if (iconTemplates()[activeIcon()[itemIndex] ?? activeIcon()]) {\n <ng-container *ngTemplateOutlet=\"customIconActiveTemplate; context: { $implicit: activeIcon()?.[itemIndex] ?? activeIcon() }\" />\n }\n </c-rating-item-label>\n }\n</ng-template>\n\n<ng-template #tooltipContent>\n <span>{{ hoverValue() }}</span>\n</ng-template>\n\n<ng-template #defaultIconTemplate>\n <div class=\"rating-item-icon\"></div>\n</ng-template>\n\n<ng-template #customIconTemplate let-icon>\n <div class=\"rating-item-custom-icon\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || defaultIconTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #customIconActiveTemplate let-icon>\n <div class=\"rating-item-custom-icon-active\">\n <ng-container *ngTemplateOutlet=\"iconTemplates()?.[icon] || customIconTemplate\" />\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}:is(:host.disabled,:host.readonly) .rating-item-label{cursor:default}\n"] }]
337
+ }], propDecorators: { hostClasses: [{
176
338
  type: HostBinding,
177
339
  args: ['class']
178
340
  }], ariaValueNow: [{
@@ -181,8 +343,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImpor
181
343
  }], ariaValueMax: [{
182
344
  type: HostBinding,
183
345
  args: ['attr.aria-valuemax']
184
- }], onClick: [{
346
+ }], role: [{
347
+ type: HostBinding,
348
+ args: ['attr.role']
349
+ }], onKeydown: [{
185
350
  type: HostListener,
186
- args: ['click', ['$event']]
351
+ args: ['keydown', ['$event']]
187
352
  }] } });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvcmF0aW5nL3JhdGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3JhdGluZy9yYXRpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxLQUFLLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUVoRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQXdCLEVBQVksRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNySCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQXNCLEVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBdUJ0SixNQUFNLE9BQU8sZUFBZTtJQUUxQjtRQW1CUyxlQUFVLEdBQTBELEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILGVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUMzRCxhQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDekQsMEJBQXFCLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDdEUsU0FBSSxHQUEwRCxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUMxRyxjQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELGNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELFNBQUksR0FBRyxLQUFLLENBQXFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELGFBQVEsR0FBRyxLQUFLLENBQWlDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELFVBQUssR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBRW5DLHFCQUFnQixHQUFHLE1BQU0sRUFBVSxDQUFDO1FBQ3BDLGVBQVUsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3pDLGlCQUFZLEdBQUcsTUFBTSxDQUF5QixJQUFJLENBQUMsQ0FBQztRQUNwRCxtQkFBYyxHQUFHLFFBQVEsQ0FBVSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UscUJBQWdCLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtnQkFDL0UsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNNLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsK0JBQStCO1lBQy9CLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUMvRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNsQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3pILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTSxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQThCMUMsYUFBUSxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRS9CLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsY0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQTFGbkIsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFhLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBYSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNwRixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbEYsS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO2FBQ3BDLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQ3pDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUNyQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFxQ1EsV0FBVyxDQUFzQjtJQUNqQyxXQUFXLENBQXNCO0lBRTFDLElBQ0ksV0FBVztRQUNiLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSTtZQUNaLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUNJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVrQyxPQUFPLENBQUMsTUFBa0I7UUFDM0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsT0FBTztJQUNULENBQUM7SUFVRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsbUNBQW1DO0lBQ25DLElBQUk7SUFFSixpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBb0I7UUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztJQUNuRixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEtBQUs7WUFDdkMsd0NBQXdDO1lBQ3hDLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUc7WUFDakQsUUFBUSxFQUFFLFFBQVE7WUFDbEIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsTUFBcUIsRUFBRSxLQUFhO1FBQzlDLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQW1CLENBQUM7WUFDbEQsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEosQ0FBQzs4R0FyS1UsZUFBZTtrR0FBZixlQUFlLHV1REFUZjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUM5QyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMkRBd0MyQyxtQkFBbUIsb0VDekZqRSx5bkVBdURBLDBHRG5CSSxPQUFPLHlHQUNQLE9BQU8sZ0dBQ1AsZ0JBQWdCLHlLQUNDLGdCQUFnQjs7MkZBYXhCLGVBQWU7a0JBckIzQixTQUFTOytCQUNFLFVBQVUsWUFDVixTQUFTLGNBQ1AsSUFBSSxXQUNQO3dCQUNQLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDbkMsYUFHVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07d0RBOEQzQyxXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTztnQkFXaEIsWUFBWTtzQkFEZixXQUFXO3VCQUFDLG9CQUFvQjtnQkFNN0IsWUFBWTtzQkFEZixXQUFXO3VCQUFDLG9CQUFvQjtnQkFLRSxPQUFPO3NCQUF6QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgSW5wdXRTaWduYWxXaXRoVHJhbnNmb3JtLFxuICBtb2RlbCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBvdXRwdXQsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vdG9vbHRpcCc7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vc2hhcmVkJztcblxuZXhwb3J0IGNvbnN0IGNvZXJjZVN0cmluZ0FycmF5ID0gKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IFt2YWx1ZV07XG5leHBvcnQgY29uc3QgY29lcmNlUmF0aW5nUHJlY2lzaW9uID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4gWzEsIDAuNSwgMC4yNV0uaW5jbHVkZXMobnVtYmVyQXR0cmlidXRlKHZhbHVlKSkgPyBudW1iZXJBdHRyaWJ1dGUodmFsdWUpIDogMTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1yYXRpbmcnLFxuICBleHBvcnRBczogJ2NSYXRpbmcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBOZ1N0eWxlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBUb29sdGlwRGlyZWN0aXZlKVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcmF0aW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JhdGluZy5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmF0aW5nQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBSYXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgbW91c2VMZWF2ZSQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpO1xuICAgIGNvbnN0IGZvY3VzT3V0JCA9IGZyb21FdmVudDxGb2N1c0V2ZW50Pih0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcpO1xuICAgIGNvbnN0IGZvY3VzSW4kID0gZnJvbUV2ZW50PEZvY3VzRXZlbnQ+KHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzaW4nKTtcblxuICAgIG1lcmdlKG1vdXNlTGVhdmUkLCBmb2N1c091dCQsIGZvY3VzSW4kKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+ICF0aGlzLnJhdGluZ0Rpc2FibGVkKCkpLFxuICAgICAgICB0YXAoKCRldmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG92ZXJWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5ob3ZlclZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuICAgICAgICAgIGlmICgkZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKVxuICAgICAgKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGFjdGl2ZUljb246IElucHV0U2lnbmFsV2l0aFRyYW5zZm9ybTxzdHJpbmdbXSwgc3RyaW5nIHwgc3RyaW5nW10+ID0gaW5wdXQoW10sIHsgdHJhbnNmb3JtOiBjb2VyY2VTdHJpbmdBcnJheSB9KTtcbiAgcmVhZG9ubHkgYWxsb3dDbGVhciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG4gIHJlYWRvbmx5IGhpZ2hsaWdodE9ubHlTZWxlY3RlZCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVhZG9ubHkgaWNvbjogSW5wdXRTaWduYWxXaXRoVHJhbnNmb3JtPHN0cmluZ1tdLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSBpbnB1dChbXSwgeyB0cmFuc2Zvcm06IGNvZXJjZVN0cmluZ0FycmF5IH0pO1xuICByZWFkb25seSBpdGVtQ291bnQgPSBpbnB1dCg1LCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuICByZWFkb25seSBwcmVjaXNpb24gPSBpbnB1dCgxLCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuICByZWFkb25seSByZWFkT25seSA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVhZG9ubHkgc2l6ZSA9IGlucHV0PCdzbScgfCAnbGcnIHwgJ2N1c3RvbScgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHRvb2x0aXBzID0gaW5wdXQ8Ym9vbGVhbiB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB2YWx1ZSA9IG1vZGVsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGhvdmVyVmFsdWVDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBob3ZlclZhbHVlID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB0b29sdGlwVmFsdWUgPSBzaWduYWw8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJhdGluZ0Rpc2FibGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMucmVhZE9ubHkoKSk7XG4gIHJlYWRvbmx5IGNvbnRlbnRUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVJZERpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGljb25UZW1wbGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGVBcnJheSA9IHRoaXMuY29udGVudFRlbXBsYXRlcygpLm1hcCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcbiAgICAgIHJldHVybiBbW2NoaWxkLmlkXSwgY2hpbGQudGVtcGxhdGVSZWZdO1xuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGVtcGxhdGVBcnJheSk7XG4gIH0pO1xuICByZWFkb25seSBudW1iZXJPZlN1Ykl0ZW1zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIC8vIHJldHVybiAxIC8gdGhpcy5wcmVjaXNpb24oKTtcbiAgICByZXR1cm4gcGFyc2VJbnQoKDEgLyB0aGlzLnByZWNpc2lvbigpKS50b0ZpeGVkKCkpO1xuICB9KTtcbiAgcmVhZG9ubHkgcmF0aW5nSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuaXRlbUNvdW50KCkgfSwgKF8sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMubnVtYmVyT2ZTdWJJdGVtcygpID09PSAxKSB7XG4gICAgICAgIHJldHVybiBbaXRlbUluZGV4ICsgMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5udW1iZXJPZlN1Ykl0ZW1zKCkgfSwgKF8sIHN1YkluZGV4KSA9PiBpdGVtSW5kZXggKyAoc3ViSW5kZXggKyAxKSAqIHRoaXMucHJlY2lzaW9uKCkpO1xuICAgIH0pO1xuICB9KTtcbiAgcmVhZG9ubHkgI2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHJlYWRvbmx5ICNlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJhdGluZzogdHJ1ZSxcbiAgICAgIFtgcmF0aW5nLSR7dGhpcy5zaXplKCl9YF06IHRoaXMuc2l6ZSgpLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQoKSxcbiAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRPbmx5KClcbiAgICB9O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtdmFsdWVub3cnKVxuICBnZXQgYXJpYVZhbHVlTm93KCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlKCk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS12YWx1ZW1heCcpXG4gIGdldCBhcmlhVmFsdWVNYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbUNvdW50KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIG9uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMucmF0aW5nRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKHZhbHVlOiBudW1iZXIgfCBudWxsKSA9PiB7fTtcblxuICByZWFkb25seSB2YWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICB9KTtcblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvLyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgLy8gfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGlzSXRlbUFjdGl2ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbG9jYWxWYWx1ZSA9IHRoaXMuaG92ZXJWYWx1ZSgpID8/IHRoaXMudmFsdWUoKSA/PyAtMTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRPbmx5U2VsZWN0ZWQoKSA/IGxvY2FsVmFsdWUgPT09IHZhbHVlIDogbG9jYWxWYWx1ZSA+PSB2YWx1ZTtcbiAgfVxuXG4gIG5vdExhc3RJdGVtU3R5bGUodmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICB6SW5kZXg6IHRoaXMubnVtYmVyT2ZTdWJJdGVtcygpIC0gdmFsdWUsXG4gICAgICAvLyB6SW5kZXg6IDEgLyB0aGlzLnByZWNpc2lvbigpIC0gdmFsdWUsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHdpZHRoOiBgJHt0aGlzLnByZWNpc2lvbigpICogKHZhbHVlICsgMSkgKiAxMDB9JWAsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBvcGFjaXR5OiAuMVxuICAgIH07XG4gIH1cblxuICBoYW5kbGVDbGljayh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLnJlYWRPbmx5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbGxvd0NsZWFyKCkgJiYgdmFsdWUgPT09IHRoaXMudmFsdWUoKSkge1xuICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyVmFsdWUuc2V0KG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlLnNldCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2xpY2sodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgIHRoaXMuaGFuZGxlTW91c2VFbnRlcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW91c2VFbnRlcih2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLnJlYWRPbmx5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ob3ZlclZhbHVlLnNldChudWxsKTtcbiAgICB0aGlzLmhvdmVyVmFsdWUuc2V0KHZhbHVlKTtcbiAgICB0aGlzLnRvb2x0aXBWYWx1ZS5zZXQodmFsdWUpO1xuICAgIHRoaXMuaG92ZXJWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgZ2V0VG9vbHRpcFZhbHVlKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudG9vbHRpcHMoKSkpIHtcbiAgICAgIGNvbnN0IHRvb2x0aXBzID0gdGhpcy50b29sdGlwcygpIGFzIEFycmF5PHN0cmluZz47XG4gICAgICByZXR1cm4gdG9vbHRpcHNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVjaXNpb24oKSA/IHRoaXMudG9vbHRpcFZhbHVlKCk/LnRvU3RyaW5nKCkgPz8gJycgOiB0aGlzLnJhdGluZ0l0ZW1zKCkgPyAodGhpcy5yYXRpbmdJdGVtcygpW2luZGV4XS5hdCgtMSkgPz8gJycpLnRvU3RyaW5nKCkgOiAnJztcbiAgfVxufVxuIiwiQGZvciAoaXRlbSBvZiByYXRpbmdJdGVtcygpOyB0cmFjayBpdGVtOyBsZXQgaXRlbUluZGV4ID0gJGluZGV4LCBsYXN0ID0gJGxhc3QpIHtcbiAgQGlmICh0b29sdGlwcygpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1pdGVtXCIgW2NUb29sdGlwXT1cImdldFRvb2x0aXBWYWx1ZShpdGVtSW5kZXgpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmF0aW5nSXRlbUxhYmVsOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpdGVtSW5kZXh9XCIgLz5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1pdGVtXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmF0aW5nSXRlbUxhYmVsOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpdGVtSW5kZXh9XCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxufVxuXG48bmctdGVtcGxhdGUgbGV0LWl0ZW0gbGV0LWl0ZW1JbmRleD1cIml0ZW1JbmRleFwiICNyYXRpbmdJdGVtTGFiZWw+XG4gIEBmb3IgKGl0ZW1WYWx1ZSBvZiBpdGVtOyB0cmFjayByYWRpb0luZGV4OyBsZXQgcmFkaW9JbmRleCA9ICRpbmRleCwgbGFzdCA9ICRsYXN0KSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyYXRpbmctaXRlbS1sYWJlbCBkLWlubGluZS1ibG9ja1wiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soaXRlbVZhbHVlKVwiXG4gICAgICAoa2V5dXApPVwiaGFuZGxlS2V5VXAoJGV2ZW50LCBpdGVtVmFsdWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBpc0l0ZW1BY3RpdmUoaXRlbVZhbHVlKSB9XCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZU1vdXNlRW50ZXIoaXRlbVZhbHVlKVwiXG4gICAgICBbbmdTdHlsZV09XCJyYWRpb0luZGV4ICsgMSA8IG51bWJlck9mU3ViSXRlbXMoKSA/IG5vdExhc3RJdGVtU3R5bGUocmFkaW9JbmRleCkgOiB7fVwiXG4gICAgICBbdGFiaW5kZXhdPVwicmF0aW5nRGlzYWJsZWQoKSA/IC0xIDogMFwiXG4gICAgPlxuICAgICAgQGlmIChpY29uVGVtcGxhdGVzKClbaWNvbigpW2l0ZW1JbmRleF0gPz8gaWNvbigpXSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tSWNvblRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpY29uKCk/LltpdGVtSW5kZXhdID8/IGljb24oKX1cIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0SWNvblRlbXBsYXRlXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoaWNvblRlbXBsYXRlcygpW2FjdGl2ZUljb24oKVtpdGVtSW5kZXhdID8/IGFjdGl2ZUljb24oKV0pIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tSWNvbkFjdGl2ZVRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBhY3RpdmVJY29uKCk/LltpdGVtSW5kZXhdID8/IGFjdGl2ZUljb24oKX1cIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Rvb2x0aXBDb250ZW50PlxuICA8c3Bhbj57eyBob3ZlclZhbHVlKCkgfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRJY29uVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJyYXRpbmctaXRlbS1pY29uXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N1c3RvbUljb25UZW1wbGF0ZSBsZXQtaWNvbj5cbiAgPGRpdiBjbGFzcz1cInJhdGluZy1pdGVtLWN1c3RvbS1pY29uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZXMoKT8uW2ljb25dIHx8IGRlZmF1bHRJY29uVGVtcGxhdGVcIiAvPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tSWNvbkFjdGl2ZVRlbXBsYXRlIGxldC1pY29uPlxuICA8ZGl2IGNsYXNzPVwicmF0aW5nLWl0ZW0tY3VzdG9tLWljb24tYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZXMoKT8uW2ljb25dIHx8IGN1c3RvbUljb25UZW1wbGF0ZVwiIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvcmF0aW5nL3JhdGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3JhdGluZy9yYXRpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRSxPQUFPLEVBQUUs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QUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDJEQWtKMkMsbUJBQW1CLGtGQXlCdEIsd0JBQXdCLHVGQ3JPbkUsdzZFQStEQSwrS0RwQkksT0FBTyx5R0FDUCxPQUFPLGdHQUNQLGdCQUFnQix5S0FDQyxnQkFBZ0IsMlBBRWpDLHdCQUF3Qjs7NEZBYWYsZUFBZTtrQkF2QjNCLFNBQVM7K0JBQ0UsVUFBVSxZQUNWLFNBQVMsY0FDUCxJQUFJLFdBQ1A7d0JBQ1AsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDO3dCQUNsQyxtQkFBbUI7d0JBQ25CLHdCQUF3QjtxQkFDekIsYUFHVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OEJBNk4zQyxXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTztnQkFXaEIsWUFBWTtzQkFEZixXQUFXO3VCQUFDLG9CQUFvQjtnQkFNN0IsWUFBWTtzQkFEZixXQUFXO3VCQUFDLG9CQUFvQjtnQkFNN0IsSUFBSTtzQkFEUCxXQUFXO3VCQUFDLFdBQVc7Z0JBTXhCLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c0tleU1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkcmVuLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIElucHV0U2lnbmFsV2l0aFRyYW5zZm9ybSxcbiAgbW9kZWwsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IEVsZW1lbnRSZWZEaXJlY3RpdmUsIFRlbXBsYXRlSWREaXJlY3RpdmUgfSBmcm9tICcuLi9zaGFyZWQnO1xuaW1wb3J0IHsgUmF0aW5nSXRlbUxhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi9yYXRpbmctaXRlbS1sYWJlbC9yYXRpbmctaXRlbS1sYWJlbC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgY29lcmNlU3RyaW5nQXJyYXkgPSAodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10gPT5cbiAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW3ZhbHVlXTtcbmV4cG9ydCBjb25zdCBjb2VyY2VSYXRpbmdQcmVjaXNpb24gPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PlxuICBbMSwgMC41LCAwLjI1XS5pbmNsdWRlcyhudW1iZXJBdHRyaWJ1dGUodmFsdWUpKSA/IG51bWJlckF0dHJpYnV0ZSh2YWx1ZSkgOiAxO1xuZXhwb3J0IGNvbnN0IGNvZXJjZU51bWJlciA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IG51bWJlciA9PiBOdW1iZXIodmFsdWUgPz8gMCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtcmF0aW5nJyxcbiAgZXhwb3J0QXM6ICdjUmF0aW5nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIGZvcndhcmRSZWYoKCkgPT4gVG9vbHRpcERpcmVjdGl2ZSksXG4gICAgRWxlbWVudFJlZkRpcmVjdGl2ZSxcbiAgICBSYXRpbmdJdGVtTGFiZWxDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yYXRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmF0aW5nLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYXRpbmdDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJhdGluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcmVhZG9ubHkgI2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHJlYWRvbmx5ICNlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBpY29uIHRvIGRpc3BsYXkgd2hlbiB0aGUgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICogQHR5cGU6IHN0cmluZyB8IHN0cmluZ1tdXG4gICAqL1xuICByZWFkb25seSBhY3RpdmVJY29uOiBJbnB1dFNpZ25hbFdpdGhUcmFuc2Zvcm08c3RyaW5nW10sIHN0cmluZyB8IHN0cmluZ1tdPiA9IGlucHV0KFtdLCB7XG4gICAgdHJhbnNmb3JtOiBjb2VyY2VTdHJpbmdBcnJheSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIGNsZWFyaW5nIHVwb24gY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGl0ZW0gYWdhaW4uXG4gICAqIEB0eXBlOiBib29sZWFuXG4gICAqIEBkZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dDbGVhciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBkaXNhYmxlZCBzdGF0ZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHR5cGU6IGJvb2xlYW5cbiAgICogQGRlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVhZG9ubHkgI2Rpc2FibGVkU3RhdGUgPSBzaWduYWwodGhpcy5kaXNhYmxlZCgpKTtcblxuICAvKipcbiAgICogSWYgZW5hYmxlZCwgb25seSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGljb24gd2lsbCBiZSB2aXNpYmx5IGhpZ2hsaWdodGVkLlxuICAgKiBAdHlwZTogYm9vbGVhblxuICAgKiBAZGVmYXVsdDogZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGhpZ2hsaWdodE9ubHlTZWxlY3RlZCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGl0ZW0gaXMgbm90IHNlbGVjdGVkLlxuICAgKiBAdHlwZTogc3RyaW5nIHwgc3RyaW5nW11cbiAgICovXG4gIHJlYWRvbmx5IGljb246IElucHV0U2lnbmFsV2l0aFRyYW5zZm9ybTxzdHJpbmdbXSwgc3RyaW5nIHwgc3RyaW5nW10+ID0gaW5wdXQoW10sIHtcbiAgICB0cmFuc2Zvcm06IGNvZXJjZVN0cmluZ0FycmF5LFxuICB9KTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3RhcnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBzdGFyIHJhdGluZyBjb21wb25lbnQuIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgc2NhbGUgb2YgdGhlIHJhdGluZyxcbiAgICogc3VjaCBhcyBvdXQgb2YgNSBzdGFycywgMTAgc3RhcnMsIGV0Yy5cbiAgICogQHR5cGU6IG51bWJlclxuICAgKiBAZGVmYXVsdDogNVxuICAgKi9cbiAgcmVhZG9ubHkgaXRlbUNvdW50ID0gaW5wdXQoNSwgeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogTWluaW11bSBpbmNyZW1lbnQgdmFsdWUgY2hhbmdlIGFsbG93ZWQuXG4gICAqIEB0eXBlOiBudW1iZXJcbiAgICogQGRlZmF1bHQ6IDFcbiAgICovXG4gIHJlYWRvbmx5IHByZWNpc2lvbiA9IGlucHV0KDEsIHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0byBjbGljayBmcmFjdGlvbnNcbiAgICogQHR5cGU6IGJvb2xlYW5cbiAgICogQGRlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICAvLyByZWFkb25seSBwcmVjaXNpb25DbGljayA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSByZWFkb25seSBzdGF0ZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHR5cGU6IGJvb2xlYW5cbiAgICogQGRlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZWFkT25seSA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogU2l6ZSB0aGUgY29tcG9uZW50IHNtYWxsLCBsYXJnZSwgb3IgY3VzdG9tIGlmIHlvdSBkZWZpbmUgY3VzdG9tIGljb25zIHdpdGggY3VzdG9tIGhlaWdodC5cbiAgICogQHR5cGU6ICdzbScgfCAnbGcnIHwgJ2N1c3RvbScgfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZSA9IGlucHV0PCdzbScgfCAnbGcnIHwgJ2N1c3RvbScgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0b29sdGlwcyB3aXRoIGRlZmF1bHQgdmFsdWVzIG9yIHNldCBzcGVjaWZpYyBsYWJlbHMgZm9yIGVhY2ggaWNvbi5cbiAgICogQHR5cGU6IGJvb2xlYW4gfCBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICAgKiBAZGVmYXVsdDogdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSB0b29sdGlwcyA9IGlucHV0PGJvb2xlYW4gfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvKipcbiAgICogVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIGNvbXBvbmVudC5cbiAgICogQHR5cGU6IG51bWJlciB8IG51bGxcbiAgICogQGRlZmF1bHQ6IG51bGxcbiAgICogRW1pdHMgYHZhbHVlQ2hhbmdlYCBvbiB2YWx1ZSBjaGFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlID0gbW9kZWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gaG92ZXJWYWx1ZSBjaGFuZ2UuXG4gICAqIEB0eXBlOiBudW1iZXIgfCBudWxsXG4gICAqL1xuICByZWFkb25seSBob3ZlclZhbHVlID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBob3ZlclZhbHVlQ2hhbmdlID0gb3V0cHV0PG51bWJlciB8IG51bGw+KCk7XG4gIHJlYWRvbmx5IGhvdmVyVmFsdWVFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgdGhpcy5ob3ZlclZhbHVlQ2hhbmdlLmVtaXQodGhpcy5ob3ZlclZhbHVlKCkpO1xuICAgICAgaWYgKCF0aGlzLmhvdmVyVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtLnNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIHJlYWRvbmx5ICNjbGVhcmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaG92ZXJlZEl0ZW0gPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB0b29sdGlwVmFsdWUgPSBzaWduYWw8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgcmF0aW5nRGlzYWJsZWQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5yZWFkT25seSgpIHx8IHRoaXMuI2Rpc2FibGVkU3RhdGUoKSxcbiAgKTtcbiAgcmVhZG9ubHkgcmF0aW5nRGlzYWJsZWRFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdGhpcy5yYXRpbmdEaXNhYmxlZCgpKSB7XG4gICAgICBjb25zdCBmb2N1c0luJCA9IGZyb21FdmVudDxGb2N1c0V2ZW50Pih0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdmb2N1c2luJyk7XG4gICAgICBjb25zdCBmb2N1c091dCQgPSBmcm9tRXZlbnQ8Rm9jdXNFdmVudD4odGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNvdXQnKTtcbiAgICAgIGNvbnN0IG1vdXNlTGVhdmUkID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlbGVhdmUnKTtcblxuICAgICAgbWVyZ2UoZm9jdXNJbiQsIGZvY3VzT3V0JCwgbW91c2VMZWF2ZSQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQpID0+ICF0aGlzLnJhdGluZ0Rpc2FibGVkKCkpLFxuICAgICAgICAgIHRhcCgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKCRldmVudC50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgICAgICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlclZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlV2hpbGUoKCkgPT4gIXRoaXMucmF0aW5nRGlzYWJsZWQoKSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNvbnRlbnRUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVJZERpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgaWNvblRlbXBsYXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZUFycmF5ID0gdGhpcy5jb250ZW50VGVtcGxhdGVzKCkubWFwKChjaGlsZDogVGVtcGxhdGVJZERpcmVjdGl2ZSkgPT4ge1xuICAgICAgcmV0dXJuIFtbY2hpbGQuaWRdLCBjaGlsZC50ZW1wbGF0ZVJlZl07XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0ZW1wbGF0ZUFycmF5KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbnVtYmVyT2ZTdWJJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gcGFyc2VJbnQoKDEgLyB0aGlzLnByZWNpc2lvbigpKS50b0ZpeGVkKCkpO1xuICB9KTtcblxuICByZWFkb25seSByYXRpbmdJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5pdGVtQ291bnQoKSB9LCAoXywgaXRlbUluZGV4KSA9PiB7XG4gICAgICBpZiAodGhpcy5udW1iZXJPZlN1Ykl0ZW1zKCkgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIFtpdGVtSW5kZXggKyAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7IGxlbmd0aDogdGhpcy5udW1iZXJPZlN1Ykl0ZW1zKCkgfSxcbiAgICAgICAgKF8sIHN1YkluZGV4KSA9PiBpdGVtSW5kZXggKyAoc3ViSW5kZXggKyAxKSAqIHRoaXMucHJlY2lzaW9uKCksXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSByYXRpbmdJdGVtTGFiZWxzID0gdmlld0NoaWxkcmVuKFJhdGluZ0l0ZW1MYWJlbENvbXBvbmVudCk7XG4gICNmb2N1c0tleU1hbmFnZXIhOiBGb2N1c0tleU1hbmFnZXI8UmF0aW5nSXRlbUxhYmVsQ29tcG9uZW50PjtcblxuICByZWFkb25seSByYXRpbmdJdGVtTGFiZWxzRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGlmICh1bnRyYWNrZWQodGhpcy5yYXRpbmdEaXNhYmxlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy4jZm9jdXNLZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLnJhdGluZ0l0ZW1MYWJlbHMoKSlcbiAgICAgICAgLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24oJ2x0cicpXG4gICAgICAgIC53aXRoV3JhcCgpO1xuXG4gICAgICBjb25zdCBhY3RpdmVJdGVtSW5kZXggPSB0aGlzLnJhdGluZ0l0ZW1zKClcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUgPT09IGNvZXJjZU51bWJlcih0aGlzLnZhbHVlKCkgPz8gMCkpO1xuXG4gICAgICB0aGlzLiNmb2N1c0tleU1hbmFnZXI/LnVwZGF0ZUFjdGl2ZUl0ZW0oYWN0aXZlSXRlbUluZGV4IDwgMCA/IDAgOiBhY3RpdmVJdGVtSW5kZXgpO1xuXG4gICAgICB0aGlzLiNmb2N1c0tleU1hbmFnZXIudGFiT3V0XG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlSXRlbUluZGV4ID0gdW50cmFja2VkKHRoaXMucmF0aW5nSXRlbXMpXG4gICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgICAgLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSBjb2VyY2VOdW1iZXIodW50cmFja2VkKHRoaXMudmFsdWUpID8/IDApKTtcblxuICAgICAgICAgICAgdGhpcy4jZm9jdXNLZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oYWN0aXZlSXRlbUluZGV4ID09PSAtMSA/IDAgOiBhY3RpdmVJdGVtSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVJdGVtcygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMuI2ZvY3VzS2V5TWFuYWdlci5jaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yYXRpbmdJdGVtTGFiZWxzKCkuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGxhYmVsLmZvY3VzYWJsZS5zZXQoaW5kZXggPT09IHRoaXMuI2ZvY3VzS2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI2ZvY3VzS2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHVudHJhY2tlZChsYWJlbC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljayh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmF0aW5nOiB0cnVlLFxuICAgICAgW2ByYXRpbmctJHt0aGlzLnNpemUoKX1gXTogdGhpcy5zaXplKCksXG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuI2Rpc2FibGVkU3RhdGUoKSxcbiAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRPbmx5KCksXG4gICAgfTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXZhbHVlbm93JylcbiAgZ2V0IGFyaWFWYWx1ZU5vdygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSgpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtdmFsdWVtYXgnKVxuICBnZXQgYXJpYVZhbHVlTWF4KCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1Db3VudCgpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICBnZXQgcm9sZSgpIHtcbiAgICByZXR1cm4gJ3JhZGlvZ3JvdXAnO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5ZG93bigkZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnJhdGluZ0Rpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMucmF0aW5nSXRlbUxhYmVscygpLmZpbmQoXG4gICAgICAgIChsYWJlbCwgaW5kZXgpID0+IGluZGV4ID09PSB0aGlzLiNmb2N1c0tleU1hbmFnZXI/LmFjdGl2ZUl0ZW1JbmRleCxcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKGl0ZW0/LnZhbHVlKCkgPz8gLTEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddLmluY2x1ZGVzKCRldmVudC5rZXkpKSB7XG4gICAgICB0aGlzLiNmb2N1c0tleU1hbmFnZXIub25LZXlkb3duKCRldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbJ1RhYiddLmluY2x1ZGVzKCRldmVudC5rZXkpKSB7XG4gICAgICB0aGlzLiNmb2N1c0tleU1hbmFnZXI/LnRhYk91dC5uZXh0KCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKHZhbHVlOiBudW1iZXIgfCBudWxsKSA9PiB7fTtcblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuI2Rpc2FibGVkU3RhdGUuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGlzSXRlbUFjdGl2ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbG9jYWxWYWx1ZSA9IHRoaXMuaG92ZXJWYWx1ZSgpID8/IHRoaXMudmFsdWUoKSA/PyAtMTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRPbmx5U2VsZWN0ZWQoKSA/IGxvY2FsVmFsdWUgPT09IHZhbHVlIDogbG9jYWxWYWx1ZSA+PSB2YWx1ZTtcbiAgfVxuXG4gIG5vdExhc3RJdGVtU3R5bGUodmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICB6SW5kZXg6IHRoaXMubnVtYmVyT2ZTdWJJdGVtcygpIC0gdmFsdWUsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHdpZHRoOiBgJHt0aGlzLnByZWNpc2lvbigpICogKHZhbHVlICsgMSkgKiAxMDB9JWAsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBvcGFjaXR5OiAwLjEsXG4gICAgfTtcbiAgfVxuXG4gIGhhbmRsZUZvY3VzSW4oJGV2ZW50OiBGb2N1c0V2ZW50LCBpdGVtVmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuaGFuZGxlTW91c2VFbnRlcigkZXZlbnQgYXMgTW91c2VFdmVudCwgaXRlbVZhbHVlKTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yYXRpbmdEaXNhYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmFsbG93Q2xlYXIoKSAmJiB2YWx1ZSA9PT0gdGhpcy52YWx1ZSgpKSB7XG4gICAgICB0aGlzLiNjbGVhcmVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlclZhbHVlLnNldChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vdXNlRW50ZXIoJGV2ZW50OiBNb3VzZUV2ZW50LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmF0aW5nRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhvdmVyVmFsdWUuc2V0KG51bGwpO1xuICAgIHRoaXMuaG92ZXJWYWx1ZS5zZXQodmFsdWUpO1xuICAgIHRoaXMudG9vbHRpcFZhbHVlLnNldCh2YWx1ZSk7XG4gIH1cblxuICBnZXRUb29sdGlwVmFsdWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmhvdmVyVmFsdWUoKSB8fCB0aGlzLmhvdmVyZWRJdGVtKCkgIT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnRvb2x0aXBzKCkpKSB7XG4gICAgICBjb25zdCB0b29sdGlwcyA9IHRoaXMudG9vbHRpcHMoKSBhcyBBcnJheTxzdHJpbmc+O1xuICAgICAgcmV0dXJuIHRvb2x0aXBzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJlY2lzaW9uKClcbiAgICAgID8gdGhpcy50b29sdGlwVmFsdWUoKT8udG9TdHJpbmcoKSA/PyAnJ1xuICAgICAgOiB0aGlzLnJhdGluZ0l0ZW1zKClcbiAgICAgICAgPyAodGhpcy5yYXRpbmdJdGVtcygpW2luZGV4XS5hdCgtMSkgPz8gJycpLnRvU3RyaW5nKClcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHVwZGF0ZUZvY3VzYWJsZUl0ZW1zKCkge1xuICAgIHRoaXMucmF0aW5nSXRlbUxhYmVscygpLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgbGFiZWwuZm9jdXNhYmxlLnNldChpbmRleCA9PT0gdGhpcy4jZm9jdXNLZXlNYW5hZ2VyPy5hY3RpdmVJdGVtSW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8ga2VlcCBpdCBhdCB0aGUgYm90dG9tIG9mIHRoZSBjb2RlXG4gIHJlYWRvbmx5IHZhbHVlRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHJhdGluZ1ZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgdGhpcy5vbkNoYW5nZShyYXRpbmdWYWx1ZSk7XG5cbiAgICAgIGlmICh1bnRyYWNrZWQodGhpcy5yYXRpbmdEaXNhYmxlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodW50cmFja2VkKHRoaXMuI2NsZWFyZWQpKSB7XG4gICAgICAgIHRoaXMuI2NsZWFyZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5yYXRpbmdJdGVtcygpXG4gICAgICAgIC5mbGF0KClcbiAgICAgICAgLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSBjb2VyY2VOdW1iZXIocmF0aW5nVmFsdWUgPz8gMCkpO1xuXG4gICAgICB0aGlzLiNmb2N1c0tleU1hbmFnZXI/LnVwZGF0ZUFjdGl2ZUl0ZW0oYWN0aXZlSXRlbUluZGV4IDwgMCA/IDAgOiBhY3RpdmVJdGVtSW5kZXgpO1xuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVJdGVtcygpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xufVxuIiwiQGZvciAoaXRlbSBvZiByYXRpbmdJdGVtcygpOyB0cmFjayBpdGVtOyBsZXQgaXRlbUluZGV4ID0gJGluZGV4LCBsYXN0ID0gJGxhc3QpIHtcbiAgQGlmICh0b29sdGlwcygpKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyYXRpbmctaXRlbVwiXG4gICAgICBbY1Rvb2x0aXBdPVwiZ2V0VG9vbHRpcFZhbHVlKGl0ZW1JbmRleClcIlxuICAgICAgW2NUb29sdGlwVHJpZ2dlcl09XCJbJ2hvdmVyJywgJ2ZvY3VzaW4nXVwiXG4gICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkSXRlbS5zZXQoaXRlbUluZGV4KVwiXG4gICAgICAoZm9jdXNpbik9XCJob3ZlcmVkSXRlbS5zZXQoaXRlbUluZGV4KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJhdGluZ0l0ZW1MYWJlbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGl0ZW1JbmRleCB9XCIgLz5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1pdGVtXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmF0aW5nSXRlbUxhYmVsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSwgaXRlbUluZGV4IH1cIiAvPlxuICAgIDwvZGl2PlxuICB9XG59XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBsZXQtaXRlbUluZGV4PVwiaXRlbUluZGV4XCIgI3JhdGluZ0l0ZW1MYWJlbD5cbiAgQGZvciAoaXRlbVZhbHVlIG9mIGl0ZW07IHRyYWNrIHJhZGlvSW5kZXg7IGxldCByYWRpb0luZGV4ID0gJGluZGV4LCBsYXN0ID0gJGxhc3QpIHtcbiAgICA8Yy1yYXRpbmctaXRlbS1sYWJlbFxuICAgICAgY2xhc3M9XCJyYXRpbmctaXRlbS1sYWJlbCBkLWlubGluZS1ibG9ja1wiXG4gICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKGl0ZW1WYWx1ZSlcIlxuICAgICAgKGZvY3VzKT1cImhhbmRsZUZvY3VzSW4oJGV2ZW50LCBpdGVtVmFsdWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBpc0l0ZW1BY3RpdmUoaXRlbVZhbHVlKSB9XCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZU1vdXNlRW50ZXIoJGV2ZW50LCBpdGVtVmFsdWUpXCJcbiAgICAgIFtuZ1N0eWxlXT1cInJhZGlvSW5kZXggKyAxIDwgbnVtYmVyT2ZTdWJJdGVtcygpID8gbm90TGFzdEl0ZW1TdHlsZShyYWRpb0luZGV4KSA6IHt9XCJcbiAgICAgIFt2YWx1ZV09XCJpdGVtVmFsdWVcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtVmFsdWVcIlxuICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cIml0ZW1WYWx1ZSA9PT0gdmFsdWUoKVwiXG4gICAgPlxuICAgICAgQGlmIChpY29uVGVtcGxhdGVzKClbaWNvbigpW2l0ZW1JbmRleF0gPz8gaWNvbigpXSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tSWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaWNvbigpPy5baXRlbUluZGV4XSA/PyBpY29uKCkgfVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlZmF1bHRJY29uVGVtcGxhdGVcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChpY29uVGVtcGxhdGVzKClbYWN0aXZlSWNvbigpW2l0ZW1JbmRleF0gPz8gYWN0aXZlSWNvbigpXSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tSWNvbkFjdGl2ZVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogYWN0aXZlSWNvbigpPy5baXRlbUluZGV4XSA/PyBhY3RpdmVJY29uKCkgfVwiIC8+XG4gICAgICB9XG4gICAgPC9jLXJhdGluZy1pdGVtLWxhYmVsPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Rvb2x0aXBDb250ZW50PlxuICA8c3Bhbj57eyBob3ZlclZhbHVlKCkgfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRJY29uVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJyYXRpbmctaXRlbS1pY29uXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N1c3RvbUljb25UZW1wbGF0ZSBsZXQtaWNvbj5cbiAgPGRpdiBjbGFzcz1cInJhdGluZy1pdGVtLWN1c3RvbS1pY29uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZXMoKT8uW2ljb25dIHx8IGRlZmF1bHRJY29uVGVtcGxhdGVcIiAvPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tSWNvbkFjdGl2ZVRlbXBsYXRlIGxldC1pY29uPlxuICA8ZGl2IGNsYXNzPVwicmF0aW5nLWl0ZW0tY3VzdG9tLWljb24tYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZXMoKT8uW2ljb25dIHx8IGN1c3RvbUljb25UZW1wbGF0ZVwiIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==