desy-angular 14.1.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/desy-angular.mjs +1842 -1402
  3. package/fesm2022/desy-angular.mjs.map +1 -1
  4. package/index.d.ts +3 -0
  5. package/lib/desy-forms/components/character-count/character-count.component.d.ts +1 -8
  6. package/lib/desy-forms/components/checkboxes/checkboxes-parent.component.d.ts +8 -0
  7. package/lib/desy-forms/components/checkboxes/checkboxes.component.d.ts +26 -0
  8. package/lib/desy-forms/components/date-input/date-input.component.d.ts +13 -7
  9. package/lib/desy-forms/components/datepicker/datepicker.component.d.ts +1 -5
  10. package/lib/desy-forms/components/fieldset/fieldset.component.d.ts +7 -0
  11. package/lib/desy-forms/components/file-upload/file-upload.component.d.ts +5 -0
  12. package/lib/desy-forms/components/input/input.component.d.ts +1 -4
  13. package/lib/desy-forms/components/input-group/input-group.component.d.ts +7 -0
  14. package/lib/desy-forms/components/label/label.component.d.ts +1 -2
  15. package/lib/desy-forms/components/radios/radios-parent.component.d.ts +8 -0
  16. package/lib/desy-forms/components/radios/radios.component.d.ts +26 -0
  17. package/lib/desy-forms/components/search-bar/search-bar.component.d.ts +1 -2
  18. package/lib/desy-forms/components/select/option/option.component.d.ts +1 -2
  19. package/lib/desy-forms/components/textarea/textarea.component.d.ts +1 -3
  20. package/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.d.ts +1 -1
  21. package/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.d.ts +3 -3
  22. package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +11 -7
  23. package/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.d.ts +1 -1
  24. package/lib/desy-forms/components/tree/tree-sub/tree-sub.component.d.ts +2 -2
  25. package/lib/desy-forms/components/tree/tree.component.d.ts +67 -7
  26. package/lib/desy-forms/directives/condition.directive.d.ts +5 -0
  27. package/lib/desy-forms/interfaces/select-item-data.d.ts +1 -1
  28. package/lib/desy-modals/components/dialog/dialog.component.d.ts +1 -1
  29. package/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.d.ts +2 -2
  30. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.d.ts +7 -0
  31. package/lib/desy-nav/components/header/header-subnav/header-subnav.component.d.ts +1 -1
  32. package/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.d.ts +2 -2
  33. package/lib/desy-nav/components/menubar/menubar.component.d.ts +7 -0
  34. package/lib/desy-nav/interfaces/header-dropdown-data.d.ts +1 -1
  35. package/lib/desy-nav/interfaces/header-mobile-text-data.d.ts +1 -1
  36. package/lib/desy-nav/interfaces/header-subnav-data.d.ts +1 -1
  37. package/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.d.ts +2 -2
  38. package/lib/desy-nav/interfaces/nav-item-event.data.d.ts +1 -1
  39. package/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.d.ts +1 -1
  40. package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +56 -1
  41. package/lib/desy-tables/directives/cell.directive.d.ts +3 -0
  42. package/lib/desy-tables/directives/row.directive.d.ts +7 -0
  43. package/lib/desy-tables/interfaces/head-cell-data.d.ts +1 -1
  44. package/lib/desy-views/components/alert/alert.component.d.ts +1 -1
  45. package/lib/shared/components/accessibility/accessibility.component.d.ts +3 -0
  46. package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +8 -0
  47. package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +6 -0
  48. package/lib/shared/components/content-base/content-base.component.d.ts +3 -0
  49. package/lib/shared/components/text-or-html-required/text-or-html-required.component.d.ts +4 -0
  50. package/lib/shared/decorators/desy-content-child.decorator.d.ts +11 -0
  51. package/lib/shared/decorators/desy-on-input-change.decorator.d.ts +4 -0
  52. package/lib/shared/directives/content-change.directive.d.ts +4 -0
  53. package/lib/shared/directives/custom-inner-content.directive.d.ts +6 -0
  54. package/lib/shared/pipes/external-href.pipe.d.ts +4 -0
  55. package/lib/shared/utils/search-utils.d.ts +10 -0
  56. package/lib/shared/utils/string-utils.d.ts +7 -0
  57. package/package.json +9 -11
  58. package/esm2022/desy-angular.mjs +0 -2
  59. package/esm2022/lib/desy-angular.module.mjs +0 -76
  60. package/esm2022/lib/desy-buttons/components/button/button.component.mjs +0 -118
  61. package/esm2022/lib/desy-buttons/components/button-loader/button-loader.component.mjs +0 -66
  62. package/esm2022/lib/desy-buttons/components/dropdown/dropdown.component.mjs +0 -158
  63. package/esm2022/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +0 -39
  64. package/esm2022/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.mjs +0 -14
  65. package/esm2022/lib/desy-buttons/components/listbox/listbox.component.mjs +0 -335
  66. package/esm2022/lib/desy-buttons/components/pill/pill.component.mjs +0 -83
  67. package/esm2022/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.mjs +0 -17
  68. package/esm2022/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.mjs +0 -17
  69. package/esm2022/lib/desy-buttons/components/toggle/toggle.component.mjs +0 -62
  70. package/esm2022/lib/desy-buttons/desy-buttons.module.mjs +0 -81
  71. package/esm2022/lib/desy-buttons/interfaces/listbox-item-data.mjs +0 -2
  72. package/esm2022/lib/desy-buttons/interfaces/listbox-label-data.mjs +0 -2
  73. package/esm2022/lib/desy-commons/components/content/content.component.mjs +0 -14
  74. package/esm2022/lib/desy-commons/components/description/description.component.mjs +0 -19
  75. package/esm2022/lib/desy-commons/components/divider/divider.component.mjs +0 -16
  76. package/esm2022/lib/desy-commons/components/icon/icon.component.mjs +0 -16
  77. package/esm2022/lib/desy-commons/components/title/title.component.mjs +0 -17
  78. package/esm2022/lib/desy-commons/desy-commons.module.mjs +0 -52
  79. package/esm2022/lib/desy-commons/interfaces/content-data.mjs +0 -2
  80. package/esm2022/lib/desy-commons/interfaces/description-data.mjs +0 -2
  81. package/esm2022/lib/desy-commons/interfaces/divider-data.mjs +0 -2
  82. package/esm2022/lib/desy-commons/interfaces/icon-data.mjs +0 -2
  83. package/esm2022/lib/desy-commons/interfaces/index.mjs +0 -6
  84. package/esm2022/lib/desy-commons/interfaces/title-data.mjs +0 -2
  85. package/esm2022/lib/desy-forms/components/character-count/character-count.component.mjs +0 -156
  86. package/esm2022/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +0 -189
  87. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes-parent.component.mjs +0 -15
  88. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +0 -269
  89. package/esm2022/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.mjs +0 -55
  90. package/esm2022/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.mjs +0 -19
  91. package/esm2022/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.mjs +0 -42
  92. package/esm2022/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.mjs +0 -55
  93. package/esm2022/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.mjs +0 -51
  94. package/esm2022/lib/desy-forms/components/date-input/date-input.component.mjs +0 -294
  95. package/esm2022/lib/desy-forms/components/datepicker/datepicker.component.mjs +0 -190
  96. package/esm2022/lib/desy-forms/components/datepicker/datepicker.pipe.mjs +0 -34
  97. package/esm2022/lib/desy-forms/components/error-message/error-message.component.mjs +0 -32
  98. package/esm2022/lib/desy-forms/components/fieldset/fieldset.component.mjs +0 -59
  99. package/esm2022/lib/desy-forms/components/fieldset/legend/legend.component.mjs +0 -34
  100. package/esm2022/lib/desy-forms/components/file-upload/file-upload.component.mjs +0 -78
  101. package/esm2022/lib/desy-forms/components/form-field/form-field.component.mjs +0 -120
  102. package/esm2022/lib/desy-forms/components/hint/hint.component.mjs +0 -30
  103. package/esm2022/lib/desy-forms/components/input/input.component.mjs +0 -110
  104. package/esm2022/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.mjs +0 -20
  105. package/esm2022/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.mjs +0 -59
  106. package/esm2022/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.mjs +0 -42
  107. package/esm2022/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.mjs +0 -51
  108. package/esm2022/lib/desy-forms/components/input-group/input-group.component.mjs +0 -229
  109. package/esm2022/lib/desy-forms/components/label/label.component.mjs +0 -39
  110. package/esm2022/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +0 -136
  111. package/esm2022/lib/desy-forms/components/radios/radios-parent.component.mjs +0 -15
  112. package/esm2022/lib/desy-forms/components/radios/radios.component.mjs +0 -282
  113. package/esm2022/lib/desy-forms/components/search-bar/search-bar.component.mjs +0 -65
  114. package/esm2022/lib/desy-forms/components/select/option/option.component.mjs +0 -22
  115. package/esm2022/lib/desy-forms/components/select/option-group/option-group.component.mjs +0 -18
  116. package/esm2022/lib/desy-forms/components/select/select-item/select-item.component.mjs +0 -14
  117. package/esm2022/lib/desy-forms/components/select/select.component.mjs +0 -94
  118. package/esm2022/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.mjs +0 -12
  119. package/esm2022/lib/desy-forms/components/textarea/textarea.component.mjs +0 -86
  120. package/esm2022/lib/desy-forms/components/tree/interfaces/itree-item.mjs +0 -3
  121. package/esm2022/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.mjs +0 -2
  122. package/esm2022/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +0 -174
  123. package/esm2022/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +0 -378
  124. package/esm2022/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.mjs +0 -25
  125. package/esm2022/lib/desy-forms/components/tree/tree-sub/tree-sub.component.mjs +0 -16
  126. package/esm2022/lib/desy-forms/components/tree/tree.component.mjs +0 -359
  127. package/esm2022/lib/desy-forms/desy-forms.module.mjs +0 -223
  128. package/esm2022/lib/desy-forms/directives/condition.directive.mjs +0 -34
  129. package/esm2022/lib/desy-forms/interfaces/error-message-data.mjs +0 -2
  130. package/esm2022/lib/desy-forms/interfaces/fieldset-data.mjs +0 -2
  131. package/esm2022/lib/desy-forms/interfaces/hint-data.mjs +0 -2
  132. package/esm2022/lib/desy-forms/interfaces/index.mjs +0 -13
  133. package/esm2022/lib/desy-forms/interfaces/item-checkbox-data.mjs +0 -2
  134. package/esm2022/lib/desy-forms/interfaces/item-date-input-data.mjs +0 -2
  135. package/esm2022/lib/desy-forms/interfaces/item-divider-date-input-data.mjs +0 -2
  136. package/esm2022/lib/desy-forms/interfaces/item-divider-input-group-data.mjs +0 -2
  137. package/esm2022/lib/desy-forms/interfaces/item-input-group-data.mjs +0 -2
  138. package/esm2022/lib/desy-forms/interfaces/item-radio-data.mjs +0 -2
  139. package/esm2022/lib/desy-forms/interfaces/item-radio-with-template-data.mjs +0 -2
  140. package/esm2022/lib/desy-forms/interfaces/label-data.mjs +0 -2
  141. package/esm2022/lib/desy-forms/interfaces/legend-data.mjs +0 -2
  142. package/esm2022/lib/desy-forms/interfaces/select-item-data.mjs +0 -2
  143. package/esm2022/lib/desy-modals/components/dialog/dialog.component.mjs +0 -151
  144. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.mjs +0 -25
  145. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.mjs +0 -23
  146. package/esm2022/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.mjs +0 -23
  147. package/esm2022/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.mjs +0 -23
  148. package/esm2022/lib/desy-modals/components/modal/modal.component.mjs +0 -183
  149. package/esm2022/lib/desy-modals/desy-modals.module.mjs +0 -61
  150. package/esm2022/lib/desy-modals/interfaces/dialog-options.mjs +0 -2
  151. package/esm2022/lib/desy-modals/interfaces/index.mjs +0 -7
  152. package/esm2022/lib/desy-modals/interfaces/modal-button-data.mjs +0 -2
  153. package/esm2022/lib/desy-modals/interfaces/modal-data.mjs +0 -2
  154. package/esm2022/lib/desy-modals/interfaces/modal-icon-data.mjs +0 -2
  155. package/esm2022/lib/desy-modals/interfaces/modal-options.mjs +0 -2
  156. package/esm2022/lib/desy-modals/interfaces/open-dialog-result.mjs +0 -2
  157. package/esm2022/lib/desy-modals/services/dialog.service.mjs +0 -114
  158. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.mjs +0 -16
  159. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +0 -53
  160. package/esm2022/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.mjs +0 -19
  161. package/esm2022/lib/desy-nav/components/error-summary/error-summary.component.mjs +0 -67
  162. package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.mjs +0 -25
  163. package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta.component.mjs +0 -31
  164. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.mjs +0 -25
  165. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +0 -21
  166. package/esm2022/lib/desy-nav/components/footer/footer.component.mjs +0 -89
  167. package/esm2022/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.mjs +0 -15
  168. package/esm2022/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.mjs +0 -46
  169. package/esm2022/lib/desy-nav/components/header/header-mobileText/header-mobile-text.component.mjs +0 -336
  170. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.mjs +0 -31
  171. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +0 -36
  172. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.mjs +0 -20
  173. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.mjs +0 -15
  174. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.mjs +0 -93
  175. package/esm2022/lib/desy-nav/components/header/header-subnav/header-subnav.component.mjs +0 -41
  176. package/esm2022/lib/desy-nav/components/header/header.component.mjs +0 -119
  177. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-custom-navigation/header-custom-navigation.component.mjs +0 -14
  178. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.mjs +0 -38
  179. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-logo/header-advanced-logo.component.mjs +0 -37
  180. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-sub/header-advanced-sub.component.mjs +0 -42
  181. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-subtitle/header-advanced-subtitle.component.mjs +0 -14
  182. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-super/header-advanced-super.component.mjs +0 -42
  183. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title/header-advanced-title.component.mjs +0 -19
  184. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title-container/header-advanced-title-container.component.mjs +0 -38
  185. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced.component.mjs +0 -54
  186. package/esm2022/lib/desy-nav/components/header-mini/header-mini.component.mjs +0 -32
  187. package/esm2022/lib/desy-nav/components/links-list/links-list-icon-right/links-list-icon-right.component.mjs +0 -16
  188. package/esm2022/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.mjs +0 -46
  189. package/esm2022/lib/desy-nav/components/links-list/links-list-item-sub/links-list-item-sub.component.mjs +0 -14
  190. package/esm2022/lib/desy-nav/components/links-list/links-list.component.mjs +0 -44
  191. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.mjs +0 -42
  192. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +0 -76
  193. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +0 -55
  194. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.mjs +0 -49
  195. package/esm2022/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +0 -854
  196. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +0 -44
  197. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.mjs +0 -18
  198. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.mjs +0 -34
  199. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +0 -102
  200. package/esm2022/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +0 -51
  201. package/esm2022/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.mjs +0 -14
  202. package/esm2022/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.mjs +0 -36
  203. package/esm2022/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.mjs +0 -27
  204. package/esm2022/lib/desy-nav/components/menubar/directives/menubaritem.directive.mjs +0 -45
  205. package/esm2022/lib/desy-nav/components/menubar/menubar.component.mjs +0 -962
  206. package/esm2022/lib/desy-nav/components/nav/nav-item/nav-item.component.mjs +0 -43
  207. package/esm2022/lib/desy-nav/components/nav/nav.component.mjs +0 -115
  208. package/esm2022/lib/desy-nav/components/notification/notification-item/notification-item.component.mjs +0 -25
  209. package/esm2022/lib/desy-nav/components/notification/notification.component.mjs +0 -135
  210. package/esm2022/lib/desy-nav/components/skip-link/skip-link.component.mjs +0 -62
  211. package/esm2022/lib/desy-nav/desy-nav.module.mjs +0 -301
  212. package/esm2022/lib/desy-nav/directives/dynamic-heading.directive.mjs +0 -40
  213. package/esm2022/lib/desy-nav/interfaces/breadcrumbs.data.mjs +0 -2
  214. package/esm2022/lib/desy-nav/interfaces/error-summary-data.mjs +0 -2
  215. package/esm2022/lib/desy-nav/interfaces/footer-data.mjs +0 -2
  216. package/esm2022/lib/desy-nav/interfaces/footer-logo.mjs +0 -10
  217. package/esm2022/lib/desy-nav/interfaces/header-advanced-logo.mjs +0 -7
  218. package/esm2022/lib/desy-nav/interfaces/header-dropdown-data.mjs +0 -2
  219. package/esm2022/lib/desy-nav/interfaces/header-mobile-text-data.mjs +0 -2
  220. package/esm2022/lib/desy-nav/interfaces/header-navigation-data.mjs +0 -2
  221. package/esm2022/lib/desy-nav/interfaces/header-navigation-item-data.mjs +0 -2
  222. package/esm2022/lib/desy-nav/interfaces/header-offcanvas-data.mjs +0 -2
  223. package/esm2022/lib/desy-nav/interfaces/header-skiplink-data.mjs +0 -2
  224. package/esm2022/lib/desy-nav/interfaces/header-subnav-data.mjs +0 -2
  225. package/esm2022/lib/desy-nav/interfaces/index.mjs +0 -21
  226. package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-data.mjs +0 -2
  227. package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-event-data.mjs +0 -2
  228. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.mjs +0 -2
  229. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item.mjs +0 -2
  230. package/esm2022/lib/desy-nav/interfaces/menu-navigation.mjs +0 -2
  231. package/esm2022/lib/desy-nav/interfaces/menu-vertical-items-data.mjs +0 -2
  232. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-data.mjs +0 -2
  233. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-items-data.mjs +0 -2
  234. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.mjs +0 -2
  235. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item.mjs +0 -2
  236. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub.mjs +0 -2
  237. package/esm2022/lib/desy-nav/interfaces/menubar-item.mjs +0 -2
  238. package/esm2022/lib/desy-nav/interfaces/nav-item-event.data.mjs +0 -2
  239. package/esm2022/lib/desy-nav/interfaces/nav-item.data.mjs +0 -2
  240. package/esm2022/lib/desy-nav/interfaces/notification-items-data.mjs +0 -2
  241. package/esm2022/lib/desy-nav/interfaces/notification-options.mjs +0 -2
  242. package/esm2022/lib/desy-pagination/components/pagination/pagination.component.mjs +0 -237
  243. package/esm2022/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.mjs +0 -19
  244. package/esm2022/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.mjs +0 -17
  245. package/esm2022/lib/desy-pagination/desy-pagination.module.mjs +0 -54
  246. package/esm2022/lib/desy-pagination/interfaces/pagination-item.data.mjs +0 -2
  247. package/esm2022/lib/desy-tables/components/table/components/table-caption.component.mjs +0 -17
  248. package/esm2022/lib/desy-tables/components/table/components/table-cell.component.mjs +0 -23
  249. package/esm2022/lib/desy-tables/components/table/components/table-footer.component.mjs +0 -18
  250. package/esm2022/lib/desy-tables/components/table/components/table-header.component.mjs +0 -18
  251. package/esm2022/lib/desy-tables/components/table/components/table-row.component.mjs +0 -18
  252. package/esm2022/lib/desy-tables/components/table/table.component.mjs +0 -120
  253. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer-cell.component.mjs +0 -23
  254. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer.component.mjs +0 -27
  255. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.mjs +0 -56
  256. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.mjs +0 -18
  257. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.mjs +0 -23
  258. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.mjs +0 -27
  259. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.mjs +0 -28
  260. package/esm2022/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +0 -494
  261. package/esm2022/lib/desy-tables/desy-tables.module.mjs +0 -117
  262. package/esm2022/lib/desy-tables/directives/cell.directive.mjs +0 -25
  263. package/esm2022/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +0 -86
  264. package/esm2022/lib/desy-tables/directives/row.directive.mjs +0 -22
  265. package/esm2022/lib/desy-tables/interfaces/cell-data.mjs +0 -2
  266. package/esm2022/lib/desy-tables/interfaces/head-cell-data.mjs +0 -7
  267. package/esm2022/lib/desy-tables/interfaces/index.mjs +0 -5
  268. package/esm2022/lib/desy-tables/interfaces/recalculate-table-params.mjs +0 -2
  269. package/esm2022/lib/desy-tables/interfaces/row-data.mjs +0 -2
  270. package/esm2022/lib/desy-tables/interfaces/wrapper-data.mjs +0 -2
  271. package/esm2022/lib/desy-views/components/accordion/accordion-header/accordion-header.component.mjs +0 -17
  272. package/esm2022/lib/desy-views/components/accordion/accordion-item/accordion-item.component.mjs +0 -61
  273. package/esm2022/lib/desy-views/components/accordion/accordion.component.mjs +0 -447
  274. package/esm2022/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.mjs +0 -41
  275. package/esm2022/lib/desy-views/components/accordion-history/accordion-history.component.mjs +0 -20
  276. package/esm2022/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.mjs +0 -17
  277. package/esm2022/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.mjs +0 -17
  278. package/esm2022/lib/desy-views/components/alert/alert.component.mjs +0 -82
  279. package/esm2022/lib/desy-views/components/card/card-sectors/card-left.component.mjs +0 -21
  280. package/esm2022/lib/desy-views/components/card/card-sectors/card-right.component.mjs +0 -21
  281. package/esm2022/lib/desy-views/components/card/card-sectors/card-sub.component.mjs +0 -21
  282. package/esm2022/lib/desy-views/components/card/card-sectors/card-super.component.mjs +0 -21
  283. package/esm2022/lib/desy-views/components/card/card.component.mjs +0 -48
  284. package/esm2022/lib/desy-views/components/collapsible/collapsible.component.mjs +0 -66
  285. package/esm2022/lib/desy-views/components/description-list/definition/definition.component.mjs +0 -19
  286. package/esm2022/lib/desy-views/components/description-list/description-item/description-item.component.mjs +0 -36
  287. package/esm2022/lib/desy-views/components/description-list/description-list.component.mjs +0 -29
  288. package/esm2022/lib/desy-views/components/description-list/term/term.component.mjs +0 -19
  289. package/esm2022/lib/desy-views/components/details/details.component.mjs +0 -43
  290. package/esm2022/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.mjs +0 -17
  291. package/esm2022/lib/desy-views/components/item/item-content-right/item-content-right.component.mjs +0 -15
  292. package/esm2022/lib/desy-views/components/item/item-item/item-item.component.mjs +0 -15
  293. package/esm2022/lib/desy-views/components/item/item.component.mjs +0 -122
  294. package/esm2022/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.mjs +0 -12
  295. package/esm2022/lib/desy-views/components/media-object/media-object.component.mjs +0 -369
  296. package/esm2022/lib/desy-views/components/status/status.component.mjs +0 -366
  297. package/esm2022/lib/desy-views/components/status-item/status-item.component.mjs +0 -401
  298. package/esm2022/lib/desy-views/components/tabs/panel/panel.component.mjs +0 -19
  299. package/esm2022/lib/desy-views/components/tabs/tab-item/tab-item.component.mjs +0 -41
  300. package/esm2022/lib/desy-views/components/tabs/tabs.component.mjs +0 -445
  301. package/esm2022/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.mjs +0 -12
  302. package/esm2022/lib/desy-views/components/tooltip/tooltip.component.mjs +0 -444
  303. package/esm2022/lib/desy-views/desy-views.module.mjs +0 -195
  304. package/esm2022/lib/desy-views/interfaces/accordion-header.data.mjs +0 -2
  305. package/esm2022/lib/desy-views/interfaces/accordion-item.data.mjs +0 -2
  306. package/esm2022/lib/desy-views/interfaces/alert-options.mjs +0 -2
  307. package/esm2022/lib/desy-views/interfaces/description-item.data.mjs +0 -2
  308. package/esm2022/lib/desy-views/interfaces/index.mjs +0 -11
  309. package/esm2022/lib/desy-views/interfaces/open-alert-result.mjs +0 -2
  310. package/esm2022/lib/desy-views/interfaces/status-data.mjs +0 -2
  311. package/esm2022/lib/desy-views/interfaces/status-icon-data.mjs +0 -2
  312. package/esm2022/lib/desy-views/interfaces/status-item-title-data.mjs +0 -2
  313. package/esm2022/lib/desy-views/interfaces/tabs-items-data.mjs +0 -2
  314. package/esm2022/lib/desy-views/interfaces/tabs-panel-data.mjs +0 -2
  315. package/esm2022/lib/desy-views/interfaces/term-definition.data.mjs +0 -2
  316. package/esm2022/lib/desy-views/services/alert.service.mjs +0 -88
  317. package/esm2022/lib/shared/components/accessibility/accessibility-attributes.mjs +0 -78
  318. package/esm2022/lib/shared/components/accessibility/accessibility.component.mjs +0 -164
  319. package/esm2022/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.mjs +0 -168
  320. package/esm2022/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.mjs +0 -165
  321. package/esm2022/lib/shared/components/content-base/content-base.component.mjs +0 -21
  322. package/esm2022/lib/shared/components/index.mjs +0 -7
  323. package/esm2022/lib/shared/components/spinner/spinner.component.mjs +0 -329
  324. package/esm2022/lib/shared/components/text-or-html-required/text-or-html-required.component.mjs +0 -18
  325. package/esm2022/lib/shared/decorators/desy-content-child.decorator.mjs +0 -30
  326. package/esm2022/lib/shared/decorators/desy-on-input-change.decorator.mjs +0 -15
  327. package/esm2022/lib/shared/directives/accessibility-directive.mjs +0 -52
  328. package/esm2022/lib/shared/directives/attribute-change.directive.mjs +0 -50
  329. package/esm2022/lib/shared/directives/click-outside.directive.mjs +0 -40
  330. package/esm2022/lib/shared/directives/content-change.directive.mjs +0 -41
  331. package/esm2022/lib/shared/directives/custom-inner-content.directive.mjs +0 -61
  332. package/esm2022/lib/shared/directives/inner-content.directive.mjs +0 -37
  333. package/esm2022/lib/shared/interfaces/accessibility-data.mjs +0 -2
  334. package/esm2022/lib/shared/pipes/external-href.pipe.mjs +0 -28
  335. package/esm2022/lib/shared/pipes/inner-html.pipe.mjs +0 -21
  336. package/esm2022/lib/shared/pipes/make-html-list.pipe.mjs +0 -20
  337. package/esm2022/lib/shared/shared.module.mjs +0 -88
  338. package/esm2022/lib/shared/sharedExternal.module.mjs +0 -24
  339. package/esm2022/lib/shared/utils/focus-utils.mjs +0 -51
  340. package/esm2022/lib/shared/utils/search-utils.mjs +0 -70
  341. package/esm2022/lib/shared/utils/string-utils.mjs +0 -11
  342. package/esm2022/public-api.mjs +0 -225
@@ -1,962 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
3
- import { AccessibilityComponent } from '../../../shared/components';
4
- import { DesyContentChild } from '../../../shared/decorators/desy-content-child.decorator';
5
- import { StringUtils } from '../../../shared/utils/string-utils';
6
- import { MenubarItemComponent } from './components/menubar-item/menubar-item.component';
7
- import { MenubarLabelComponent } from './components/menubar-label/menubar-label.component';
8
- import { MenubarSubitemComponent } from './components/menubar-subitem/menubar-subitem.component';
9
- import { MenubarSubsubitemComponent } from './components/menubar-subsubitem/menubar-subsubitem.component';
10
- import { MenubaritemDirective } from './directives/menubaritem.directive';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/common";
13
- import * as i2 from "@angular/router";
14
- import * as i3 from "../../../shared/directives/attribute-change.directive";
15
- import * as i4 from "../../../shared/directives/custom-inner-content.directive";
16
- import * as i5 from "../../../shared/directives/accessibility-directive";
17
- import * as i6 from "./directives/menubaritem.directive";
18
- import * as i7 from "../../../shared/pipes/make-html-list.pipe";
19
- import * as i8 from "../../../shared/pipes/external-href.pipe";
20
- export class MenubarComponent extends AccessibilityComponent {
21
- constructor(changeDetectorRef) {
22
- super();
23
- this.changeDetectorRef = changeDetectorRef;
24
- this.itemsChange = new EventEmitter();
25
- this.activeItemChange = new EventEmitter();
26
- this.activeSubItemChange = new EventEmitter();
27
- this.cfg = true;
28
- this.role = null;
29
- this.ariaLabel = null;
30
- this.ariaDescribedBy = null;
31
- this.ariaLabelledBy = null;
32
- this.ariaHidden = null;
33
- this.ariaDisabled = null;
34
- this.ariaControls = null;
35
- this.ariaCurrent = null;
36
- this.ariaLive = null;
37
- this.ariaExpanded = null;
38
- this.ariaErrorMessage = null;
39
- this.ariaHasPopup = null;
40
- this.ariaModal = null;
41
- this.ariaChecked = null;
42
- this.ariaPressed = null;
43
- this.ariaReadonly = null;
44
- this.ariaRequired = null;
45
- this.ariaSelected = null;
46
- this.ariaValuemin = null;
47
- this.ariaValuemax = null;
48
- this.ariaValuenow = null;
49
- this.ariaValuetext = null;
50
- this.ariaOrientation = null;
51
- this.ariaLevel = null;
52
- this.ariaMultiselectable = null;
53
- this.ariaPlaceholder = null;
54
- this.ariaPosinset = null;
55
- this.ariaSetsize = null;
56
- this.ariaSort = null;
57
- this.ariaBusy = null;
58
- this.ariaDropeffect = null;
59
- this.ariaGrabbed = null;
60
- this.ariaActivedescendant = null;
61
- this.ariaAtomic = null;
62
- this.ariaAutocomplete = null;
63
- this.ariaBraillelabel = null;
64
- this.ariaBrailleroledescription = null;
65
- this.ariaColcount = null;
66
- this.ariaColindex = null;
67
- this.ariaColindextext = null;
68
- this.ariaColspan = null;
69
- this.ariaDescription = null;
70
- this.ariaDetails = null;
71
- this.ariaFlowto = null;
72
- this.ariaInvalid = null;
73
- this.ariaKeyshortcuts = null;
74
- this.ariaOwns = null;
75
- this.ariaRelevant = null;
76
- this.ariaRoledescription = null;
77
- this.ariaRowcount = null;
78
- this.ariaRowindex = null;
79
- this.ariaRowindextext = null;
80
- this.ariaRowspan = null;
81
- this.tabindex = null;
82
- this.title = null;
83
- this.alt = null;
84
- this.lang = null;
85
- this.accesskey = null;
86
- this.autocomplete = null;
87
- this.autofocus = null;
88
- this.contenteditable = null;
89
- this.dir = null;
90
- this.draggable = null;
91
- this.enterkeyhint = null;
92
- this.hidden = null;
93
- this.inputmode = null;
94
- this.spellcheck = null;
95
- this.translate = null;
96
- this.ariaMultiline = null;
97
- this.for = null;
98
- this.form = null;
99
- this.headers = null;
100
- this.placeholder = null;
101
- this.readonly = null;
102
- this.required = null;
103
- this.viewInit = false;
104
- this.currentFocusItemIndex = 0;
105
- }
106
- ngOnChanges(changes) {
107
- if (this.viewInit) {
108
- this.checkChanges();
109
- }
110
- }
111
- ngAfterViewInit() {
112
- this.viewInit = true;
113
- this.checkChanges();
114
- }
115
- checkChanges() {
116
- if (!this.menuItems) {
117
- return;
118
- }
119
- this.menuData = [];
120
- this.getItems().forEach((_, index) => {
121
- const itemData = {
122
- open: false,
123
- currentFocusSubItemIndex: 0,
124
- currentFocusSubSubItemIndex: 0,
125
- menuItem: this.menuItems.toArray()[index]
126
- };
127
- this.menuData.push(itemData);
128
- });
129
- if (this.viewInit) {
130
- this.checkRequired();
131
- }
132
- const lastCurrentFocusItemIndex = this.currentFocusItemIndex;
133
- const items = this.getItems();
134
- if (items) {
135
- while (!this.isItemFocusable(this.currentFocusItemIndex % items.length)) {
136
- this.currentFocusItemIndex = (this.currentFocusItemIndex + items.length + 1) % items.length;
137
- if (this.currentFocusItemIndex === lastCurrentFocusItemIndex) {
138
- break;
139
- }
140
- }
141
- }
142
- }
143
- handleMenuFocusIn() {
144
- this.isFocused = true;
145
- this.changeDetectorRef.detectChanges();
146
- }
147
- handleMenuFocusOut(event) {
148
- if (!this.menubar.nativeElement.contains(event.relatedTarget)) {
149
- this.closeMenu();
150
- }
151
- this.isFocused = false;
152
- this.changeDetectorRef.detectChanges();
153
- }
154
- handleMenuItemClick(event, itemIndex) {
155
- if (this.hasPopupMenu(itemIndex)) {
156
- event.preventDefault();
157
- const isOpen = this.menuData[itemIndex].open;
158
- this.closeMenu();
159
- if (!isOpen) {
160
- this.openMenu(itemIndex);
161
- }
162
- }
163
- else {
164
- this.activateMenuItem(itemIndex);
165
- }
166
- }
167
- handleMenuItemKeydown(event, itemIndex) {
168
- switch (event.key) {
169
- case 'Enter':
170
- case ' ':
171
- case 'ArrowDown':
172
- if (this.hasPopupMenu(itemIndex)) {
173
- this.openMenu(itemIndex);
174
- setTimeout(() => this.focusFirstSubItem(itemIndex));
175
- event.stopPropagation();
176
- event.preventDefault();
177
- }
178
- break;
179
- case 'Escape':
180
- if (this.hasPopupMenu(itemIndex)) {
181
- this.closeMenu(itemIndex);
182
- }
183
- event.stopPropagation();
184
- event.preventDefault();
185
- break;
186
- case 'ArrowLeft':
187
- this.focusNextAvailableItem(itemIndex, -1);
188
- event.stopPropagation();
189
- event.preventDefault();
190
- break;
191
- case 'ArrowRight':
192
- this.focusNextAvailableItem(itemIndex, +1);
193
- event.stopPropagation();
194
- event.preventDefault();
195
- break;
196
- case 'ArrowUp':
197
- if (this.hasPopupMenu(itemIndex)) {
198
- this.openMenu(itemIndex);
199
- setTimeout(() => this.focusLastSubItem(itemIndex));
200
- }
201
- event.stopPropagation();
202
- event.preventDefault();
203
- break;
204
- case 'Home':
205
- case 'PageUp':
206
- if (this.hasPopupMenu(itemIndex)) {
207
- this.closeMenu();
208
- }
209
- this.focusFirstItem();
210
- event.stopPropagation();
211
- event.preventDefault();
212
- break;
213
- case 'End':
214
- case 'PageDown':
215
- if (this.hasPopupMenu(itemIndex)) {
216
- this.closeMenu();
217
- }
218
- this.focusLastItem();
219
- event.stopPropagation();
220
- event.preventDefault();
221
- break;
222
- default:
223
- if (this.isPrintableChar(event.key)) {
224
- this.focusItemByFirstChar(event.key);
225
- event.stopPropagation();
226
- event.preventDefault();
227
- }
228
- break;
229
- }
230
- }
231
- handleMenuItemMouseOver(itemIndex) {
232
- this.focusItem(itemIndex, true);
233
- }
234
- handlePopupMenuItemClick(itemIndex, subItemIndex, subSubItemIndex) {
235
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
236
- this.focusItem(itemIndex);
237
- this.closeMenu(itemIndex);
238
- }
239
- handlePopupMenuItemKeydown(event, itemIndex, subItemIndex, subSubItemIndex) {
240
- const currentSubIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
241
- const currentSubSubIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
242
- const items = this.getItems();
243
- switch (event.key) {
244
- case ' ':
245
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
246
- if (this.mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex)) {
247
- this.closeMenu(itemIndex);
248
- this.focusItem(itemIndex);
249
- }
250
- event.stopPropagation();
251
- event.preventDefault();
252
- break;
253
- case 'Enter':
254
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
255
- this.closeMenu(itemIndex);
256
- this.focusItem(itemIndex);
257
- event.stopPropagation();
258
- event.preventDefault();
259
- break;
260
- case 'Escape':
261
- this.closeMenu(itemIndex);
262
- this.focusItem(itemIndex);
263
- event.stopPropagation();
264
- event.preventDefault();
265
- break;
266
- case 'ArrowUp':
267
- this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, -1);
268
- event.stopPropagation();
269
- event.preventDefault();
270
- break;
271
- case 'ArrowDown':
272
- this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, +1);
273
- event.stopPropagation();
274
- event.preventDefault();
275
- break;
276
- case 'ArrowLeft':
277
- this.closeMenu(itemIndex);
278
- this.focusItem((itemIndex + items.length - 1) % items.length);
279
- event.stopPropagation();
280
- event.preventDefault();
281
- break;
282
- case 'ArrowRight':
283
- this.closeMenu(itemIndex);
284
- this.focusItem((itemIndex + items.length + 1) % items.length);
285
- event.stopPropagation();
286
- event.preventDefault();
287
- break;
288
- case 'Home':
289
- case 'PageUp':
290
- this.focusFirstSubItem(itemIndex);
291
- event.stopPropagation();
292
- event.preventDefault();
293
- break;
294
- case 'End':
295
- case 'PageDown':
296
- this.focusLastSubItem(itemIndex);
297
- event.stopPropagation();
298
- event.preventDefault();
299
- break;
300
- case 'Tab':
301
- this.closeMenu(itemIndex);
302
- this.focusItem(itemIndex);
303
- break;
304
- default:
305
- if (this.isPrintableChar(event.key)) {
306
- this.focusSubItemByFirstChar(itemIndex, event.key);
307
- event.stopPropagation();
308
- event.preventDefault();
309
- }
310
- break;
311
- }
312
- }
313
- handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subSubItemIndex) {
314
- this.focusSubItem(itemIndex, subItemIndex, subSubItemIndex);
315
- }
316
- checkRequired() {
317
- const items = this.getItems();
318
- }
319
- activateMenuItem(itemIndex) {
320
- const items = this.getItems();
321
- this.activeItemChange.emit(items[itemIndex]);
322
- if (items[itemIndex] instanceof MenubarItemComponent) {
323
- items[itemIndex].selected.emit();
324
- }
325
- }
326
- activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex) {
327
- const items = this.getItems();
328
- const subItems = this.getItemSubitems(items[itemIndex]);
329
- let item = subItems[subItemIndex];
330
- let subSubItems = [];
331
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
332
- subSubItems = this.getSubItemSubitems(item);
333
- item = subSubItems[subSubItemIndex];
334
- }
335
- let checkedChange = false;
336
- if (item.role === 'menuitemcheckbox') {
337
- item.checked = !item.checked;
338
- checkedChange = true;
339
- }
340
- else if (item.role === 'menuitemradio') {
341
- checkedChange = !item.checked;
342
- subSubItems.forEach(i => i.checked = false);
343
- item.checked = true;
344
- }
345
- this.itemsChange.emit(items);
346
- this.activeSubItemChange.emit(item);
347
- if (item instanceof MenubarSubitemComponent || item instanceof MenubarSubsubitemComponent) {
348
- item.selected.emit();
349
- if (checkedChange) {
350
- item.checkedChange.emit(item.checked);
351
- }
352
- }
353
- }
354
- mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex) {
355
- const items = this.getItems();
356
- const subItems = this.getItemSubitems(items[itemIndex]);
357
- let item = subItems[subItemIndex];
358
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
359
- const subSubItems = this.getSubItemSubitems(item);
360
- item = subSubItems[subSubItemIndex];
361
- }
362
- return item.role !== 'menuitemcheckbox' && item.role !== 'menuitemradio';
363
- }
364
- openMenu(itemIndex) {
365
- const wasOpened = this.menuData[itemIndex].open;
366
- this.menuData[itemIndex].open = true;
367
- if (wasOpened) {
368
- this.activateMenuItem(itemIndex);
369
- }
370
- }
371
- closeMenu(itemIndex) {
372
- if (itemIndex !== null && itemIndex !== undefined) {
373
- this.menuData[itemIndex].open = false;
374
- }
375
- else {
376
- this.menuData.forEach(item => item.open = false);
377
- }
378
- }
379
- hasPopupMenu(itemIndex) {
380
- const items = this.getItems();
381
- const subItems = this.getItemSubitems(items[itemIndex]);
382
- return items[itemIndex].sub && subItems && subItems.length > 0;
383
- }
384
- isPrintableChar(str) {
385
- return str.length === 1 && !!str.match(/\S/);
386
- }
387
- getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex) {
388
- let menuDataIndex = 0;
389
- const items = this.getItems();
390
- const subItems = this.getItemSubitems(items[itemIndex]);
391
- for (let i = 0; i < subItemIndex; i++) {
392
- const subItem = subItems[i];
393
- const subSubItems = this.getSubItemSubitems(subItem);
394
- menuDataIndex += subSubItems && subSubItems.length > 0 ? subSubItems.length : 1;
395
- }
396
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
397
- menuDataIndex += subSubItemIndex;
398
- }
399
- return menuDataIndex;
400
- }
401
- focusItem(itemIndex, hover) {
402
- const hasFocus = this.menubar.nativeElement.contains(document.activeElement);
403
- const isOpen = this.menuData[this.currentFocusItemIndex].open;
404
- if (!hover || hasFocus) {
405
- this.menuData[itemIndex].menuItem.link.nativeElement.focus();
406
- }
407
- this.closeMenu();
408
- if (isOpen && this.hasPopupMenu(itemIndex)) {
409
- this.openMenu(itemIndex);
410
- }
411
- this.currentFocusItemIndex = itemIndex;
412
- }
413
- focusNextAvailableItem(fromItemIndex, step) {
414
- let nextItem = fromItemIndex;
415
- const items = this.getItems();
416
- do {
417
- nextItem = (nextItem + items.length + step) % items.length;
418
- } while (!this.isItemFocusable(nextItem) && nextItem !== fromItemIndex);
419
- if (nextItem !== fromItemIndex) {
420
- this.focusItem(nextItem);
421
- }
422
- }
423
- focusFirstItem() {
424
- if (this.isItemFocusable(0)) {
425
- this.focusItem(0);
426
- }
427
- else {
428
- this.focusNextAvailableItem(0, +1);
429
- }
430
- }
431
- focusLastItem() {
432
- const items = this.getItems();
433
- if (this.isItemFocusable(items.length - 1)) {
434
- this.focusItem(items.length - 1);
435
- }
436
- else {
437
- this.focusNextAvailableItem(items.length - 1, -1);
438
- }
439
- }
440
- isItemFocusable(itemIndex) {
441
- return !this.getItems()[itemIndex].disabled;
442
- }
443
- focusItemByFirstChar(char) {
444
- const itemContents = this.menuItems.map(menuItem => menuItem.itemContentWrapper.nativeElement.textContent);
445
- let index = this.currentFocusItemIndex;
446
- let foundIndex = -1;
447
- do {
448
- index = (index + itemContents.length + 1) % itemContents.length;
449
- if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
450
- && this.isItemFocusable(index)) {
451
- foundIndex = index;
452
- }
453
- } while (foundIndex === -1 && index !== this.currentFocusItemIndex);
454
- if (foundIndex >= 0) {
455
- this.focusItem(foundIndex);
456
- }
457
- }
458
- focusSubItem(itemIndex, subItemIndex, subSubItemIndex) {
459
- if (this.menuData[itemIndex].menuItem.popupMenuItems.length > 0) {
460
- const menuDataIndex = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
461
- this.menuData[itemIndex].currentFocusSubItemIndex = subItemIndex;
462
- this.menuData[itemIndex].currentFocusSubSubItemIndex = subSubItemIndex;
463
- const elem = this.menuData[itemIndex].menuItem.popupMenuItems.toArray()[menuDataIndex].nativeElement;
464
- if (elem) {
465
- elem.focus();
466
- }
467
- else {
468
- console.error('No subitem to focus');
469
- }
470
- }
471
- else {
472
- console.error('No subitems');
473
- }
474
- }
475
- focusNextAvailableSubItem(itemIndex, fromItemSubIndex, fromItemSubSubIndex, step) {
476
- let nextSubIndex = fromItemSubIndex;
477
- let nextSubSubIndex = fromItemSubSubIndex;
478
- let allSubItemsChecked;
479
- const items = this.getItems();
480
- do {
481
- const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step);
482
- nextSubIndex = nextIndexes.subIndex;
483
- nextSubSubIndex = nextIndexes.subSubIndex;
484
- allSubItemsChecked = (fromItemSubIndex === nextSubIndex && fromItemSubSubIndex === nextSubSubIndex);
485
- } while (!this.isSubItemFocusable(itemIndex, nextSubIndex, nextSubSubIndex) && !allSubItemsChecked);
486
- if (!allSubItemsChecked) {
487
- this.focusSubItem(itemIndex, nextSubIndex, nextSubSubIndex);
488
- }
489
- }
490
- focusFirstSubItem(itemIndex) {
491
- let firstSubSubItem = null;
492
- const items = this.getItems();
493
- const subItems = this.getItemSubitems(items[itemIndex]);
494
- const subSubItems = this.getSubItemSubitems(subItems[0]);
495
- if (subSubItems && subSubItems.length > 0) {
496
- firstSubSubItem = 0;
497
- }
498
- if (this.isSubItemFocusable(itemIndex, 0, firstSubSubItem)) {
499
- this.focusSubItem(itemIndex, 0, firstSubSubItem);
500
- }
501
- else {
502
- this.focusNextAvailableSubItem(itemIndex, 0, firstSubSubItem, +1);
503
- }
504
- }
505
- focusLastSubItem(itemIndex) {
506
- const items = this.getItems();
507
- const subItems = this.getItemSubitems(items[itemIndex]);
508
- const lastItemIndex = subItems.length - 1;
509
- const lastItem = subItems[lastItemIndex];
510
- const subSubItems = this.getSubItemSubitems(lastItem);
511
- let lastSubSubItem = null;
512
- if (subSubItems && subSubItems.length > 0) {
513
- lastSubSubItem = subSubItems.length - 1;
514
- }
515
- if (this.isSubItemFocusable(itemIndex, lastItemIndex, lastSubSubItem)) {
516
- this.focusSubItem(itemIndex, lastItemIndex, lastSubSubItem);
517
- }
518
- else {
519
- this.focusNextAvailableSubItem(itemIndex, lastItemIndex, lastSubSubItem, -1);
520
- }
521
- }
522
- isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex) {
523
- const items = this.getItems();
524
- const subItems = this.getItemSubitems(items[itemIndex]);
525
- let item = subItems[subItemIndex];
526
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
527
- const subSubItems = this.getSubItemSubitems(item);
528
- item = subSubItems[subSubItemIndex];
529
- }
530
- let isFocusable = false;
531
- if (item.role !== 'separator' && item.role !== 'none') {
532
- isFocusable = true;
533
- }
534
- return isFocusable;
535
- }
536
- focusSubItemByFirstChar(itemIndex, char) {
537
- const itemContents = this.menuItems.toArray()[itemIndex].popupMenuItems.map(menuItem => menuItem.nativeElement.textContent);
538
- let subItemIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
539
- let subSubItemIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
540
- let foundSubIndex = -1;
541
- let foundSubSubIndex = null;
542
- let allSubItemsChecked = false;
543
- const items = this.getItems();
544
- do {
545
- const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, subItemIndex, subSubItemIndex, +1);
546
- subItemIndex = nextIndexes.subIndex;
547
- subSubItemIndex = nextIndexes.subSubIndex;
548
- const index = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
549
- if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
550
- && this.isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex)) {
551
- foundSubIndex = subItemIndex;
552
- foundSubSubIndex = subSubItemIndex;
553
- }
554
- allSubItemsChecked = (this.menuData[itemIndex].currentFocusSubItemIndex === subItemIndex
555
- && this.menuData[itemIndex].currentFocusSubSubItemIndex === subSubItemIndex);
556
- } while (foundSubIndex === -1 && !allSubItemsChecked);
557
- if (foundSubIndex >= 0) {
558
- this.focusSubItem(itemIndex, foundSubIndex, foundSubSubIndex);
559
- }
560
- }
561
- getItems() {
562
- let items;
563
- if (this.itemComponentList && this.itemComponentList.length > 0) {
564
- items = this.itemComponentList.toArray();
565
- }
566
- else {
567
- items = this.items;
568
- }
569
- return items;
570
- }
571
- getItemSubitems(item) {
572
- let subItems = [];
573
- if (item instanceof MenubarItemComponent) {
574
- subItems = item.getSubItems();
575
- }
576
- if (!subItems || subItems.length === 0) {
577
- subItems = item.sub ? item.sub.items : [];
578
- }
579
- return subItems;
580
- }
581
- getSubItemSubitems(item) {
582
- let subItems = [];
583
- if (item.role === 'group') {
584
- if (item instanceof MenubarSubitemComponent) {
585
- subItems = item.getSubItems();
586
- }
587
- if (!subItems || subItems.length === 0) {
588
- subItems = item.items ? item.items : [];
589
- }
590
- }
591
- return subItems;
592
- }
593
- getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step) {
594
- const subItems = this.getItemSubitems(items[itemIndex]);
595
- const subSubItems = this.getSubItemSubitems(subItems[nextSubIndex]);
596
- let checkNextSubItem = true;
597
- if (subSubItems && subSubItems.length > 0) {
598
- if (nextSubSubIndex + step >= 0 && nextSubSubIndex + step < subSubItems.length) {
599
- nextSubSubIndex += step;
600
- checkNextSubItem = false;
601
- }
602
- }
603
- if (checkNextSubItem) {
604
- nextSubIndex = (nextSubIndex + step + subItems.length) % subItems.length;
605
- const nextSubItemItems = this.getSubItemSubitems(subItems[nextSubIndex]);
606
- if (nextSubItemItems && nextSubItemItems.length > 0) {
607
- nextSubSubIndex = ((step > 0 ? -1 : 0) + step + nextSubItemItems.length) % nextSubItemItems.length;
608
- }
609
- else {
610
- nextSubSubIndex = null;
611
- }
612
- }
613
- return { subIndex: nextSubIndex, subSubIndex: nextSubSubIndex };
614
- }
615
- getIdPrefix() {
616
- return this.idPrefix ? this.idPrefix : this.id + 'menubar-item';
617
- }
618
- getLabelRef() {
619
- return this.labelComponent ? this.labelComponent.getContent() : this.labelRef;
620
- }
621
- getLabelContent() {
622
- let content;
623
- if (this.labelData) {
624
- content = this.labelData.html ? this.labelData.html : `<p>${StringUtils.escapeHtml(this.labelData.text)}</p>`;
625
- }
626
- else if (this.labelText) {
627
- content = `<p>${StringUtils.escapeHtml(this.labelText)}</p>`;
628
- }
629
- return content;
630
- }
631
- getItemId(item, index) {
632
- let id;
633
- if (item) {
634
- if (item.id) {
635
- id = item.id;
636
- }
637
- else {
638
- id = `${this.getIdPrefix()}-${++index}`;
639
- }
640
- }
641
- return id;
642
- }
643
- getPopupStyle(itemIndex) {
644
- let style = {};
645
- if (this.menuData && itemIndex < this.menuData.length) {
646
- const menuItem = this.menuData[itemIndex].menuItem;
647
- const rect = menuItem.link.nativeElement.getBoundingClientRect();
648
- if (this.menuData[itemIndex].open) {
649
- style = {
650
- position: 'absolute',
651
- top: (rect.height - 1) + 'px',
652
- left: '0px',
653
- zIndex: 100,
654
- display: 'block'
655
- };
656
- }
657
- else {
658
- style = {
659
- zIndex: 0,
660
- display: 'none'
661
- };
662
- }
663
- }
664
- return style;
665
- }
666
- getSubItemId(item, index, parentId) {
667
- let id;
668
- if (item) {
669
- if (item.id) {
670
- id = item.id;
671
- }
672
- else {
673
- id = `sub-${parentId}-${++index}`;
674
- }
675
- }
676
- return id;
677
- }
678
- getSubSubItemAriaChecked(subsubitem) {
679
- let ariaChecked = null;
680
- if (subsubitem.role === 'menuitemcheckbox' || subsubitem.role === 'menuitemradio') {
681
- ariaChecked = !!subsubitem.checked;
682
- }
683
- return ariaChecked;
684
- }
685
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenubarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
686
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MenubarComponent, selector: "desy-menubar", inputs: { idPrefix: "idPrefix", items: "items", labelRef: "labelRef", labelData: "labelData", labelText: "labelText", classes: "classes", id: "id" }, outputs: { itemsChange: "itemsChange", activeItemChange: "activeItemChange", activeSubItemChange: "activeSubItemChange" }, host: { properties: { "class": "this.classes", "class.c-menubar": "this.cfg", "attr.id": "this.id", "attr.role": "this.role", "attr.aria-label": "this.ariaLabel", "attr.aria-describedby": "this.ariaDescribedBy", "attr.aria-labelledby": "this.ariaLabelledBy", "attr.aria-hidden": "this.ariaHidden", "attr.aria-disabled": "this.ariaDisabled", "attr.aria-controls": "this.ariaControls", "attr.aria-current": "this.ariaCurrent", "attr.aria-live": "this.ariaLive", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-errormessage": "this.ariaErrorMessage", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-modal": "this.ariaModal", "attr.aria-checked": "this.ariaChecked", "attr.aria-pressed": "this.ariaPressed", "attr.aria-readonly": "this.ariaReadonly", "attr.aria-required": "this.ariaRequired", "attr.aria-selected": "this.ariaSelected", "attr.aria-valuemin": "this.ariaValuemin", "attr.aria-valuemax": "this.ariaValuemax", "attr.aria-valuenow": "this.ariaValuenow", "attr.aria-valuetext": "this.ariaValuetext", "attr.aria-orientation": "this.ariaOrientation", "attr.aria-level": "this.ariaLevel", "attr.aria-multiselectable": "this.ariaMultiselectable", "attr.aria-placeholder": "this.ariaPlaceholder", "attr.aria-posinset": "this.ariaPosinset", "attr.aria-setsize": "this.ariaSetsize", "attr.aria-sort": "this.ariaSort", "attr.aria-busy": "this.ariaBusy", "attr.aria-dropeffect": "this.ariaDropeffect", "attr.aria-grabbed": "this.ariaGrabbed", "attr.aria-activedescendant": "this.ariaActivedescendant", "attr.aria-atomic": "this.ariaAtomic", "attr.aria-autocomplete": "this.ariaAutocomplete", "attr.aria-braillelabel": "this.ariaBraillelabel", "attr.aria-brailleroledescription": "this.ariaBrailleroledescription", "attr.aria-colcount": "this.ariaColcount", "attr.aria-colindex": "this.ariaColindex", "attr.aria-colindextext": "this.ariaColindextext", "attr.aria-colspan": "this.ariaColspan", "attr.aria-description": "this.ariaDescription", "attr.aria-details": "this.ariaDetails", "attr.aria-flowto": "this.ariaFlowto", "attr.aria-invalid": "this.ariaInvalid", "attr.aria-keyshortcuts": "this.ariaKeyshortcuts", "attr.aria-owns": "this.ariaOwns", "attr.aria-relevant": "this.ariaRelevant", "attr.aria-roledescription": "this.ariaRoledescription", "attr.aria-rowcount": "this.ariaRowcount", "attr.aria-rowindex": "this.ariaRowindex", "attr.aria-rowindextext": "this.ariaRowindextext", "attr.aria-rowspan": "this.ariaRowspan", "attr.tabindex": "this.tabindex", "attr.title": "this.title", "attr.alt": "this.alt", "attr.lang": "this.lang", "attr.accesskey": "this.accesskey", "attr.autocomplete": "this.autocomplete", "attr.autofocus": "this.autofocus", "attr.contenteditable": "this.contenteditable", "attr.dir": "this.dir", "attr.draggable": "this.draggable", "attr.enterkeyhint": "this.enterkeyhint", "attr.hidden": "this.hidden", "attr.inputmode": "this.inputmode", "attr.spellcheck": "this.spellcheck", "attr.translate": "this.translate", "attr.aria-multiline": "this.ariaMultiline", "attr.for": "this.for", "attr.form": "this.form", "attr.headers": "this.headers", "attr.placeholder": "this.placeholder", "attr.readonly": "this.readonly", "attr.required": "this.required" } }, queries: [{ propertyName: "labelComponent", predicate: MenubarLabelComponent }, { propertyName: "itemComponentList", predicate: MenubarItemComponent }], viewQueries: [{ propertyName: "menubar", first: true, predicate: ["menubar"], descendants: true, read: ElementRef }, { propertyName: "menuItems", predicate: MenubaritemDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: " <ng-container *ngIf=\"getLabelRef()\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelComponent ? labelComponent.classes : (labelData ? labelData.classes : null)] | makeHtmlList\">\n <ng-container *ngTemplateOutlet=\"getLabelRef()\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!getLabelRef() && (labelData || labelText)\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelData ? labelData.classes : null] | makeHtmlList\">\n <ng-container *desyCustomInnerContent=\"{ html: getLabelContent() }\"></ng-container>\n </div>\n </ng-container>\n <ul #menubar [id]=\"id + '-menubar'\" class=\"lg:flex lg:flex-wrap\" role=\"menubar\"\n (focusin)=\"handleMenuFocusIn()\"\n (focusout)=\"handleMenuFocusOut($event)\"\n [ngClass]=\"{ 'focus': isFocused }\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n [attr.aria-describedby]=\"getLabelRef() || labelData || labelText ? id + '-label' : null\">\n <ng-container *ngFor=\"let item of getItems(); index as itemIndex\">\n <li class=\"relative\" role=\"none\" desyMenubaritem (contentChanged)=\"checkChanges()\">\n <a *ngIf=\"item.sub\" #link\n role=\"menuitem\" aria-haspopup=\"true\" \n [attr.aria-expanded]=\"menuData && menuData[itemIndex] ? menuData[itemIndex].open ? 'true' : 'false' : 'false'\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\" \n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [desyAppAccessibility]=\"item\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span>\n <svg class=\"inline-block -mr-2 align-middle -my-px\" viewBox=\"0 0 96 96\" aria-hidden=\"true\" fill=\"currentColor\" focusable=\"false\" width=\"1.5em\" height=\"1.5em\"><g><path d=\"M46.71 58.037a1.823 1.823 0 002.581 0L62.048 45.28a1.823 1.823 0 00-1.29-3.113H35.243a1.823 1.823 0 00-1.291 3.113z\"/></g></svg>\n </a>\n <a *ngIf=\"item.routerLink && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [routerLink]=\"item.routerLink\"\n [routerLinkActive]=\"item.routerLinkActiveClasses ? item.routerLinkActiveClasses : []\"\n [fragment]=\"item.fragment\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [desyAppAccessibility]=\"item\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n <a *ngIf=\"!item.routerLink && item.href && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [href]=\"item.href | externalHref\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [desyAppAccessibility]=\"item\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n\n <ul *ngIf=\"item.sub && getItemSubitems(item)\" #popupMenu role=\"menu\" tabindex=\"-1\"\n [ngStyle]=\"getPopupStyle(itemIndex)\"\n [class]=\"['c-menubar__tooltip w-max max-w-64 hidden border border-neutral-base shadow-md bg-white text-sm', item.sub.classes] | makeHtmlList\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\n [desyAppAccessibility]=\"item.sub\"\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\">\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\n <ng-container [ngSwitch]=\"subItem.role\">\n <li #popupMenuItem *ngSwitchCase=\"'none'\" role=\"none\" tabindex=\"-1\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li *ngSwitchCase=\"'group'\" role=\"none\">\n <ul role=\"group\" [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-label]=\"subItem.ariaLabel ? subItem.ariaLabel : null\">\n <ng-container *ngFor=\"let subsubitem of getSubItemSubitems(subItem); index as subsubIndex\">\n <ng-container *ngIf=\"subsubitem\">\n <li #popupMenuItem [attr.role]=\"subsubitem.role ? subsubitem.role : null\" tabindex=\"-1\"\n [id]=\"getSubItemId(subsubitem, subsubIndex, getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex)))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex, subsubIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subsubIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex, subsubIndex)\"\n [attr.aria-checked]=\"getSubSubItemAriaChecked(subsubitem)\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subsubitem, html: subsubitem.html, text: subsubitem.text}\"></ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitem'\" role=\"menuitem\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white focus:bg-primary-base focus:text-white focus:outline-none\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitemcheckbox'\" role=\"menuitemcheckbox\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-checked]=\"!!subItem.checked\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'separator'\" role=\"separator\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"my-sm border-b border-neutral-base\">\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i3.AttributeChangeDirective, selector: "[desyAttributeChange]", inputs: ["attributesToCheck", "desyAttributeChangeEnabled"], outputs: ["desyAttributeChange", "desyAttributeChangeMutation"] }, { kind: "directive", type: i4.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "directive", type: i5.AccessibilityDirective, selector: "[desyAppAccessibility]", inputs: ["desyAppAccessibility"] }, { kind: "directive", type: i6.MenubaritemDirective, selector: "[desyMenubaritem]", outputs: ["contentChanged"] }, { kind: "pipe", type: i7.MakeHtmlListPipe, name: "makeHtmlList" }, { kind: "pipe", type: i8.ExternalHrefPipe, name: "externalHref" }] }); }
687
- }
688
- __decorate([
689
- DesyContentChild(),
690
- __metadata("design:type", MenubarLabelComponent)
691
- ], MenubarComponent.prototype, "labelComponent", void 0);
692
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenubarComponent, decorators: [{
693
- type: Component,
694
- args: [{ selector: 'desy-menubar', template: " <ng-container *ngIf=\"getLabelRef()\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelComponent ? labelComponent.classes : (labelData ? labelData.classes : null)] | makeHtmlList\">\n <ng-container *ngTemplateOutlet=\"getLabelRef()\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!getLabelRef() && (labelData || labelText)\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelData ? labelData.classes : null] | makeHtmlList\">\n <ng-container *desyCustomInnerContent=\"{ html: getLabelContent() }\"></ng-container>\n </div>\n </ng-container>\n <ul #menubar [id]=\"id + '-menubar'\" class=\"lg:flex lg:flex-wrap\" role=\"menubar\"\n (focusin)=\"handleMenuFocusIn()\"\n (focusout)=\"handleMenuFocusOut($event)\"\n [ngClass]=\"{ 'focus': isFocused }\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n [attr.aria-describedby]=\"getLabelRef() || labelData || labelText ? id + '-label' : null\">\n <ng-container *ngFor=\"let item of getItems(); index as itemIndex\">\n <li class=\"relative\" role=\"none\" desyMenubaritem (contentChanged)=\"checkChanges()\">\n <a *ngIf=\"item.sub\" #link\n role=\"menuitem\" aria-haspopup=\"true\" \n [attr.aria-expanded]=\"menuData && menuData[itemIndex] ? menuData[itemIndex].open ? 'true' : 'false' : 'false'\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\" \n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [desyAppAccessibility]=\"item\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span>\n <svg class=\"inline-block -mr-2 align-middle -my-px\" viewBox=\"0 0 96 96\" aria-hidden=\"true\" fill=\"currentColor\" focusable=\"false\" width=\"1.5em\" height=\"1.5em\"><g><path d=\"M46.71 58.037a1.823 1.823 0 002.581 0L62.048 45.28a1.823 1.823 0 00-1.29-3.113H35.243a1.823 1.823 0 00-1.291 3.113z\"/></g></svg>\n </a>\n <a *ngIf=\"item.routerLink && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [routerLink]=\"item.routerLink\"\n [routerLinkActive]=\"item.routerLinkActiveClasses ? item.routerLinkActiveClasses : []\"\n [fragment]=\"item.fragment\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [desyAppAccessibility]=\"item\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n <a *ngIf=\"!item.routerLink && item.href && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [href]=\"item.href | externalHref\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--has-selection': item.active}\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [desyAppAccessibility]=\"item\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n\n <ul *ngIf=\"item.sub && getItemSubitems(item)\" #popupMenu role=\"menu\" tabindex=\"-1\"\n [ngStyle]=\"getPopupStyle(itemIndex)\"\n [class]=\"['c-menubar__tooltip w-max max-w-64 hidden border border-neutral-base shadow-md bg-white text-sm', item.sub.classes] | makeHtmlList\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\n [desyAppAccessibility]=\"item.sub\"\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\">\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\n <ng-container [ngSwitch]=\"subItem.role\">\n <li #popupMenuItem *ngSwitchCase=\"'none'\" role=\"none\" tabindex=\"-1\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li *ngSwitchCase=\"'group'\" role=\"none\">\n <ul role=\"group\" [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-label]=\"subItem.ariaLabel ? subItem.ariaLabel : null\">\n <ng-container *ngFor=\"let subsubitem of getSubItemSubitems(subItem); index as subsubIndex\">\n <ng-container *ngIf=\"subsubitem\">\n <li #popupMenuItem [attr.role]=\"subsubitem.role ? subsubitem.role : null\" tabindex=\"-1\"\n [id]=\"getSubItemId(subsubitem, subsubIndex, getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex)))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex, subsubIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subsubIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex, subsubIndex)\"\n [attr.aria-checked]=\"getSubSubItemAriaChecked(subsubitem)\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subsubitem, html: subsubitem.html, text: subsubitem.text}\"></ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitem'\" role=\"menuitem\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white focus:bg-primary-base focus:text-white focus:outline-none\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitemcheckbox'\" role=\"menuitemcheckbox\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-checked]=\"!!subItem.checked\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'separator'\" role=\"separator\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"my-sm border-b border-neutral-base\">\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n" }]
695
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { idPrefix: [{
696
- type: Input
697
- }], items: [{
698
- type: Input
699
- }], itemsChange: [{
700
- type: Output
701
- }], activeItemChange: [{
702
- type: Output
703
- }], activeSubItemChange: [{
704
- type: Output
705
- }], labelRef: [{
706
- type: Input
707
- }], labelData: [{
708
- type: Input
709
- }], labelText: [{
710
- type: Input
711
- }], classes: [{
712
- type: Input
713
- }, {
714
- type: HostBinding,
715
- args: ['class']
716
- }], cfg: [{
717
- type: HostBinding,
718
- args: ['class.c-menubar']
719
- }], id: [{
720
- type: Input
721
- }, {
722
- type: HostBinding,
723
- args: ['attr.id']
724
- }], role: [{
725
- type: HostBinding,
726
- args: ['attr.role']
727
- }], ariaLabel: [{
728
- type: HostBinding,
729
- args: ['attr.aria-label']
730
- }], ariaDescribedBy: [{
731
- type: HostBinding,
732
- args: ['attr.aria-describedby']
733
- }], ariaLabelledBy: [{
734
- type: HostBinding,
735
- args: ['attr.aria-labelledby']
736
- }], ariaHidden: [{
737
- type: HostBinding,
738
- args: ['attr.aria-hidden']
739
- }], ariaDisabled: [{
740
- type: HostBinding,
741
- args: ['attr.aria-disabled']
742
- }], ariaControls: [{
743
- type: HostBinding,
744
- args: ['attr.aria-controls']
745
- }], ariaCurrent: [{
746
- type: HostBinding,
747
- args: ['attr.aria-current']
748
- }], ariaLive: [{
749
- type: HostBinding,
750
- args: ['attr.aria-live']
751
- }], ariaExpanded: [{
752
- type: HostBinding,
753
- args: ['attr.aria-expanded']
754
- }], ariaErrorMessage: [{
755
- type: HostBinding,
756
- args: ['attr.aria-errormessage']
757
- }], ariaHasPopup: [{
758
- type: HostBinding,
759
- args: ['attr.aria-haspopup']
760
- }], ariaModal: [{
761
- type: HostBinding,
762
- args: ['attr.aria-modal']
763
- }], ariaChecked: [{
764
- type: HostBinding,
765
- args: ['attr.aria-checked']
766
- }], ariaPressed: [{
767
- type: HostBinding,
768
- args: ['attr.aria-pressed']
769
- }], ariaReadonly: [{
770
- type: HostBinding,
771
- args: ['attr.aria-readonly']
772
- }], ariaRequired: [{
773
- type: HostBinding,
774
- args: ['attr.aria-required']
775
- }], ariaSelected: [{
776
- type: HostBinding,
777
- args: ['attr.aria-selected']
778
- }], ariaValuemin: [{
779
- type: HostBinding,
780
- args: ['attr.aria-valuemin']
781
- }], ariaValuemax: [{
782
- type: HostBinding,
783
- args: ['attr.aria-valuemax']
784
- }], ariaValuenow: [{
785
- type: HostBinding,
786
- args: ['attr.aria-valuenow']
787
- }], ariaValuetext: [{
788
- type: HostBinding,
789
- args: ['attr.aria-valuetext']
790
- }], ariaOrientation: [{
791
- type: HostBinding,
792
- args: ['attr.aria-orientation']
793
- }], ariaLevel: [{
794
- type: HostBinding,
795
- args: ['attr.aria-level']
796
- }], ariaMultiselectable: [{
797
- type: HostBinding,
798
- args: ['attr.aria-multiselectable']
799
- }], ariaPlaceholder: [{
800
- type: HostBinding,
801
- args: ['attr.aria-placeholder']
802
- }], ariaPosinset: [{
803
- type: HostBinding,
804
- args: ['attr.aria-posinset']
805
- }], ariaSetsize: [{
806
- type: HostBinding,
807
- args: ['attr.aria-setsize']
808
- }], ariaSort: [{
809
- type: HostBinding,
810
- args: ['attr.aria-sort']
811
- }], ariaBusy: [{
812
- type: HostBinding,
813
- args: ['attr.aria-busy']
814
- }], ariaDropeffect: [{
815
- type: HostBinding,
816
- args: ['attr.aria-dropeffect']
817
- }], ariaGrabbed: [{
818
- type: HostBinding,
819
- args: ['attr.aria-grabbed']
820
- }], ariaActivedescendant: [{
821
- type: HostBinding,
822
- args: ['attr.aria-activedescendant']
823
- }], ariaAtomic: [{
824
- type: HostBinding,
825
- args: ['attr.aria-atomic']
826
- }], ariaAutocomplete: [{
827
- type: HostBinding,
828
- args: ['attr.aria-autocomplete']
829
- }], ariaBraillelabel: [{
830
- type: HostBinding,
831
- args: ['attr.aria-braillelabel']
832
- }], ariaBrailleroledescription: [{
833
- type: HostBinding,
834
- args: ['attr.aria-brailleroledescription']
835
- }], ariaColcount: [{
836
- type: HostBinding,
837
- args: ['attr.aria-colcount']
838
- }], ariaColindex: [{
839
- type: HostBinding,
840
- args: ['attr.aria-colindex']
841
- }], ariaColindextext: [{
842
- type: HostBinding,
843
- args: ['attr.aria-colindextext']
844
- }], ariaColspan: [{
845
- type: HostBinding,
846
- args: ['attr.aria-colspan']
847
- }], ariaDescription: [{
848
- type: HostBinding,
849
- args: ['attr.aria-description']
850
- }], ariaDetails: [{
851
- type: HostBinding,
852
- args: ['attr.aria-details']
853
- }], ariaFlowto: [{
854
- type: HostBinding,
855
- args: ['attr.aria-flowto']
856
- }], ariaInvalid: [{
857
- type: HostBinding,
858
- args: ['attr.aria-invalid']
859
- }], ariaKeyshortcuts: [{
860
- type: HostBinding,
861
- args: ['attr.aria-keyshortcuts']
862
- }], ariaOwns: [{
863
- type: HostBinding,
864
- args: ['attr.aria-owns']
865
- }], ariaRelevant: [{
866
- type: HostBinding,
867
- args: ['attr.aria-relevant']
868
- }], ariaRoledescription: [{
869
- type: HostBinding,
870
- args: ['attr.aria-roledescription']
871
- }], ariaRowcount: [{
872
- type: HostBinding,
873
- args: ['attr.aria-rowcount']
874
- }], ariaRowindex: [{
875
- type: HostBinding,
876
- args: ['attr.aria-rowindex']
877
- }], ariaRowindextext: [{
878
- type: HostBinding,
879
- args: ['attr.aria-rowindextext']
880
- }], ariaRowspan: [{
881
- type: HostBinding,
882
- args: ['attr.aria-rowspan']
883
- }], tabindex: [{
884
- type: HostBinding,
885
- args: ['attr.tabindex']
886
- }], title: [{
887
- type: HostBinding,
888
- args: ['attr.title']
889
- }], alt: [{
890
- type: HostBinding,
891
- args: ['attr.alt']
892
- }], lang: [{
893
- type: HostBinding,
894
- args: ['attr.lang']
895
- }], accesskey: [{
896
- type: HostBinding,
897
- args: ['attr.accesskey']
898
- }], autocomplete: [{
899
- type: HostBinding,
900
- args: ['attr.autocomplete']
901
- }], autofocus: [{
902
- type: HostBinding,
903
- args: ['attr.autofocus']
904
- }], contenteditable: [{
905
- type: HostBinding,
906
- args: ['attr.contenteditable']
907
- }], dir: [{
908
- type: HostBinding,
909
- args: ['attr.dir']
910
- }], draggable: [{
911
- type: HostBinding,
912
- args: ['attr.draggable']
913
- }], enterkeyhint: [{
914
- type: HostBinding,
915
- args: ['attr.enterkeyhint']
916
- }], hidden: [{
917
- type: HostBinding,
918
- args: ['attr.hidden']
919
- }], inputmode: [{
920
- type: HostBinding,
921
- args: ['attr.inputmode']
922
- }], spellcheck: [{
923
- type: HostBinding,
924
- args: ['attr.spellcheck']
925
- }], translate: [{
926
- type: HostBinding,
927
- args: ['attr.translate']
928
- }], ariaMultiline: [{
929
- type: HostBinding,
930
- args: ['attr.aria-multiline']
931
- }], for: [{
932
- type: HostBinding,
933
- args: ['attr.for']
934
- }], form: [{
935
- type: HostBinding,
936
- args: ['attr.form']
937
- }], headers: [{
938
- type: HostBinding,
939
- args: ['attr.headers']
940
- }], placeholder: [{
941
- type: HostBinding,
942
- args: ['attr.placeholder']
943
- }], readonly: [{
944
- type: HostBinding,
945
- args: ['attr.readonly']
946
- }], required: [{
947
- type: HostBinding,
948
- args: ['attr.required']
949
- }], menubar: [{
950
- type: ViewChild,
951
- args: ['menubar', { read: ElementRef }]
952
- }], menuItems: [{
953
- type: ViewChildren,
954
- args: [MenubaritemDirective]
955
- }], labelComponent: [{
956
- type: ContentChildren,
957
- args: [MenubarLabelComponent]
958
- }], itemComponentList: [{
959
- type: ContentChildren,
960
- args: [MenubarItemComponent]
961
- }] } });
962
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LW5hdi9jb21wb25lbnRzL21lbnViYXIvbWVudWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LW5hdi9jb21wb25lbnRzL21lbnViYXIvbWVudWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNVLGlCQUFpQixFQUNoQyxTQUFTLEVBQUUsZUFBZSxFQUMxQixVQUFVLEVBQUUsWUFBWSxFQUN4QixXQUFXLEVBQ1gsS0FBSyxFQUNNLE1BQU0sRUFDakIsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUlqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN4RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7OztBQU0xRSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsc0JBQXNCO0lBNkcxRCxZQUFvQixpQkFBb0M7UUFDdEQsS0FBSyxFQUFFLENBQUM7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QyxXQUFXO3VCQUFDLGVBQWU7Z0JBRWdCLE9BQU87c0JBQWxELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDTixTQUFTO3NCQUE1QyxZQUFZO3VCQUFDLG9CQUFvQjtnQkFDMEIsY0FBYztzQkFBckQsZUFBZTt1QkFBQyxxQkFBcUI7Z0JBQ25CLGlCQUFpQjtzQkFBdkQsZUFBZTt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Rlc3ktZm9ybXMvY29tcG9uZW50cy9sYWJlbC9sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGFiZWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vZGVzeS1mb3Jtcy9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBEZXN5Q29udGVudENoaWxkIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2RlY29yYXRvcnMvZGVzeS1jb250ZW50LWNoaWxkLmRlY29yYXRvcic7XG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9zdHJpbmctdXRpbHMnO1xuaW1wb3J0IHsgTWVudWJhckl0ZW0gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL21lbnViYXItaXRlbSc7XG5pbXBvcnQgeyBNZW51YmFySXRlbVN1Ykl0ZW0gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL21lbnViYXItaXRlbS1zdWItaXRlbSc7XG5pbXBvcnQgeyBNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tZW51YmFyLWl0ZW0tc3ViLWl0ZW0tc3ViLWl0ZW0nO1xuaW1wb3J0IHsgTWVudWJhckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1pdGVtL21lbnViYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudWJhckxhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21lbnViYXItbGFiZWwvbWVudWJhci1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudWJhclN1Yml0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1zdWJpdGVtL21lbnViYXItc3ViaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudWJhclN1YnN1Yml0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1zdWJzdWJpdGVtL21lbnViYXItc3Vic3ViaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudWJhcml0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvbWVudWJhcml0ZW0uZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGVzeS1tZW51YmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnViYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBpZFByZWZpeDogc3RyaW5nO1xuICBASW5wdXQoKSBpdGVtczogTWVudWJhckl0ZW1bXTtcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51YmFySXRlbVtdPigpO1xuICBAT3V0cHV0KCkgYWN0aXZlSXRlbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudWJhckl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBhY3RpdmVTdWJJdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51YmFySXRlbVN1Ykl0ZW18TWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbT4oKTtcblxuICAvKipcbiAgICogbGFiZWwsIGRpZmVyZW50ZXMgZm9ybWFzIGRlIGltcGxlbWVudGFyLCBlbnVtZXJhZGFzIHBvciBwcmlvcmlkYWRcbiAgICogMSkgaW5jbHVpciBjb21wb25lbnRlIG1lbnViYXItbGFiZWwgYW5pZGFkb1xuICAgKiAyKSBpbmNsdWlyIHRlbXBsYXRlXG4gICAqIDMpIGluY2x1aXIgb2JqZXRvIGxhYmVsIChpbnRlcmZheiBleHB1ZXN0YSlcbiAgICogNCkgaW5jbHVpciBsZWdlbmRUZXh0IC0gaW5jbHVpciB1biBsYWJlbCBjb24gc29sbyB1biB0ZXh0b1xuICAgKi9cbiAgQElucHV0KCkgbGFiZWxSZWY6IFRlbXBsYXRlUmVmPExhYmVsQ29tcG9uZW50PjtcbiAgQElucHV0KCkgbGFiZWxEYXRhOiBMYWJlbERhdGE7XG4gIEBJbnB1dCgpIGxhYmVsVGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc2VzOiBhbnk7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYy1tZW51YmFyJykgY2ZnID0gdHJ1ZVxuICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBpZDogYW55O1xuICBcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSByb2xlOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpIGFyaWFMYWJlbDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBhcmlhRGVzY3JpYmVkQnk6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRCeTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJykgYXJpYUhpZGRlbjogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGlzYWJsZWQnKSBhcmlhRGlzYWJsZWQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWNvbnRyb2xzJykgYXJpYUNvbnRyb2xzOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jdXJyZW50JykgYXJpYUN1cnJlbnQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxpdmUnKSBhcmlhTGl2ZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKSBhcmlhRXhwYW5kZWQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWVycm9ybWVzc2FnZScpIGFyaWFFcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJykgYXJpYUhhc1BvcHVwOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1tb2RhbCcpIGFyaWFNb2RhbDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY2hlY2tlZCcpIGFyaWFDaGVja2VkOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1wcmVzc2VkJykgYXJpYVByZXNzZWQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXJlYWRvbmx5JykgYXJpYVJlYWRvbmx5OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1yZXF1aXJlZCcpIGFyaWFSZXF1aXJlZDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKSBhcmlhU2VsZWN0ZWQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXZhbHVlbWluJykgYXJpYVZhbHVlbWluOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS12YWx1ZW1heCcpIGFyaWFWYWx1ZW1heDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtdmFsdWVub3cnKSBhcmlhVmFsdWVub3c6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXZhbHVldGV4dCcpIGFyaWFWYWx1ZXRleHQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW9yaWVudGF0aW9uJykgYXJpYU9yaWVudGF0aW9uOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sZXZlbCcpIGFyaWFMZXZlbDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlJykgYXJpYU11bHRpc2VsZWN0YWJsZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcGxhY2Vob2xkZXInKSBhcmlhUGxhY2Vob2xkZXI6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXBvc2luc2V0JykgYXJpYVBvc2luc2V0OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZXRzaXplJykgYXJpYVNldHNpemU6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNvcnQnKSBhcmlhU29ydDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtYnVzeScpIGFyaWFCdXN5OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kcm9wZWZmZWN0JykgYXJpYURyb3BlZmZlY3Q6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWdyYWJiZWQnKSBhcmlhR3JhYmJlZDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudCcpIGFyaWFBY3RpdmVkZXNjZW5kYW50OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1hdG9taWMnKSBhcmlhQXRvbWljOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1hdXRvY29tcGxldGUnKSBhcmlhQXV0b2NvbXBsZXRlOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1icmFpbGxlbGFiZWwnKSBhcmlhQnJhaWxsZWxhYmVsOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uJykgYXJpYUJyYWlsbGVyb2xlZGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWNvbGNvdW50JykgYXJpYUNvbGNvdW50OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb2xpbmRleCcpIGFyaWFDb2xpbmRleDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY29saW5kZXh0ZXh0JykgYXJpYUNvbGluZGV4dGV4dDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY29sc3BhbicpIGFyaWFDb2xzcGFuOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmlwdGlvbicpIGFyaWFEZXNjcmlwdGlvbjogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGV0YWlscycpIGFyaWFEZXRhaWxzOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1mbG93dG8nKSBhcmlhRmxvd3RvOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJykgYXJpYUludmFsaWQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWtleXNob3J0Y3V0cycpIGFyaWFLZXlzaG9ydGN1dHM6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW93bnMnKSBhcmlhT3duczogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcmVsZXZhbnQnKSBhcmlhUmVsZXZhbnQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXJvbGVkZXNjcmlwdGlvbicpIGFyaWFSb2xlZGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXJvd2NvdW50JykgYXJpYVJvd2NvdW50OiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1yb3dpbmRleCcpIGFyaWFSb3dpbmRleDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcm93aW5kZXh0ZXh0JykgYXJpYVJvd2luZGV4dGV4dDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcm93c3BhbicpIGFyaWFSb3dzcGFuOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKSB0YWJpbmRleDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRpdGxlJykgdGl0bGU6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hbHQnKSBhbHQ6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYW5nJykgbGFuZzogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFjY2Vzc2tleScpIGFjY2Vzc2tleTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmF1dG9jb21wbGV0ZScpIGF1dG9jb21wbGV0ZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmF1dG9mb2N1cycpIGF1dG9mb2N1czogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmNvbnRlbnRlZGl0YWJsZScpIGNvbnRlbnRlZGl0YWJsZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpcicpIGRpcjogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRyYWdnYWJsZScpIGRyYWdnYWJsZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmVudGVya2V5aGludCcpIGVudGVya2V5aGludDogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhpZGRlbicpIGhpZGRlbjogYm9vbGVhbiA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pbnB1dG1vZGUnKSBpbnB1dG1vZGU6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5zcGVsbGNoZWNrJykgc3BlbGxjaGVjazogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRyYW5zbGF0ZScpIHRyYW5zbGF0ZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbXVsdGlsaW5lJykgYXJpYU11bHRpbGluZTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZvcicpIGZvcjogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZvcm0nKSBmb3JtOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaGVhZGVycycpIGhlYWRlcnM6IHN0cmluZyA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5wbGFjZWhvbGRlcicpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucmVhZG9ubHknKSByZWFkb25seTogc3RyaW5nID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlcXVpcmVkJykgcmVxdWlyZWQ6IHN0cmluZyA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZCgnbWVudWJhcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBtZW51YmFyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkcmVuKE1lbnViYXJpdGVtRGlyZWN0aXZlKSBtZW51SXRlbXM6IFF1ZXJ5TGlzdDxNZW51YmFyaXRlbURpcmVjdGl2ZT47XG4gIEBEZXN5Q29udGVudENoaWxkKCkgQENvbnRlbnRDaGlsZHJlbihNZW51YmFyTGFiZWxDb21wb25lbnQpIGxhYmVsQ29tcG9uZW50OiBNZW51YmFyTGFiZWxDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGRyZW4oTWVudWJhckl0ZW1Db21wb25lbnQpIGl0ZW1Db21wb25lbnRMaXN0OiBRdWVyeUxpc3Q8TWVudWJhckl0ZW1Db21wb25lbnQ+O1xuXG4gIG1lbnVEYXRhOiBhbnlbXTtcbiAgdmlld0luaXQgPSBmYWxzZTtcbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBjdXJyZW50Rm9jdXNJdGVtSW5kZXggPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM/OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld0luaXQpIHtcbiAgICAgIHRoaXMuY2hlY2tDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMudmlld0luaXQgPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tDaGFuZ2VzKCk7XG4gIH1cblxuICBjaGVja0NoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLm1lbnVEYXRhID0gW107XG4gICAgdGhpcy5nZXRJdGVtcygpLmZvckVhY2goKF8sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpdGVtRGF0YSA9IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleDogMCxcbiAgICAgICAgY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4OiAwLFxuICAgICAgICBtZW51SXRlbTogdGhpcy5tZW51SXRlbXMudG9BcnJheSgpW2luZGV4XVxuICAgICAgfTtcbiAgICAgIHRoaXMubWVudURhdGEucHVzaChpdGVtRGF0YSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy52aWV3SW5pdCkge1xuICAgICAgdGhpcy5jaGVja1JlcXVpcmVkKCk7XG4gICAgfVxuXG5cbiAgICBjb25zdCBsYXN0Q3VycmVudEZvY3VzSXRlbUluZGV4ID0gdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXg7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgaWYgKGl0ZW1zKSB7XG4gICAgICB3aGlsZSAoIXRoaXMuaXNJdGVtRm9jdXNhYmxlKHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4ICUgaXRlbXMubGVuZ3RoKSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9ICh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCArIGl0ZW1zLmxlbmd0aCArIDEpICUgaXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggPT09IGxhc3RDdXJyZW50Rm9jdXNJdGVtSW5kZXgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLypcbiAgICogRXZlbnRvc1xuICAgKi9cblxuICBoYW5kbGVNZW51Rm9jdXNJbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBoYW5kbGVNZW51Rm9jdXNPdXQoZXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVudWJhci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgIH1cbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGFuZGxlTWVudUl0ZW1DbGljayhldmVudCwgaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5vcGVuO1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgIGlmICghaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3Blbk1lbnUoaXRlbUluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmF0ZU1lbnVJdGVtKGl0ZW1JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTWVudUl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c0ZpcnN0U3ViSXRlbShpdGVtSW5kZXgpKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZUl0ZW0oaXRlbUluZGV4LCAtMSk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShpdGVtSW5kZXgsICsxKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzTGFzdFN1Ykl0ZW0oaXRlbUluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzRmlyc3RJdGVtKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNMYXN0SXRlbSgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlQ2hhcihldmVudC5rZXkpKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0l0ZW1CeUZpcnN0Q2hhcihldmVudC5rZXkpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgsIHRydWUpO1xuICB9XG5cbiAgaGFuZGxlUG9wdXBNZW51SXRlbUNsaWNrKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmF0ZVBvcHVwTWVudUl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCk7XG4gICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcbiAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICB9XG5cbiAgaGFuZGxlUG9wdXBNZW51SXRlbUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN1YkluZGV4ID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleDtcbiAgICBjb25zdCBjdXJyZW50U3ViU3ViSW5kZXggPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4O1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVBvcHVwTWVudUl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCk7XG4gICAgICAgIGlmICh0aGlzLm11c3RDbG9zZUFmdGVyU2VsZWN0UG9wdXBJdGVtKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCBjdXJyZW50U3ViSW5kZXgsIGN1cnJlbnRTdWJTdWJJbmRleCwgLTEpO1xuICAgICAgICAvLyB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIChjdXJyZW50U3ViSW5kZXggKyBsaXN0TGVuZ3RoIC0gMSkgJSBsaXN0TGVuZ3RoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCBjdXJyZW50U3ViSW5kZXgsIGN1cnJlbnRTdWJTdWJJbmRleCwgKzEpO1xuICAgICAgICAvLyB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIChjdXJyZW50U3ViSW5kZXggKyBsaXN0TGVuZ3RoICsgMSkgJSBsaXN0TGVuZ3RoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSgoaXRlbUluZGV4ICsgaXRlbXMubGVuZ3RoIC0gMSkgJSBpdGVtcy5sZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSgoaXRlbUluZGV4ICsgaXRlbXMubGVuZ3RoICsgMSkgJSBpdGVtcy5sZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgdGhpcy5mb2N1c0ZpcnN0U3ViSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNMYXN0U3ViSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodGhpcy5pc1ByaW50YWJsZUNoYXIoZXZlbnQua2V5KSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNTdWJJdGVtQnlGaXJzdENoYXIoaXRlbUluZGV4LCBldmVudC5rZXkpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9wdXBNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xuICB9XG5cbiAgLypcbiAgICogQ29tdW5lc1xuICAgKi9cblxuICBjaGVja1JlcXVpcmVkKCk6IHZvaWQge1xuXG5cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgIC8vIE5vIHNlIGhhIHB1ZXN0byBsYWJlbCByZXF1aXJlZCBwb3JxdWUgZW4gYWxndW5vcyBlamVtcGxvcyBkZSBkZXN5LWh0bWwgbm8gYXBhcmVjZVxuICB9XG5cblxuICBhY3RpdmF0ZU1lbnVJdGVtKGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgdGhpcy5hY3RpdmVJdGVtQ2hhbmdlLmVtaXQoaXRlbXNbaXRlbUluZGV4XSBhcyBNZW51YmFySXRlbSk7XG4gICAgaWYgKGl0ZW1zW2l0ZW1JbmRleF0gaW5zdGFuY2VvZiBNZW51YmFySXRlbUNvbXBvbmVudCkge1xuICAgICAgKGl0ZW1zW2l0ZW1JbmRleF0gYXMgTWVudWJhckl0ZW1Db21wb25lbnQpLnNlbGVjdGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBhY3RpdmF0ZVBvcHVwTWVudUl0ZW0oaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGxldCBpdGVtOiBNZW51YmFySXRlbVN1Ykl0ZW18TWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbSA9IHN1Ykl0ZW1zW3N1Ykl0ZW1JbmRleF07XG4gICAgbGV0IHN1YlN1Ykl0ZW1zID0gW107XG4gICAgaWYgKHN1YlN1Ykl0ZW1JbmRleCAhPT0gbnVsbCAmJiBzdWJTdWJJdGVtSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhpdGVtKTtcbiAgICAgIGl0ZW0gPSBzdWJTdWJJdGVtc1tzdWJTdWJJdGVtSW5kZXhdO1xuICAgIH1cblxuICAgIGxldCBjaGVja2VkQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGl0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtY2hlY2tib3gnKSB7XG4gICAgICBpdGVtLmNoZWNrZWQgPSAhaXRlbS5jaGVja2VkO1xuICAgICAgY2hlY2tlZENoYW5nZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChpdGVtLnJvbGUgPT09ICdtZW51aXRlbXJhZGlvJykge1xuICAgICAgY2hlY2tlZENoYW5nZSA9ICFpdGVtLmNoZWNrZWQ7XG4gICAgICBzdWJTdWJJdGVtcy5mb3JFYWNoKGkgPT4gaS5jaGVja2VkID0gZmFsc2UpO1xuICAgICAgaXRlbS5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgIHRoaXMuYWN0aXZlU3ViSXRlbUNoYW5nZS5lbWl0KGl0ZW0gYXMgTWVudWJhckl0ZW0pO1xuICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudWJhclN1Yml0ZW1Db21wb25lbnQgfHwgaXRlbSBpbnN0YW5jZW9mIE1lbnViYXJTdWJzdWJpdGVtQ29tcG9uZW50KSB7XG4gICAgICBpdGVtLnNlbGVjdGVkLmVtaXQoKTtcblxuICAgICAgaWYgKGNoZWNrZWRDaGFuZ2UpIHtcbiAgICAgICAgaXRlbS5jaGVja2VkQ2hhbmdlLmVtaXQoaXRlbS5jaGVja2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtdXN0Q2xvc2VBZnRlclNlbGVjdFBvcHVwSXRlbShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgbGV0IGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcbiAgICBpZiAoc3ViU3ViSXRlbUluZGV4ICE9PSBudWxsICYmIHN1YlN1Ykl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKGl0ZW0pO1xuICAgICAgaXRlbSA9IHN1YlN1Ykl0ZW1zW3N1YlN1Ykl0ZW1JbmRleF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW0ucm9sZSAhPT0gJ21lbnVpdGVtY2hlY2tib3gnICYmIGl0ZW0ucm9sZSAhPT0gJ21lbnVpdGVtcmFkaW8nO1xuICB9XG5cbiAgb3Blbk1lbnUoaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNPcGVuZWQgPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3BlbjtcbiAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3BlbiA9IHRydWU7XG4gICAgaWYgKHdhc09wZW5lZCkge1xuICAgICAgdGhpcy5hY3RpdmF0ZU1lbnVJdGVtKGl0ZW1JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VNZW51KGl0ZW1JbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpdGVtSW5kZXggIT09IG51bGwgJiYgaXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5vcGVuID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudURhdGEuZm9yRWFjaChpdGVtID0+IGl0ZW0ub3BlbiA9IGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBoYXNQb3B1cE1lbnUoaXRlbUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIHJldHVybiBpdGVtc1tpdGVtSW5kZXhdLnN1YiAmJiBzdWJJdGVtcyAmJiBzdWJJdGVtcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUNoYXIoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RyLmxlbmd0aCA9PT0gMSAmJiAhIXN0ci5tYXRjaCgvXFxTLyk7XG4gIH1cblxuICBwcml2YXRlIGdldE1lbnVEYXRhSW5kZXgoaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBtZW51RGF0YUluZGV4ID0gMDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViSXRlbUluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IHN1Ykl0ZW0gPSBzdWJJdGVtc1tpXTtcbiAgICAgIGNvbnN0IHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoc3ViSXRlbSk7XG4gICAgICBtZW51RGF0YUluZGV4ICs9IHN1YlN1Ykl0ZW1zICYmIHN1YlN1Ykl0ZW1zLmxlbmd0aCA+IDAgPyBzdWJTdWJJdGVtcy5sZW5ndGggOiAxO1xuICAgIH1cblxuICAgIGlmIChzdWJTdWJJdGVtSW5kZXggIT09IG51bGwgJiYgc3ViU3ViSXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lbnVEYXRhSW5kZXggKz0gc3ViU3ViSXRlbUluZGV4O1xuICAgIH1cblxuICAgIHJldHVybiBtZW51RGF0YUluZGV4O1xuICB9XG5cbiAgLypcbiAgICogQ29tdW5lcyAtIGZvY3VzXG4gICAqL1xuXG4gIGZvY3VzSXRlbShpdGVtSW5kZXg6IG51bWJlciwgaG92ZXI/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRm9jdXMgPSB0aGlzLm1lbnViYXIubmF0aXZlRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICBjb25zdCBpc09wZW4gPSB0aGlzLm1lbnVEYXRhW3RoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4XS5vcGVuO1xuXG4gICAgaWYgKCFob3ZlciB8fCBoYXNGb2N1cykge1xuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm1lbnVJdGVtLmxpbmsubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgaWYgKGlzT3BlbiAmJiB0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggPSBpdGVtSW5kZXg7XG4gIH1cblxuICBmb2N1c05leHRBdmFpbGFibGVJdGVtKGZyb21JdGVtSW5kZXg6IG51bWJlciwgc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IG5leHRJdGVtID0gZnJvbUl0ZW1JbmRleDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBkbyB7XG4gICAgICBuZXh0SXRlbSA9IChuZXh0SXRlbSArIGl0ZW1zLmxlbmd0aCArIHN0ZXApICUgaXRlbXMubGVuZ3RoO1xuICAgIH0gd2hpbGUgKCF0aGlzLmlzSXRlbUZvY3VzYWJsZShuZXh0SXRlbSkgJiYgbmV4dEl0ZW0gIT09IGZyb21JdGVtSW5kZXgpO1xuXG4gICAgaWYgKG5leHRJdGVtICE9PSBmcm9tSXRlbUluZGV4KSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbShuZXh0SXRlbSk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNGaXJzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJdGVtRm9jdXNhYmxlKDApKSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKDAsICsxKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0xhc3RJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGlmICh0aGlzLmlzSXRlbUZvY3VzYWJsZShpdGVtcy5sZW5ndGggLSAxKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShpdGVtcy5sZW5ndGggLSAxLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgaXNJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmdldEl0ZW1zKClbaXRlbUluZGV4XS5kaXNhYmxlZDtcbiAgfVxuXG4gIGZvY3VzSXRlbUJ5Rmlyc3RDaGFyKGNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1Db250ZW50czogc3RyaW5nW10gPSB0aGlzLm1lbnVJdGVtcy5tYXAobWVudUl0ZW0gPT4gbWVudUl0ZW0uaXRlbUNvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4O1xuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XG4gICAgZG8ge1xuICAgICAgaW5kZXggPSAoaW5kZXggKyBpdGVtQ29udGVudHMubGVuZ3RoICsgMSkgJSBpdGVtQ29udGVudHMubGVuZ3RoO1xuICAgICAgaWYgKGl0ZW1Db250ZW50c1tpbmRleF0gJiYgaXRlbUNvbnRlbnRzW2luZGV4XS50cmltKCkuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgPT09IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICYmIHRoaXMuaXNJdGVtRm9jdXNhYmxlKGluZGV4KSkge1xuICAgICAgICBmb3VuZEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoZm91bmRJbmRleCA9PT0gLTEgJiYgaW5kZXggIT09IHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4KTtcblxuICAgIGlmIChmb3VuZEluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKGZvdW5kSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzU3ViSXRlbShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ucG9wdXBNZW51SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWVudURhdGFJbmRleCA9IHRoaXMuZ2V0TWVudURhdGFJbmRleChpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcblxuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleCA9IHN1Ykl0ZW1JbmRleDtcbiAgICAgIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXggPSBzdWJTdWJJdGVtSW5kZXg7XG4gICAgICBjb25zdCBlbGVtID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm1lbnVJdGVtLnBvcHVwTWVudUl0ZW1zLnRvQXJyYXkoKVttZW51RGF0YUluZGV4XS5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgZWxlbS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3ViaXRlbSB0byBmb2N1cycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdWJpdGVtcycpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4OiBudW1iZXIsIGZyb21JdGVtU3ViSW5kZXg6IG51bWJlciwgZnJvbUl0ZW1TdWJTdWJJbmRleDogbnVtYmVyLCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgbmV4dFN1YkluZGV4ID0gZnJvbUl0ZW1TdWJJbmRleDtcbiAgICBsZXQgbmV4dFN1YlN1YkluZGV4ID0gZnJvbUl0ZW1TdWJTdWJJbmRleDtcbiAgICBsZXQgYWxsU3ViSXRlbXNDaGVja2VkO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gdGhpcy5nZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgbmV4dFN1YkluZGV4LCBuZXh0U3ViU3ViSW5kZXgsIHN0ZXApO1xuICAgICAgbmV4dFN1YkluZGV4ID0gbmV4dEluZGV4ZXMuc3ViSW5kZXg7XG4gICAgICBuZXh0U3ViU3ViSW5kZXggPSBuZXh0SW5kZXhlcy5zdWJTdWJJbmRleDtcbiAgICAgIGFsbFN1Ykl0ZW1zQ2hlY2tlZCA9IChmcm9tSXRlbVN1YkluZGV4ID09PSBuZXh0U3ViSW5kZXggJiYgZnJvbUl0ZW1TdWJTdWJJbmRleCA9PT0gbmV4dFN1YlN1YkluZGV4KTtcbiAgICB9IHdoaWxlICghdGhpcy5pc1N1Ykl0ZW1Gb2N1c2FibGUoaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCkgJiYgIWFsbFN1Ykl0ZW1zQ2hlY2tlZCk7XG5cbiAgICBpZiAoIWFsbFN1Ykl0ZW1zQ2hlY2tlZCkge1xuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNGaXJzdFN1Ykl0ZW0oaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgZmlyc3RTdWJTdWJJdGVtID0gbnVsbDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGNvbnN0IHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoc3ViSXRlbXNbMF0pO1xuICAgIGlmIChzdWJTdWJJdGVtcyAmJiBzdWJTdWJJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaXJzdFN1YlN1Ykl0ZW0gPSAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIDAsIGZpcnN0U3ViU3ViSXRlbSkpIHtcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgMCwgZmlyc3RTdWJTdWJJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVTdWJJdGVtKGl0ZW1JbmRleCwgMCwgZmlyc3RTdWJTdWJJdGVtLCArMSk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNMYXN0U3ViSXRlbShpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgY29uc3QgbGFzdEl0ZW1JbmRleCA9IHN1Ykl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdEl0ZW0gPSBzdWJJdGVtc1tsYXN0SXRlbUluZGV4XTtcbiAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKGxhc3RJdGVtKTtcbiAgICBsZXQgbGFzdFN1YlN1Ykl0ZW0gPSBudWxsO1xuICAgIGlmIChzdWJTdWJJdGVtcyAmJiBzdWJTdWJJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBsYXN0U3ViU3ViSXRlbSA9IHN1YlN1Ykl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0pKSB7XG4gICAgICB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIGxhc3RJdGVtSW5kZXgsIGxhc3RTdWJTdWJJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVTdWJJdGVtKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0sIC0xKTtcbiAgICB9XG4gIH1cblxuICBpc1N1Ykl0ZW1Gb2N1c2FibGUoaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGxldCBpdGVtOiBNZW51YmFySXRlbVN1Ykl0ZW18TWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbSA9IHN1Ykl0ZW1zW3N1Ykl0ZW1JbmRleF07XG4gICAgaWYgKHN1YlN1Ykl0ZW1JbmRleCAhPT0gbnVsbCAmJiBzdWJTdWJJdGVtSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhpdGVtKTtcbiAgICAgIGl0ZW0gPSBzdWJTdWJJdGVtc1tzdWJTdWJJdGVtSW5kZXhdO1xuICAgIH1cblxuICAgIGxldCBpc0ZvY3VzYWJsZSA9IGZhbHNlO1xuICAgIGlmIChpdGVtLnJvbGUgIT09ICdzZXBhcmF0b3InICYmIGl0ZW0ucm9sZSAhPT0gJ25vbmUnKSB7XG4gICAgICBpc0ZvY3VzYWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRm9jdXNhYmxlO1xuICB9XG5cbiAgZm9jdXNTdWJJdGVtQnlGaXJzdENoYXIoaXRlbUluZGV4OiBudW1iZXIsIGNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1Db250ZW50czogc3RyaW5nW10gPSB0aGlzLm1lbnVJdGVtcy50b0FycmF5KClbaXRlbUluZGV4XS5wb3B1cE1lbnVJdGVtcy5tYXAobWVudUl0ZW0gPT4gbWVudUl0ZW0ubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgbGV0IHN1Ykl0ZW1JbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXg7XG4gICAgbGV0IHN1YlN1Ykl0ZW1JbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg7XG4gICAgbGV0IGZvdW5kU3ViSW5kZXggPSAtMTtcbiAgICBsZXQgZm91bmRTdWJTdWJJbmRleCA9IG51bGw7XG4gICAgbGV0IGFsbFN1Ykl0ZW1zQ2hlY2tlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gdGhpcy5nZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgsICsxKTtcbiAgICAgIHN1Ykl0ZW1JbmRleCA9IG5leHRJbmRleGVzLnN1YkluZGV4O1xuICAgICAgc3ViU3ViSXRlbUluZGV4ID0gbmV4dEluZGV4ZXMuc3ViU3ViSW5kZXg7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0TWVudURhdGFJbmRleChpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICAgIGlmIChpdGVtQ29udGVudHNbaW5kZXhdICYmIGl0ZW1Db250ZW50c1tpbmRleF0udHJpbSgpLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpID09PSBjaGFyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAmJiB0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KSkge1xuICAgICAgICBmb3VuZFN1YkluZGV4ID0gc3ViSXRlbUluZGV4O1xuICAgICAgICBmb3VuZFN1YlN1YkluZGV4ID0gc3ViU3ViSXRlbUluZGV4O1xuICAgICAgfVxuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXggPT09IHN1Ykl0ZW1JbmRleFxuICAgICAgICAmJiB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4ID09PSBzdWJTdWJJdGVtSW5kZXgpO1xuICAgIH0gd2hpbGUgKGZvdW5kU3ViSW5kZXggPT09IC0xICYmICFhbGxTdWJJdGVtc0NoZWNrZWQpO1xuXG4gICAgaWYgKGZvdW5kU3ViSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCBmb3VuZFN1YkluZGV4LCBmb3VuZFN1YlN1YkluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBNZXRvZG9zIHBhcmEgZmFjaWxpdGFyIGNvbnRlbmlkb1xuICAgKi9cblxuICBnZXRJdGVtcygpOiBNZW51YmFySXRlbVtdfE1lbnViYXJJdGVtQ29tcG9uZW50W10ge1xuICAgIGxldCBpdGVtcztcbiAgICBpZiAodGhpcy5pdGVtQ29tcG9uZW50TGlzdCAmJiB0aGlzLml0ZW1Db21wb25lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGl0ZW1zID0gdGhpcy5pdGVtQ29tcG9uZW50TGlzdC50b0FycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgZ2V0SXRlbVN1Yml0ZW1zKGl0ZW06IE1lbnViYXJJdGVtfE1lbnViYXJJdGVtQ29tcG9uZW50KTogTWVudWJhckl0ZW1TdWJJdGVtW118TWVudWJhclN1Yml0ZW1Db21wb25lbnRbXSB7XG4gICAgbGV0IHN1Ykl0ZW1zID0gW107XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51YmFySXRlbUNvbXBvbmVudCl7XG4gICAgICBzdWJJdGVtcyA9IGl0ZW0uZ2V0U3ViSXRlbXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXN1Ykl0ZW1zIHx8IHN1Ykl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc3ViSXRlbXMgPSBpdGVtLnN1YiA/IGl0ZW0uc3ViLml0ZW1zIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Ykl0ZW1zO1xuICB9XG5cbiAgZ2V0U3ViSXRlbVN1Yml0ZW1zKGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFyU3ViaXRlbUNvbXBvbmVudCk6IE1lbnViYXJJdGVtU3ViSXRlbVN1Ykl0ZW1bXXxNZW51YmFyU3Vic3ViaXRlbUNvbXBvbmVudFtdIHtcbiAgICBsZXQgc3ViSXRlbXMgPSBbXTtcblxuICAgIGlmIChpdGVtLnJvbGUgPT09ICdncm91cCcpIHtcbiAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudWJhclN1Yml0ZW1Db21wb25lbnQpIHtcbiAgICAgICAgc3ViSXRlbXMgPSBpdGVtLmdldFN1Ykl0ZW1zKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3ViSXRlbXMgfHwgc3ViSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN1Ykl0ZW1zID0gaXRlbS5pdGVtcyA/IGl0ZW0uaXRlbXMgOiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3ViSXRlbXM7XG4gIH1cblxuICBnZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgbmV4dFN1YkluZGV4LCBuZXh0U3ViU3ViSW5kZXgsIHN0ZXApOiB7IHN1YkluZGV4OiBudW1iZXIsIHN1YlN1YkluZGV4PzogbnVtYmVyfSB7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcbiAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKHN1Ykl0ZW1zW25leHRTdWJJbmRleF0pO1xuXG4gICAgbGV0IGNoZWNrTmV4dFN1Ykl0ZW0gPSB0cnVlO1xuICAgIGlmIChzdWJTdWJJdGVtcyAmJiBzdWJTdWJJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAobmV4dFN1YlN1YkluZGV4ICsgc3RlcCA+PSAwICYmIG5leHRTdWJTdWJJbmRleCArIHN0ZXAgPCBzdWJTdWJJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgbmV4dFN1YlN1YkluZGV4ICs9IHN0ZXA7XG4gICAgICAgIGNoZWNrTmV4dFN1Ykl0ZW0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hlY2tOZXh0U3ViSXRlbSkge1xuICAgICAgbmV4dFN1YkluZGV4ID0gKG5leHRTdWJJbmRleCArIHN0ZXAgKyBzdWJJdGVtcy5sZW5ndGgpICUgc3ViSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgbmV4dFN1Ykl0ZW1JdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKHN1Ykl0ZW1zW25leHRTdWJJbmRleF0pO1xuICAgICAgaWYgKG5leHRTdWJJdGVtSXRlbXMgJiYgbmV4dFN1Ykl0ZW1JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5leHRTdWJTdWJJbmRleCA9ICgoc3RlcCA+IDAgPyAtMSA6IDApICsgc3RlcCArIG5leHRTdWJJdGVtSXRlbXMubGVuZ3RoKSAlIG5leHRTdWJJdGVtSXRlbXMubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFN1YlN1YkluZGV4ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3N1YkluZGV4OiBuZXh0U3ViSW5kZXgsIHN1YlN1YkluZGV4OiBuZXh0U3ViU3ViSW5kZXh9O1xuICB9XG5cbiAgZ2V0SWRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZFByZWZpeCA/IHRoaXMuaWRQcmVmaXggOiB0aGlzLmlkICsgJ21lbnViYXItaXRlbSc7XG4gIH1cblxuICBnZXRMYWJlbFJlZigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbENvbXBvbmVudCA/IHRoaXMubGFiZWxDb21wb25lbnQuZ2V0Q29udGVudCgpIDogdGhpcy5sYWJlbFJlZjtcbiAgfVxuXG4gIGdldExhYmVsQ29udGVudCgpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgaWYgKHRoaXMubGFiZWxEYXRhKSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5sYWJlbERhdGEuaHRtbCA/IHRoaXMubGFiZWxEYXRhLmh0bWwgOiBgPHA+JHsgU3RyaW5nVXRpbHMuZXNjYXBlSHRtbCh0aGlzLmxhYmVsRGF0YS50ZXh0KSB9PC9wPmA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsVGV4dCkge1xuICAgICAgY29udGVudCA9IGA8cD4keyBTdHJpbmdVdGlscy5lc2NhcGVIdG1sKHRoaXMubGFiZWxUZXh0KSB9PC9wPmA7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgZ2V0SXRlbUlkKGl0ZW0sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBpZDogc3RyaW5nO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5pZCkge1xuICAgICAgICBpZCA9IGl0ZW0uaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZCA9IGAke3RoaXMuZ2V0SWRQcmVmaXgoKX0tJHsrK2luZGV4fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGdldFBvcHVwU3R5bGUoaXRlbUluZGV4OiBudW1iZXIpOiBvYmplY3Qge1xuICAgIGxldCBzdHlsZSA9IHt9O1xuICAgIGlmICh0aGlzLm1lbnVEYXRhICYmIGl0ZW1JbmRleCA8IHRoaXMubWVudURhdGEubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5tZW51SXRlbTtcbiAgICAgIGNvbnN0IHJlY3QgPSBtZW51SXRlbS5saW5rLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAodGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4pIHtcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgdG9wOiAocmVjdC5oZWlnaHQgLSAxKSArICdweCcsXG4gICAgICAgICAgbGVmdDogJzBweCcsXG4gICAgICAgICAgekluZGV4OiAxMDAsXG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgekluZGV4OiAwLFxuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIGdldFN1Ykl0ZW1JZChpdGVtLCBpbmRleDogbnVtYmVyLCBwYXJlbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgaWQ6IHN0cmluZztcbiAgICBpZiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0uaWQpIHtcbiAgICAgICAgaWQgPSBpdGVtLmlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSBgc3ViLSR7cGFyZW50SWR9LSR7KytpbmRleH1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBnZXRTdWJTdWJJdGVtQXJpYUNoZWNrZWQoc3Vic3ViaXRlbSk6IHN0cmluZyB7XG4gICAgbGV0IGFyaWFDaGVja2VkID0gbnVsbDtcbiAgICBpZiAoc3Vic3ViaXRlbS5yb2xlID09PSAnbWVudWl0ZW1jaGVja2JveCcgfHwgc3Vic3ViaXRlbS5yb2xlID09PSAnbWVudWl0ZW1yYWRpbycpIHtcbiAgICAgIGFyaWFDaGVja2VkID0gISFzdWJzdWJpdGVtLmNoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBhcmlhQ2hlY2tlZDtcbiAgfVxufVxuIiwiICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TGFiZWxSZWYoKVwiPlxuICAgIDxkaXYgW2lkXT1cImlkICsgJy1sYWJlbCdcIiBbY2xhc3NdPVwiWydtYi1zbScsIGxhYmVsQ29tcG9uZW50ID8gbGFiZWxDb21wb25lbnQuY2xhc3NlcyA6IChsYWJlbERhdGEgPyBsYWJlbERhdGEuY2xhc3NlcyA6IG51bGwpXSB8IG1ha2VIdG1sTGlzdFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldExhYmVsUmVmKClcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ2V0TGFiZWxSZWYoKSAmJiAobGFiZWxEYXRhIHx8IGxhYmVsVGV4dClcIj5cbiAgICA8ZGl2IFtpZF09XCJpZCArICctbGFiZWwnXCIgW2NsYXNzXT1cIlsnbWItc20nLCBsYWJlbERhdGEgPyBsYWJlbERhdGEuY2xhc3NlcyA6IG51bGxdIHwgbWFrZUh0bWxMaXN0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBodG1sOiBnZXRMYWJlbENvbnRlbnQoKSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8dWwgI21lbnViYXIgW2lkXT1cImlkICsgJy1tZW51YmFyJ1wiIGNsYXNzPVwibGc6ZmxleCBsZzpmbGV4LXdyYXBcIiByb2xlPVwibWVudWJhclwiXG4gICAgICAoZm9jdXNpbik9XCJoYW5kbGVNZW51Rm9jdXNJbigpXCJcbiAgICAgIChmb2N1c291dCk9XCJoYW5kbGVNZW51Rm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdmb2N1cyc6IGlzRm9jdXNlZCB9XCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImdldExhYmVsUmVmKCkgfHwgbGFiZWxEYXRhIHx8IGxhYmVsVGV4dCA/IGlkICsgJy1sYWJlbCcgOiBudWxsXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRJdGVtcygpOyBpbmRleCBhcyBpdGVtSW5kZXhcIj5cbiAgICAgIDxsaSBjbGFzcz1cInJlbGF0aXZlXCIgcm9sZT1cIm5vbmVcIiBkZXN5TWVudWJhcml0ZW0gKGNvbnRlbnRDaGFuZ2VkKT1cImNoZWNrQ2hhbmdlcygpXCI+XG4gICAgICAgIDxhICpuZ0lmPVwiaXRlbS5zdWJcIiAjbGlua1xuICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIFxuICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm1lbnVEYXRhICYmIG1lbnVEYXRhW2l0ZW1JbmRleF0gPyBtZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgIChjbGljayk9XCJoYW5kbGVNZW51SXRlbUNsaWNrKCRldmVudCwgaXRlbUluZGV4KVwiXG4gICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZU1lbnVJdGVtS2V5ZG93bigkZXZlbnQsIGl0ZW1JbmRleClcIlxuICAgICAgICAgICAobW91c2VvdmVyKT1cImhhbmRsZU1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleClcIlxuICAgICAgICAgICAoZGVzeUF0dHJpYnV0ZUNoYW5nZSk9XCJjaGVja0NoYW5nZXMoKVwiIFthdHRyaWJ1dGVzVG9DaGVja109XCInZGlzYWJsZWQnXCJcbiAgICAgICAgICAgW2lkXT1cImdldEl0ZW1JZChpdGVtLCBpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgW2NsYXNzXT1cIlsnYy1tZW51YmFyX19idXR0b24nLCBpdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwieydjLW1lbnViYXJfX2J1dHRvbi0tZGlzYWJsZWQnOiBpdGVtLmRpc2FibGVkLCAnYy1tZW51YmFyX19idXR0b24tLWhhcy1zZWxlY3Rpb24nOiBpdGVtLmFjdGl2ZX1cIiAgICAgICAgICAgXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCA/IGl0ZW0uZGlzYWJsZWQgOiAoaXRlbS5hcmlhRGlzYWJsZWQgPyBpdGVtLmFyaWFEaXNhYmxlZCA6IG51bGwpXCJcbiAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cIml0ZW1cIlxuICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpdGVtLmRpc2FibGVkID8gLTEgOiAoaXRlbUluZGV4ID09PSBjdXJyZW50Rm9jdXNJdGVtSW5kZXggPyAwIDogLTEpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBzZWxmLWNlbnRlciBtYXgtdy14cyBhbGlnbi1taWRkbGUgdHJ1bmNhdGVcIiAjaXRlbUNvbnRlbnRXcmFwcGVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBpdGVtLCBodG1sOiBpdGVtLmh0bWwsIHRleHQ6IGl0ZW0udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cImlubGluZS1ibG9jayAtbXItMiAgYWxpZ24tbWlkZGxlIC1teS1weFwiIHZpZXdCb3g9XCIwIDAgOTYgOTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiB3aWR0aD1cIjEuNWVtXCIgaGVpZ2h0PVwiMS41ZW1cIj48Zz48cGF0aCBkPVwiTTQ2LjcxIDU4LjAzN2ExLjgyMyAxLjgyMyAwIDAwMi41ODEgMEw2Mi4wNDggNDUuMjhhMS44MjMgMS44MjMgMCAwMC0xLjI5LTMuMTEzSDM1LjI0M2ExLjgyMyAxLjgyMyAwIDAwLTEuMjkxIDMuMTEzelwiLz48L2c+PC9zdmc+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGEgKm5nSWY9XCJpdGVtLnJvdXRlckxpbmsgJiYgIWl0ZW0uc3ViXCIgI2xpbmsgI2l0ZW1Db250ZW50V3JhcHBlclxuICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlTWVudUl0ZW1DbGljaygkZXZlbnQsIGl0ZW1JbmRleClcIlxuICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJoYW5kbGVNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgKGRlc3lBdHRyaWJ1dGVDaGFuZ2UpPVwiY2hlY2tDaGFuZ2VzKClcIiBbYXR0cmlidXRlc1RvQ2hlY2tdPVwiJ2Rpc2FibGVkJ1wiXG4gICAgICAgICAgIFtpZF09XCJnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KVwiXG4gICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIml0ZW0ucm91dGVyTGlua0FjdGl2ZUNsYXNzZXMgPyBpdGVtLnJvdXRlckxpbmtBY3RpdmVDbGFzc2VzIDogW11cIlxuICAgICAgICAgICBbZnJhZ21lbnRdPVwiaXRlbS5mcmFnbWVudFwiXG4gICAgICAgICAgIFtjbGFzc109XCJbJ2MtbWVudWJhcl9fYnV0dG9uJywgaXRlbS5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYy1tZW51YmFyX19idXR0b24tLWRpc2FibGVkJzogaXRlbS5kaXNhYmxlZCwgJ2MtbWVudWJhcl9fYnV0dG9uLS1oYXMtc2VsZWN0aW9uJzogaXRlbS5hY3RpdmV9XCJcbiAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCA/IGl0ZW0uZGlzYWJsZWQgOiBudWxsXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IChpdGVtLmFyaWFEaXNhYmxlZCA/IGl0ZW0uYXJpYURpc2FibGVkIDogbnVsbClcIlxuICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpdGVtLmRpc2FibGVkID8gLTEgOiAoaXRlbUluZGV4ID09PSBjdXJyZW50Rm9jdXNJdGVtSW5kZXggPyAwIDogLTEpXCJcbiAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0udGFyZ2V0ID8gaXRlbS50YXJnZXQgOiBudWxsXCJcbiAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cIml0ZW1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGl0ZW0sIGh0bWw6IGl0ZW0uaHRtbCwgdGV4dDogaXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxhICpuZ0lmPVwiIWl0ZW0ucm91dGVyTGluayAmJiBpdGVtLmhyZWYgJiYgIWl0ZW0uc3ViXCIgI2xpbmsgI2l0ZW1Db250ZW50V3JhcHBlclxuICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlTWVudUl0ZW1DbGljaygkZXZlbnQsIGl0ZW1JbmRleClcIlxuICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJoYW5kbGVNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgKGRlc3lBdHRyaWJ1dGVDaGFuZ2UpPVwiY2hlY2tDaGFuZ2VzKClcIiBbYXR0cmlidXRlc1RvQ2hlY2tdPVwiJ2Rpc2FibGVkJ1wiXG4gICAgICAgICAgIFtpZF09XCJnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KVwiXG4gICAgICAgICAgIFtocmVmXT1cIml0ZW0uaHJlZiB8IGV4dGVybmFsSHJlZlwiXG4gICAgICAgICAgIFtjbGFzc109XCJbJ2MtbWVudWJhcl9fYnV0dG9uJywgaXRlbS5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYy1tZW51YmFyX19idXR0b24tLWRpc2FibGVkJzogaXRlbS5kaXNhYmxlZCwgJ2MtbWVudWJhcl9fYnV0dG9uLS1oYXMtc2VsZWN0aW9uJzogaXRlbS5hY3RpdmV9XCJcbiAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCA/IGl0ZW0uZGlzYWJsZWQgOiBudWxsXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IChpdGVtLmFyaWFEaXNhYmxlZCA/IGl0ZW0uYXJpYURpc2FibGVkIDogbnVsbClcIlxuICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpdGVtLmRpc2FibGVkID8gLTEgOiAoaXRlbUluZGV4ID09PSBjdXJyZW50Rm9jdXNJdGVtSW5kZXggPyAwIDogLTEpXCJcbiAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0udGFyZ2V0ID8gaXRlbS50YXJnZXQgOiBudWxsXCJcbiAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cIml0ZW1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGl0ZW0sIGh0bWw6IGl0ZW0uaHRtbCwgdGV4dDogaXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG5cbiAgICAgICAgPHVsICpuZ0lmPVwiaXRlbS5zdWIgJiYgZ2V0SXRlbVN1Yml0ZW1zKGl0ZW0pXCIgI3BvcHVwTWVudSByb2xlPVwibWVudVwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0UG9wdXBTdHlsZShpdGVtSW5kZXgpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJbJ2MtbWVudWJhcl9fdG9vbHRpcCB3LW1heCBtYXgtdy02NCBoaWRkZW4gYm9yZGVyIGJvcmRlci1uZXV0cmFsLWJhc2Ugc2hhZG93LW1kIGJnLXdoaXRlIHRleHQtc20nLCBpdGVtLnN1Yi5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIml0ZW0uYXJpYUxhYmVsID8gaXRlbS5hcmlhTGFiZWwgOiAoaXRlbS5zdWIuYXJpYUxhYmVsID8gaXRlbS5zdWIuYXJpYUxhYmVsIDogbnVsbClcIlxuICAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cIml0ZW0uc3ViXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiISEobWVudURhdGEgJiYgbWVudURhdGFbaXRlbUluZGV4XS5vcGVuKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1Ykl0ZW0gb2YgZ2V0SXRlbVN1Yml0ZW1zKGl0ZW0pOyBpbmRleCBhcyBzdWJJdGVtSW5kZXhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1Ykl0ZW0ucm9sZVwiPlxuICAgICAgICAgICAgICA8bGkgI3BvcHVwTWVudUl0ZW0gKm5nU3dpdGNoQ2FzZT1cIidub25lJ1wiIHJvbGU9XCJub25lXCIgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0U3ViSXRlbUlkKHN1Ykl0ZW0sIHN1Ykl0ZW1JbmRleCwgZ2V0SXRlbUlkKGl0ZW0sIGl0ZW1JbmRleCkpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiaGFuZGxlUG9wdXBNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlUG9wdXBNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IHN1Ykl0ZW0sIGh0bWw6IHN1Ykl0ZW0uaHRtbCwgdGV4dDogc3ViSXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgKm5nU3dpdGNoQ2FzZT1cIidncm91cCdcIiByb2xlPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDx1bCByb2xlPVwiZ3JvdXBcIiBbaWRdPVwiZ2V0U3ViSXRlbUlkKHN1Ykl0ZW0sIHN1Ykl0ZW1JbmRleCwgZ2V0SXRlbUlkKGl0ZW0sIGl0ZW1JbmRleCkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzdWJJdGVtLmFyaWFMYWJlbCA/IHN1Ykl0ZW0uYXJpYUxhYmVsIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Vic3ViaXRlbSBvZiBnZXRTdWJJdGVtU3ViaXRlbXMoc3ViSXRlbSk7IGluZGV4IGFzIHN1YnN1YkluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJzdWJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpICNwb3B1cE1lbnVJdGVtIFthdHRyLnJvbGVdPVwic3Vic3ViaXRlbS5yb2xlID8gc3Vic3ViaXRlbS5yb2xlIDogbnVsbFwiICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldFN1Ykl0ZW1JZChzdWJzdWJpdGVtLCBzdWJzdWJJbmRleCwgZ2V0U3ViSXRlbUlkKHN1Ykl0ZW0sIHN1Ykl0ZW1JbmRleCwgZ2V0SXRlbUlkKGl0ZW0sIGl0ZW1JbmRleCkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YnN1YkluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiaGFuZGxlUG9wdXBNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3Vic3ViSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlUG9wdXBNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3Vic3ViSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImdldFN1YlN1Ykl0ZW1BcmlhQ2hlY2tlZChzdWJzdWJpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHItYmFzZSBwbC1sZyBweS1zbSBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1wcmltYXJ5LWJhc2UgaG92ZXI6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBzdWJzdWJpdGVtLCBodG1sOiBzdWJzdWJpdGVtLmh0bWwsIHRleHQ6IHN1YnN1Yml0ZW0udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSAjcG9wdXBNZW51SXRlbSAqbmdTd2l0Y2hDYXNlPVwiJ21lbnVpdGVtJ1wiIHJvbGU9XCJtZW51aXRlbVwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1DbGljayhpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJoYW5kbGVQb3B1cE1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVQb3B1cE1lbnVJdGVtS2V5ZG93bigkZXZlbnQsIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0U3ViSXRlbUlkKHN1Ykl0ZW0sIHN1Ykl0ZW1JbmRleCwgZ2V0SXRlbUlkKGl0ZW0sIGl0ZW1JbmRleCkpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHItYmFzZSBwbC1sZyBweS1zbSBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1wcmltYXJ5LWJhc2UgaG92ZXI6dGV4dC13aGl0ZSBmb2N1czpiZy1wcmltYXJ5LWJhc2UgZm9jdXM6dGV4dC13aGl0ZSBmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IHN1Ykl0ZW0sIGh0bWw6IHN1Ykl0ZW0uaHRtbCwgdGV4dDogc3ViSXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgI3BvcHVwTWVudUl0ZW0gKm5nU3dpdGNoQ2FzZT1cIidtZW51aXRlbWNoZWNrYm94J1wiIHJvbGU9XCJtZW51aXRlbWNoZWNrYm94XCIgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUG9wdXBNZW51SXRlbUNsaWNrKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1LZXlkb3duKCRldmVudCwgaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRTdWJJdGVtSWQoc3ViSXRlbSwgc3ViSXRlbUluZGV4LCBnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KSlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cIiEhc3ViSXRlbS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHItYmFzZSBwbC1sZyBweS1zbSBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1wcmltYXJ5LWJhc2UgaG92ZXI6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogc3ViSXRlbSwgaHRtbDogc3ViSXRlbS5odG1sLCB0ZXh0OiBzdWJJdGVtLnRleHR9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSAjcG9wdXBNZW51SXRlbSAqbmdTd2l0Y2hDYXNlPVwiJ3NlcGFyYXRvcidcIiByb2xlPVwic2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRTdWJJdGVtSWQoc3ViSXRlbSwgc3ViSXRlbUluZGV4LCBnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KSlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteS1zbSBib3JkZXItYiBib3JkZXItbmV1dHJhbC1iYXNlXCI+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdWw+XG4iXX0=