desy-angular 7.0.1 → 8.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 (539) hide show
  1. package/README.md +2 -2
  2. package/esm2022/desy-angular.mjs +2 -0
  3. package/{esm2020 → esm2022}/lib/desy-angular.module.mjs +37 -37
  4. package/esm2022/lib/desy-buttons/components/button/button.component.mjs +115 -0
  5. package/esm2022/lib/desy-buttons/components/button-loader/button-loader.component.mjs +63 -0
  6. package/esm2022/lib/desy-buttons/components/dropdown/dropdown.component.mjs +127 -0
  7. package/esm2022/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +39 -0
  8. package/{esm2020 → esm2022}/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.mjs +4 -4
  9. package/esm2022/lib/desy-buttons/components/listbox/listbox.component.mjs +334 -0
  10. package/esm2022/lib/desy-buttons/components/pill/pill.component.mjs +80 -0
  11. package/{esm2020 → esm2022}/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.mjs +4 -4
  12. package/{esm2020 → esm2022}/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.mjs +4 -4
  13. package/esm2022/lib/desy-buttons/components/toggle/toggle.component.mjs +61 -0
  14. package/esm2022/lib/desy-buttons/desy-buttons.module.mjs +81 -0
  15. package/{esm2020 → esm2022}/lib/desy-commons/components/content/content.component.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/desy-commons/components/description/description.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/desy-commons/components/divider/divider.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/desy-commons/components/icon/icon.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/lib/desy-commons/components/title/title.component.mjs +4 -4
  20. package/esm2022/lib/desy-commons/desy-commons.module.mjs +52 -0
  21. package/{esm2020 → esm2022}/lib/desy-forms/components/character-count/character-count.component.mjs +10 -10
  22. package/esm2022/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +222 -0
  23. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes-parent.component.mjs +15 -0
  24. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +268 -0
  25. package/esm2022/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.mjs +55 -0
  26. package/esm2022/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.mjs +19 -0
  27. package/{esm2020 → esm2022}/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.mjs +4 -4
  28. package/esm2022/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.mjs +55 -0
  29. package/esm2022/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.mjs +51 -0
  30. package/esm2022/lib/desy-forms/components/date-input/date-input.component.mjs +293 -0
  31. package/esm2022/lib/desy-forms/components/error-message/error-message.component.mjs +31 -0
  32. package/{esm2020 → esm2022}/lib/desy-forms/components/fieldset/fieldset.component.mjs +10 -8
  33. package/{esm2020 → esm2022}/lib/desy-forms/components/fieldset/legend/legend.component.mjs +4 -4
  34. package/esm2022/lib/desy-forms/components/file-upload/file-upload.component.mjs +67 -0
  35. package/esm2022/lib/desy-forms/components/form-field/form-field.component.mjs +120 -0
  36. package/esm2022/lib/desy-forms/components/hint/hint.component.mjs +29 -0
  37. package/esm2022/lib/desy-forms/components/input/input.component.mjs +98 -0
  38. package/esm2022/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.mjs +20 -0
  39. package/esm2022/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.mjs +59 -0
  40. package/{esm2020 → esm2022}/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.mjs +4 -4
  41. package/esm2022/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.mjs +51 -0
  42. package/esm2022/lib/desy-forms/components/input-group/input-group.component.mjs +228 -0
  43. package/esm2022/lib/desy-forms/components/label/label.component.mjs +38 -0
  44. package/esm2022/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +170 -0
  45. package/esm2022/lib/desy-forms/components/radios/radios-parent.component.mjs +15 -0
  46. package/esm2022/lib/desy-forms/components/radios/radios.component.mjs +281 -0
  47. package/esm2022/lib/desy-forms/components/search-bar/search-bar.component.mjs +60 -0
  48. package/{esm2020 → esm2022}/lib/desy-forms/components/select/option/option.component.mjs +4 -4
  49. package/esm2022/lib/desy-forms/components/select/option-group/option-group.component.mjs +18 -0
  50. package/{esm2020 → esm2022}/lib/desy-forms/components/select/select-item/select-item.component.mjs +4 -4
  51. package/esm2022/lib/desy-forms/components/select/select.component.mjs +92 -0
  52. package/{esm2020 → esm2022}/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.mjs +4 -4
  53. package/{esm2020 → esm2022}/lib/desy-forms/components/textarea/textarea.component.mjs +12 -13
  54. package/esm2022/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +173 -0
  55. package/esm2022/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +377 -0
  56. package/esm2022/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.mjs +25 -0
  57. package/{esm2020 → esm2022}/lib/desy-forms/components/tree/tree-sub/tree-sub.component.mjs +4 -4
  58. package/esm2022/lib/desy-forms/components/tree/tree.component.mjs +356 -0
  59. package/esm2022/lib/desy-forms/desy-forms.module.mjs +207 -0
  60. package/esm2022/lib/desy-forms/directives/condition.directive.mjs +34 -0
  61. package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-date-input-data.mjs +1 -1
  62. package/{esm2020 → esm2022}/lib/desy-forms/interfaces/select-item-data.mjs +1 -1
  63. package/esm2022/lib/desy-modals/components/dialog/dialog.component.mjs +150 -0
  64. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.mjs +25 -0
  65. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.mjs +23 -0
  66. package/esm2022/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.mjs +23 -0
  67. package/esm2022/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.mjs +23 -0
  68. package/esm2022/lib/desy-modals/components/modal/modal.component.mjs +182 -0
  69. package/esm2022/lib/desy-modals/desy-modals.module.mjs +61 -0
  70. package/{esm2020 → esm2022}/lib/desy-modals/interfaces/dialog-options.mjs +1 -1
  71. package/esm2022/lib/desy-modals/interfaces/index.mjs +7 -0
  72. package/esm2022/lib/desy-modals/services/dialog.service.mjs +114 -0
  73. package/{esm2020 → esm2022}/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.mjs +4 -4
  74. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +48 -0
  75. package/{esm2020 → esm2022}/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.mjs +4 -4
  76. package/esm2022/lib/desy-nav/components/error-summary/error-summary.component.mjs +64 -0
  77. package/{esm2020 → esm2022}/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.mjs +4 -4
  78. package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta.component.mjs +31 -0
  79. package/{esm2020 → esm2022}/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.mjs +4 -4
  80. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +19 -0
  81. package/esm2022/lib/desy-nav/components/footer/footer.component.mjs +74 -0
  82. package/{esm2020 → esm2022}/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.mjs +4 -4
  83. package/esm2022/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.mjs +46 -0
  84. package/{esm2020 → esm2022}/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.mjs +4 -4
  85. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +36 -0
  86. package/{esm2020 → esm2022}/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.mjs +4 -4
  87. package/{esm2020 → esm2022}/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.mjs +4 -4
  88. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.mjs +93 -0
  89. package/esm2022/lib/desy-nav/components/header/header-subnav/header-subnav.component.mjs +41 -0
  90. package/esm2022/lib/desy-nav/components/header/header.component.mjs +107 -0
  91. package/esm2022/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.mjs +40 -0
  92. package/esm2022/lib/desy-nav/components/links-list/links-list-item-sub/links-list-item-sub.component.mjs +14 -0
  93. package/esm2022/lib/desy-nav/components/links-list/links-list.component.mjs +42 -0
  94. package/{esm2020 → esm2022}/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.mjs +4 -4
  95. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +78 -0
  96. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +49 -0
  97. package/{esm2020 → esm2022}/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.mjs +4 -4
  98. package/esm2022/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +602 -0
  99. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +46 -0
  100. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.mjs +18 -0
  101. package/{esm2020 → esm2022}/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.mjs +4 -4
  102. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +113 -0
  103. package/esm2022/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +51 -0
  104. package/{esm2020 → esm2022}/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.mjs +4 -4
  105. package/esm2022/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.mjs +36 -0
  106. package/{esm2020 → esm2022}/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.mjs +4 -4
  107. package/esm2022/lib/desy-nav/components/menubar/directives/menubaritem.directive.mjs +45 -0
  108. package/esm2022/lib/desy-nav/components/menubar/menubar.component.mjs +713 -0
  109. package/{esm2020 → esm2022}/lib/desy-nav/components/nav/nav-item/nav-item.component.mjs +4 -4
  110. package/esm2022/lib/desy-nav/components/nav/nav.component.mjs +115 -0
  111. package/{esm2020 → esm2022}/lib/desy-nav/components/notification/notification-item/notification-item.component.mjs +4 -4
  112. package/esm2022/lib/desy-nav/components/notification/notification.component.mjs +143 -0
  113. package/esm2022/lib/desy-nav/components/skip-link/skip-link.component.mjs +43 -0
  114. package/esm2022/lib/desy-nav/desy-nav.module.mjs +240 -0
  115. package/esm2022/lib/desy-nav/interfaces/header-skiplink-data.mjs +2 -0
  116. package/esm2022/lib/desy-pagination/components/pagination/pagination.component.mjs +191 -0
  117. package/{esm2020 → esm2022}/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.mjs +4 -4
  118. package/{esm2020 → esm2022}/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.mjs +4 -4
  119. package/{esm2020 → esm2022}/lib/desy-pagination/desy-pagination.module.mjs +15 -15
  120. package/{esm2020 → esm2022}/lib/desy-tables/components/table/components/table-caption.component.mjs +4 -4
  121. package/{esm2020 → esm2022}/lib/desy-tables/components/table/components/table-cell.component.mjs +4 -4
  122. package/esm2022/lib/desy-tables/components/table/components/table-header.component.mjs +18 -0
  123. package/esm2022/lib/desy-tables/components/table/components/table-row.component.mjs +18 -0
  124. package/esm2022/lib/desy-tables/components/table/table.component.mjs +79 -0
  125. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.mjs +50 -0
  126. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.mjs +18 -0
  127. package/{esm2020 → esm2022}/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.mjs +4 -4
  128. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.mjs +27 -0
  129. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.mjs +28 -0
  130. package/esm2022/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +286 -0
  131. package/{esm2020 → esm2022}/lib/desy-tables/desy-tables.module.mjs +38 -38
  132. package/esm2022/lib/desy-tables/directives/cell.directive.mjs +25 -0
  133. package/esm2022/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +81 -0
  134. package/esm2022/lib/desy-tables/directives/row.directive.mjs +22 -0
  135. package/{esm2020 → esm2022}/lib/desy-views/components/accordion/accordion-header/accordion-header.component.mjs +4 -4
  136. package/esm2022/lib/desy-views/components/accordion/accordion-item/accordion-item.component.mjs +61 -0
  137. package/esm2022/lib/desy-views/components/accordion/accordion.component.mjs +199 -0
  138. package/esm2022/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.mjs +41 -0
  139. package/esm2022/lib/desy-views/components/accordion-history/accordion-history.component.mjs +19 -0
  140. package/{esm2020 → esm2022}/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.mjs +4 -4
  141. package/{esm2020 → esm2022}/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.mjs +4 -4
  142. package/esm2022/lib/desy-views/components/alert/alert.component.mjs +81 -0
  143. package/esm2022/lib/desy-views/components/collapsible/collapsible.component.mjs +81 -0
  144. package/{esm2020 → esm2022}/lib/desy-views/components/description-list/definition/definition.component.mjs +4 -4
  145. package/esm2022/lib/desy-views/components/description-list/description-item/description-item.component.mjs +36 -0
  146. package/esm2022/lib/desy-views/components/description-list/description-list.component.mjs +28 -0
  147. package/{esm2020 → esm2022}/lib/desy-views/components/description-list/term/term.component.mjs +4 -4
  148. package/{esm2020 → esm2022}/lib/desy-views/components/details/details.component.mjs +4 -4
  149. package/{esm2020 → esm2022}/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.mjs +4 -4
  150. package/{esm2020 → esm2022}/lib/desy-views/components/item/item-content-right/item-content-right.component.mjs +4 -4
  151. package/{esm2020 → esm2022}/lib/desy-views/components/item/item-item/item-item.component.mjs +4 -4
  152. package/esm2022/lib/desy-views/components/item/item.component.mjs +121 -0
  153. package/{esm2020 → esm2022}/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.mjs +4 -4
  154. package/esm2022/lib/desy-views/components/media-object/media-object.component.mjs +117 -0
  155. package/{esm2020 → esm2022}/lib/desy-views/components/spinner/spinner.component.mjs +4 -4
  156. package/esm2022/lib/desy-views/components/status/status.component.mjs +107 -0
  157. package/esm2022/lib/desy-views/components/status-item/status-item.component.mjs +148 -0
  158. package/{esm2020 → esm2022}/lib/desy-views/components/tabs/panel/panel.component.mjs +4 -4
  159. package/esm2022/lib/desy-views/components/tabs/tab-item/tab-item.component.mjs +39 -0
  160. package/esm2022/lib/desy-views/components/tabs/tabs.component.mjs +200 -0
  161. package/{esm2020 → esm2022}/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.mjs +4 -4
  162. package/esm2022/lib/desy-views/components/tooltip/tooltip.component.mjs +206 -0
  163. package/{esm2020 → esm2022}/lib/desy-views/desy-views.module.mjs +67 -67
  164. package/esm2022/lib/desy-views/services/alert.service.mjs +88 -0
  165. package/esm2022/lib/shared/components/accessibility/accessibility.component.mjs +42 -0
  166. package/{esm2020 → esm2022}/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.mjs +4 -4
  167. package/{esm2020 → esm2022}/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.mjs +4 -4
  168. package/esm2022/lib/shared/components/content-base/content-base.component.mjs +21 -0
  169. package/{esm2020 → esm2022}/lib/shared/components/text-or-html-required/text-or-html-required.component.mjs +4 -4
  170. package/esm2022/lib/shared/decorators/desy-content-child.decorator.mjs +30 -0
  171. package/esm2022/lib/shared/decorators/desy-on-input-change.decorator.mjs +15 -0
  172. package/esm2022/lib/shared/directives/attribute-change.directive.mjs +50 -0
  173. package/esm2022/lib/shared/directives/click-outside.directive.mjs +40 -0
  174. package/esm2022/lib/shared/directives/content-change.directive.mjs +41 -0
  175. package/esm2022/lib/shared/directives/custom-inner-content.directive.mjs +44 -0
  176. package/esm2022/lib/shared/directives/inner-content.directive.mjs +37 -0
  177. package/esm2022/lib/shared/pipes/external-href.pipe.mjs +28 -0
  178. package/esm2022/lib/shared/pipes/inner-html.pipe.mjs +21 -0
  179. package/{esm2020 → esm2022}/lib/shared/pipes/make-html-list.pipe.mjs +4 -4
  180. package/esm2022/lib/shared/shared.module.mjs +83 -0
  181. package/esm2022/lib/shared/utils/search-utils.mjs +66 -0
  182. package/esm2022/lib/shared/utils/string-utils.mjs +11 -0
  183. package/esm2022/public-api.mjs +197 -0
  184. package/{fesm2020 → fesm2022}/desy-angular.mjs +1964 -2068
  185. package/fesm2022/desy-angular.mjs.map +1 -0
  186. package/index.d.ts +0 -3
  187. package/lib/desy-buttons/components/button/button.component.d.ts +1 -1
  188. package/lib/desy-buttons/components/button-loader/button-loader.component.d.ts +1 -1
  189. package/lib/desy-buttons/components/dropdown/dropdown.component.d.ts +1 -1
  190. package/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.d.ts +3 -1
  191. package/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.d.ts +1 -1
  192. package/lib/desy-buttons/components/listbox/listbox.component.d.ts +16 -5
  193. package/lib/desy-buttons/components/pill/pill.component.d.ts +1 -1
  194. package/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.d.ts +1 -1
  195. package/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.d.ts +1 -1
  196. package/lib/desy-buttons/components/toggle/toggle.component.d.ts +1 -1
  197. package/lib/desy-commons/components/content/content.component.d.ts +1 -1
  198. package/lib/desy-commons/components/description/description.component.d.ts +1 -1
  199. package/lib/desy-commons/components/divider/divider.component.d.ts +1 -1
  200. package/lib/desy-commons/components/icon/icon.component.d.ts +1 -1
  201. package/lib/desy-commons/components/title/title.component.d.ts +1 -1
  202. package/lib/desy-forms/components/character-count/character-count.component.d.ts +1 -1
  203. package/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.d.ts +6 -4
  204. package/lib/desy-forms/components/checkboxes/checkboxes-parent.component.d.ts +13 -0
  205. package/lib/desy-forms/components/checkboxes/checkboxes.component.d.ts +13 -31
  206. package/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.d.ts +2 -1
  207. package/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.d.ts +1 -1
  208. package/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.d.ts +2 -1
  209. package/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.d.ts +2 -1
  210. package/lib/desy-forms/components/date-input/date-input.component.d.ts +5 -8
  211. package/lib/desy-forms/components/error-message/error-message.component.d.ts +1 -1
  212. package/lib/desy-forms/components/fieldset/fieldset.component.d.ts +1 -8
  213. package/lib/desy-forms/components/fieldset/legend/legend.component.d.ts +1 -1
  214. package/lib/desy-forms/components/file-upload/file-upload.component.d.ts +1 -6
  215. package/lib/desy-forms/components/form-field/form-field.component.d.ts +10 -10
  216. package/lib/desy-forms/components/hint/hint.component.d.ts +1 -1
  217. package/lib/desy-forms/components/input/input.component.d.ts +1 -1
  218. package/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.d.ts +2 -1
  219. package/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.d.ts +1 -1
  220. package/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.d.ts +2 -1
  221. package/lib/desy-forms/components/input-group/input-group.component.d.ts +3 -8
  222. package/lib/desy-forms/components/label/label.component.d.ts +1 -1
  223. package/lib/desy-forms/components/radios/radio-item/radio-item.component.d.ts +6 -5
  224. package/lib/desy-forms/components/radios/radios-parent.component.d.ts +13 -0
  225. package/lib/desy-forms/components/radios/radios.component.d.ts +14 -31
  226. package/lib/desy-forms/components/search-bar/search-bar.component.d.ts +3 -5
  227. package/lib/desy-forms/components/select/option/option.component.d.ts +2 -2
  228. package/lib/desy-forms/components/select/option-group/option-group.component.d.ts +1 -1
  229. package/lib/desy-forms/components/select/select-item/select-item.component.d.ts +1 -1
  230. package/lib/desy-forms/components/select/select.component.d.ts +1 -1
  231. package/lib/desy-forms/components/textarea/textarea.component.d.ts +1 -1
  232. package/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.d.ts +1 -1
  233. package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +2 -5
  234. package/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.d.ts +6 -2
  235. package/lib/desy-forms/components/tree/tree-sub/tree-sub.component.d.ts +1 -1
  236. package/lib/desy-forms/components/tree/tree.component.d.ts +2 -59
  237. package/lib/desy-forms/directives/condition.directive.d.ts +1 -6
  238. package/lib/desy-forms/interfaces/item-date-input-data.d.ts +1 -0
  239. package/lib/desy-forms/interfaces/select-item-data.d.ts +1 -1
  240. package/lib/desy-modals/components/dialog/dialog.component.d.ts +2 -1
  241. package/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.d.ts +1 -1
  242. package/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.d.ts +1 -1
  243. package/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.d.ts +1 -1
  244. package/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.d.ts +1 -1
  245. package/lib/desy-modals/components/modal/modal.component.d.ts +1 -1
  246. package/lib/desy-modals/interfaces/dialog-options.d.ts +1 -0
  247. package/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.d.ts +1 -1
  248. package/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.d.ts +1 -1
  249. package/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.d.ts +1 -1
  250. package/lib/desy-nav/components/error-summary/error-summary.component.d.ts +1 -1
  251. package/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.d.ts +1 -1
  252. package/lib/desy-nav/components/footer/footer-meta/footer-meta.component.d.ts +1 -1
  253. package/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.d.ts +1 -1
  254. package/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.d.ts +1 -1
  255. package/lib/desy-nav/components/footer/footer.component.d.ts +1 -1
  256. package/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.d.ts +1 -1
  257. package/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.d.ts +1 -1
  258. package/lib/desy-nav/components/header/header-navigation/header-navigation.component.d.ts +1 -1
  259. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.d.ts +1 -8
  260. package/lib/desy-nav/components/header/header-subnav/header-subnav.component.d.ts +1 -1
  261. package/lib/desy-nav/components/header/header.component.d.ts +3 -2
  262. package/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.d.ts +20 -0
  263. package/lib/desy-nav/components/links-list/links-list-item-sub/links-list-item-sub.component.d.ts +7 -0
  264. package/lib/desy-nav/components/links-list/links-list.component.d.ts +13 -0
  265. package/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.d.ts +1 -1
  266. package/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.d.ts +1 -1
  267. package/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.d.ts +1 -1
  268. package/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.d.ts +1 -1
  269. package/lib/desy-nav/components/menu-navigation/menu-navigation.component.d.ts +1 -1
  270. package/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.d.ts +1 -1
  271. package/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.d.ts +1 -1
  272. package/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.d.ts +1 -1
  273. package/lib/desy-nav/components/menu-vertical/menu-vertical.component.d.ts +1 -1
  274. package/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.d.ts +1 -1
  275. package/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.d.ts +1 -1
  276. package/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.d.ts +1 -1
  277. package/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.d.ts +1 -1
  278. package/lib/desy-nav/components/menubar/menubar.component.d.ts +1 -8
  279. package/lib/desy-nav/components/nav/nav-item/nav-item.component.d.ts +1 -1
  280. package/lib/desy-nav/components/nav/nav.component.d.ts +1 -1
  281. package/lib/desy-nav/components/notification/notification-item/notification-item.component.d.ts +1 -1
  282. package/lib/desy-nav/components/notification/notification.component.d.ts +1 -1
  283. package/lib/desy-nav/components/skip-link/skip-link.component.d.ts +2 -1
  284. package/lib/desy-nav/desy-nav.module.d.ts +29 -26
  285. package/lib/desy-nav/interfaces/header-skiplink-data.d.ts +7 -0
  286. package/lib/desy-pagination/components/pagination/pagination.component.d.ts +12 -7
  287. package/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.d.ts +1 -1
  288. package/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.d.ts +1 -1
  289. package/lib/desy-tables/components/table/components/table-caption.component.d.ts +1 -1
  290. package/lib/desy-tables/components/table/components/table-cell.component.d.ts +1 -1
  291. package/lib/desy-tables/components/table/table.component.d.ts +1 -1
  292. package/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.d.ts +1 -1
  293. package/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.d.ts +1 -1
  294. package/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.d.ts +1 -1
  295. package/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.d.ts +1 -1
  296. package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +1 -56
  297. package/lib/desy-tables/directives/cell.directive.d.ts +1 -4
  298. package/lib/desy-tables/directives/row.directive.d.ts +1 -8
  299. package/lib/desy-views/components/accordion/accordion-header/accordion-header.component.d.ts +1 -1
  300. package/lib/desy-views/components/accordion/accordion-item/accordion-item.component.d.ts +1 -1
  301. package/lib/desy-views/components/accordion/accordion.component.d.ts +1 -1
  302. package/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.d.ts +1 -1
  303. package/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.d.ts +1 -1
  304. package/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.d.ts +1 -1
  305. package/lib/desy-views/components/alert/alert.component.d.ts +1 -1
  306. package/lib/desy-views/components/collapsible/collapsible.component.d.ts +1 -1
  307. package/lib/desy-views/components/description-list/definition/definition.component.d.ts +1 -1
  308. package/lib/desy-views/components/description-list/description-item/description-item.component.d.ts +1 -1
  309. package/lib/desy-views/components/description-list/description-list.component.d.ts +1 -1
  310. package/lib/desy-views/components/description-list/term/term.component.d.ts +1 -1
  311. package/lib/desy-views/components/details/details.component.d.ts +1 -1
  312. package/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.d.ts +1 -1
  313. package/lib/desy-views/components/item/item.component.d.ts +2 -1
  314. package/lib/desy-views/components/media-object/media-object.component.d.ts +1 -1
  315. package/lib/desy-views/components/spinner/spinner.component.d.ts +1 -1
  316. package/lib/desy-views/components/status/status.component.d.ts +3 -1
  317. package/lib/desy-views/components/status-item/status-item.component.d.ts +1 -1
  318. package/lib/desy-views/components/tabs/panel/panel.component.d.ts +1 -1
  319. package/lib/desy-views/components/tabs/tab-item/tab-item.component.d.ts +1 -1
  320. package/lib/desy-views/components/tabs/tabs.component.d.ts +1 -1
  321. package/lib/desy-views/components/tooltip/tooltip.component.d.ts +1 -1
  322. package/lib/shared/components/accessibility/accessibility.component.d.ts +1 -4
  323. package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +1 -9
  324. package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +1 -7
  325. package/lib/shared/components/content-base/content-base.component.d.ts +0 -3
  326. package/lib/shared/components/text-or-html-required/text-or-html-required.component.d.ts +1 -5
  327. package/lib/shared/decorators/desy-content-child.decorator.d.ts +0 -11
  328. package/lib/shared/decorators/desy-on-input-change.decorator.d.ts +0 -4
  329. package/lib/shared/directives/attribute-change.directive.d.ts +2 -1
  330. package/lib/shared/directives/click-outside.directive.d.ts +1 -1
  331. package/lib/shared/directives/content-change.directive.d.ts +1 -5
  332. package/lib/shared/directives/custom-inner-content.directive.d.ts +1 -7
  333. package/lib/shared/directives/inner-content.directive.d.ts +1 -1
  334. package/lib/shared/pipes/external-href.pipe.d.ts +0 -4
  335. package/lib/shared/utils/search-utils.d.ts +0 -10
  336. package/lib/shared/utils/string-utils.d.ts +0 -7
  337. package/package.json +13 -19
  338. package/public-api.d.ts +4 -0
  339. package/esm2020/desy-angular.mjs +0 -5
  340. package/esm2020/lib/desy-buttons/components/button/button.component.mjs +0 -115
  341. package/esm2020/lib/desy-buttons/components/button-loader/button-loader.component.mjs +0 -63
  342. package/esm2020/lib/desy-buttons/components/dropdown/dropdown.component.mjs +0 -126
  343. package/esm2020/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +0 -32
  344. package/esm2020/lib/desy-buttons/components/listbox/listbox.component.mjs +0 -291
  345. package/esm2020/lib/desy-buttons/components/pill/pill.component.mjs +0 -80
  346. package/esm2020/lib/desy-buttons/components/toggle/toggle.component.mjs +0 -59
  347. package/esm2020/lib/desy-buttons/desy-buttons.module.mjs +0 -82
  348. package/esm2020/lib/desy-commons/desy-commons.module.mjs +0 -53
  349. package/esm2020/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +0 -240
  350. package/esm2020/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +0 -264
  351. package/esm2020/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.mjs +0 -52
  352. package/esm2020/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.mjs +0 -19
  353. package/esm2020/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.mjs +0 -52
  354. package/esm2020/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.mjs +0 -48
  355. package/esm2020/lib/desy-forms/components/date-input/date-input.component.mjs +0 -266
  356. package/esm2020/lib/desy-forms/components/error-message/error-message.component.mjs +0 -31
  357. package/esm2020/lib/desy-forms/components/file-upload/file-upload.component.mjs +0 -72
  358. package/esm2020/lib/desy-forms/components/form-field/form-field.component.mjs +0 -124
  359. package/esm2020/lib/desy-forms/components/hint/hint.component.mjs +0 -29
  360. package/esm2020/lib/desy-forms/components/input/input.component.mjs +0 -99
  361. package/esm2020/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.mjs +0 -20
  362. package/esm2020/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.mjs +0 -53
  363. package/esm2020/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.mjs +0 -45
  364. package/esm2020/lib/desy-forms/components/input-group/input-group.component.mjs +0 -223
  365. package/esm2020/lib/desy-forms/components/label/label.component.mjs +0 -38
  366. package/esm2020/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +0 -185
  367. package/esm2020/lib/desy-forms/components/radios/radios.component.mjs +0 -270
  368. package/esm2020/lib/desy-forms/components/search-bar/search-bar.component.mjs +0 -66
  369. package/esm2020/lib/desy-forms/components/select/option-group/option-group.component.mjs +0 -18
  370. package/esm2020/lib/desy-forms/components/select/select.component.mjs +0 -93
  371. package/esm2020/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +0 -167
  372. package/esm2020/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +0 -397
  373. package/esm2020/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.mjs +0 -25
  374. package/esm2020/lib/desy-forms/components/tree/tree.component.mjs +0 -425
  375. package/esm2020/lib/desy-forms/desy-forms.module.mjs +0 -209
  376. package/esm2020/lib/desy-forms/directives/condition.directive.mjs +0 -34
  377. package/esm2020/lib/desy-forms/models/checkbox-service-item.component.mjs +0 -9
  378. package/esm2020/lib/desy-forms/models/radio-service-item.component.mjs +0 -9
  379. package/esm2020/lib/desy-forms/services/checkbox.service.mjs +0 -61
  380. package/esm2020/lib/desy-forms/services/radio.service.mjs +0 -53
  381. package/esm2020/lib/desy-modals/components/dialog/dialog.component.mjs +0 -130
  382. package/esm2020/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.mjs +0 -25
  383. package/esm2020/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.mjs +0 -23
  384. package/esm2020/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.mjs +0 -23
  385. package/esm2020/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.mjs +0 -23
  386. package/esm2020/lib/desy-modals/components/modal/modal.component.mjs +0 -178
  387. package/esm2020/lib/desy-modals/desy-modals.module.mjs +0 -62
  388. package/esm2020/lib/desy-modals/interfaces/index.mjs +0 -8
  389. package/esm2020/lib/desy-modals/services/dialog.service.mjs +0 -114
  390. package/esm2020/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +0 -47
  391. package/esm2020/lib/desy-nav/components/error-summary/error-summary.component.mjs +0 -62
  392. package/esm2020/lib/desy-nav/components/footer/footer-meta/footer-meta.component.mjs +0 -30
  393. package/esm2020/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +0 -19
  394. package/esm2020/lib/desy-nav/components/footer/footer.component.mjs +0 -71
  395. package/esm2020/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.mjs +0 -45
  396. package/esm2020/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +0 -36
  397. package/esm2020/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.mjs +0 -95
  398. package/esm2020/lib/desy-nav/components/header/header-subnav/header-subnav.component.mjs +0 -41
  399. package/esm2020/lib/desy-nav/components/header/header.component.mjs +0 -103
  400. package/esm2020/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +0 -79
  401. package/esm2020/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +0 -49
  402. package/esm2020/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +0 -616
  403. package/esm2020/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +0 -45
  404. package/esm2020/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.mjs +0 -18
  405. package/esm2020/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +0 -113
  406. package/esm2020/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +0 -51
  407. package/esm2020/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.mjs +0 -36
  408. package/esm2020/lib/desy-nav/components/menubar/directives/menubaritem.directive.mjs +0 -45
  409. package/esm2020/lib/desy-nav/components/menubar/menubar.component.mjs +0 -727
  410. package/esm2020/lib/desy-nav/components/nav/nav.component.mjs +0 -116
  411. package/esm2020/lib/desy-nav/components/notification/notification.component.mjs +0 -141
  412. package/esm2020/lib/desy-nav/components/skip-link/skip-link.component.mjs +0 -37
  413. package/esm2020/lib/desy-nav/desy-nav.module.mjs +0 -221
  414. package/esm2020/lib/desy-pagination/components/pagination/pagination.component.mjs +0 -167
  415. package/esm2020/lib/desy-tables/components/table/components/table-header.component.mjs +0 -18
  416. package/esm2020/lib/desy-tables/components/table/components/table-row.component.mjs +0 -18
  417. package/esm2020/lib/desy-tables/components/table/table.component.mjs +0 -78
  418. package/esm2020/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.mjs +0 -47
  419. package/esm2020/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.mjs +0 -18
  420. package/esm2020/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.mjs +0 -27
  421. package/esm2020/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.mjs +0 -28
  422. package/esm2020/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +0 -342
  423. package/esm2020/lib/desy-tables/directives/cell.directive.mjs +0 -28
  424. package/esm2020/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +0 -81
  425. package/esm2020/lib/desy-tables/directives/row.directive.mjs +0 -29
  426. package/esm2020/lib/desy-views/components/accordion/accordion-item/accordion-item.component.mjs +0 -57
  427. package/esm2020/lib/desy-views/components/accordion/accordion.component.mjs +0 -198
  428. package/esm2020/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.mjs +0 -39
  429. package/esm2020/lib/desy-views/components/accordion-history/accordion-history.component.mjs +0 -19
  430. package/esm2020/lib/desy-views/components/alert/alert.component.mjs +0 -81
  431. package/esm2020/lib/desy-views/components/collapsible/collapsible.component.mjs +0 -81
  432. package/esm2020/lib/desy-views/components/description-list/description-item/description-item.component.mjs +0 -34
  433. package/esm2020/lib/desy-views/components/description-list/description-list.component.mjs +0 -28
  434. package/esm2020/lib/desy-views/components/item/item.component.mjs +0 -121
  435. package/esm2020/lib/desy-views/components/media-object/media-object.component.mjs +0 -115
  436. package/esm2020/lib/desy-views/components/status/status.component.mjs +0 -97
  437. package/esm2020/lib/desy-views/components/status-item/status-item.component.mjs +0 -143
  438. package/esm2020/lib/desy-views/components/tabs/tab-item/tab-item.component.mjs +0 -37
  439. package/esm2020/lib/desy-views/components/tabs/tabs.component.mjs +0 -199
  440. package/esm2020/lib/desy-views/components/tooltip/tooltip.component.mjs +0 -202
  441. package/esm2020/lib/desy-views/services/alert.service.mjs +0 -88
  442. package/esm2020/lib/shared/components/accessibility/accessibility.component.mjs +0 -45
  443. package/esm2020/lib/shared/components/content-base/content-base.component.mjs +0 -24
  444. package/esm2020/lib/shared/decorators/desy-content-child.decorator.mjs +0 -41
  445. package/esm2020/lib/shared/decorators/desy-on-input-change.decorator.mjs +0 -19
  446. package/esm2020/lib/shared/directives/attribute-change.directive.mjs +0 -45
  447. package/esm2020/lib/shared/directives/click-outside.directive.mjs +0 -40
  448. package/esm2020/lib/shared/directives/content-change.directive.mjs +0 -45
  449. package/esm2020/lib/shared/directives/custom-inner-content.directive.mjs +0 -60
  450. package/esm2020/lib/shared/directives/inner-content.directive.mjs +0 -37
  451. package/esm2020/lib/shared/pipes/external-href.pipe.mjs +0 -32
  452. package/esm2020/lib/shared/pipes/inner-html.pipe.mjs +0 -20
  453. package/esm2020/lib/shared/shared.module.mjs +0 -99
  454. package/esm2020/lib/shared/utils/search-utils.mjs +0 -78
  455. package/esm2020/lib/shared/utils/string-utils.mjs +0 -18
  456. package/esm2020/public-api.mjs +0 -221
  457. package/fesm2015/desy-angular.mjs +0 -11752
  458. package/fesm2015/desy-angular.mjs.map +0 -1
  459. package/fesm2020/desy-angular.mjs.map +0 -1
  460. package/lib/desy-forms/models/checkbox-service-item.component.d.ts +0 -13
  461. package/lib/desy-forms/models/radio-service-item.component.d.ts +0 -12
  462. package/lib/desy-forms/services/checkbox.service.d.ts +0 -14
  463. package/lib/desy-forms/services/radio.service.d.ts +0 -13
  464. /package/{esm2020 → esm2022}/lib/desy-buttons/interfaces/listbox-item-data.mjs +0 -0
  465. /package/{esm2020 → esm2022}/lib/desy-buttons/interfaces/listbox-label-data.mjs +0 -0
  466. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/content-data.mjs +0 -0
  467. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/description-data.mjs +0 -0
  468. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/divider-data.mjs +0 -0
  469. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/icon-data.mjs +0 -0
  470. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/index.mjs +0 -0
  471. /package/{esm2020 → esm2022}/lib/desy-commons/interfaces/title-data.mjs +0 -0
  472. /package/{esm2020 → esm2022}/lib/desy-forms/components/tree/interfaces/itree-item.mjs +0 -0
  473. /package/{esm2020 → esm2022}/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.mjs +0 -0
  474. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/accesibility-data.mjs +0 -0
  475. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/error-message-data.mjs +0 -0
  476. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/fieldset-data.mjs +0 -0
  477. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/hint-data.mjs +0 -0
  478. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/index.mjs +0 -0
  479. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-checkbox-data.mjs +0 -0
  480. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-divider-date-input-data.mjs +0 -0
  481. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-divider-input-group-data.mjs +0 -0
  482. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-input-group-data.mjs +0 -0
  483. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-radio-data.mjs +0 -0
  484. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/item-radio-with-template-data.mjs +0 -0
  485. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/label-data.mjs +0 -0
  486. /package/{esm2020 → esm2022}/lib/desy-forms/interfaces/legend-data.mjs +0 -0
  487. /package/{esm2020 → esm2022}/lib/desy-modals/interfaces/modal-button-data.mjs +0 -0
  488. /package/{esm2020 → esm2022}/lib/desy-modals/interfaces/modal-data.mjs +0 -0
  489. /package/{esm2020 → esm2022}/lib/desy-modals/interfaces/modal-icon-data.mjs +0 -0
  490. /package/{esm2020 → esm2022}/lib/desy-modals/interfaces/modal-options.mjs +0 -0
  491. /package/{esm2020 → esm2022}/lib/desy-modals/interfaces/open-dialog-result.mjs +0 -0
  492. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/breadcrumbs.data.mjs +0 -0
  493. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/error-summary-data.mjs +0 -0
  494. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/footer-data.mjs +0 -0
  495. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/header-dropdown-data.mjs +0 -0
  496. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/header-navigation-data.mjs +0 -0
  497. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/header-navigation-item-data.mjs +0 -0
  498. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/header-offcanvas-data.mjs +0 -0
  499. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/header-subnav-data.mjs +0 -0
  500. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/index.mjs +0 -0
  501. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-horizontal-item-data.mjs +0 -0
  502. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-horizontal-item-event-data.mjs +0 -0
  503. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.mjs +0 -0
  504. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-navigation-item-sub-item.mjs +0 -0
  505. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-navigation.mjs +0 -0
  506. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-vertical-items-data.mjs +0 -0
  507. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-vertical-sub-data.mjs +0 -0
  508. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menu-vertical-sub-items-data.mjs +0 -0
  509. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.mjs +0 -0
  510. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menubar-item-sub-item.mjs +0 -0
  511. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menubar-item-sub.mjs +0 -0
  512. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/menubar-item.mjs +0 -0
  513. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/nav-item-event.data.mjs +0 -0
  514. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/nav-item.data.mjs +0 -0
  515. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/notification-items-data.mjs +0 -0
  516. /package/{esm2020 → esm2022}/lib/desy-nav/interfaces/notification-options.mjs +0 -0
  517. /package/{esm2020 → esm2022}/lib/desy-pagination/interfaces/index.mjs +0 -0
  518. /package/{esm2020 → esm2022}/lib/desy-pagination/interfaces/pagination-item.data.mjs +0 -0
  519. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/cell-data.mjs +0 -0
  520. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/head-cell-data.mjs +0 -0
  521. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/index.mjs +0 -0
  522. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/recalculate-table-params.mjs +0 -0
  523. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/row-data.mjs +0 -0
  524. /package/{esm2020 → esm2022}/lib/desy-tables/interfaces/wrapper-data.mjs +0 -0
  525. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/accordion-header.data.mjs +0 -0
  526. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/accordion-item.data.mjs +0 -0
  527. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/alert-options.mjs +0 -0
  528. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/description-item.data.mjs +0 -0
  529. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/index.mjs +0 -0
  530. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/open-alert-result.mjs +0 -0
  531. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/status-data.mjs +0 -0
  532. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/status-icon-data.mjs +0 -0
  533. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/status-item-title-data.mjs +0 -0
  534. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/tabs-items-data.mjs +0 -0
  535. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/tabs-panel-data.mjs +0 -0
  536. /package/{esm2020 → esm2022}/lib/desy-views/interfaces/term-definition.data.mjs +0 -0
  537. /package/{esm2020 → esm2022}/lib/shared/components/index.mjs +0 -0
  538. /package/{esm2020 → esm2022}/lib/shared/interfaces/accesibility-data.mjs +0 -0
  539. /package/{esm2020 → esm2022}/lib/shared/utils/focus-utils.mjs +0 -0
@@ -0,0 +1,602 @@
1
+ import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, ViewChild, ViewChildren } from '@angular/core';
2
+ import { AccessibilityComponent } from '../../../shared/components';
3
+ import { MenubaritemDirective } from '../menubar/directives/menubaritem.directive';
4
+ import { MenuNavigationItemComponent } from './components/menu-navigation-item/menu-navigation-item.component';
5
+ import { MenuNavigationSubitemComponent } from './components/menu-navigation-subitem/menu-navigation-subitem.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "../../../shared/directives/attribute-change.directive";
9
+ import * as i3 from "../../../shared/directives/custom-inner-content.directive";
10
+ import * as i4 from "../menubar/directives/menubaritem.directive";
11
+ import * as i5 from "../../../shared/pipes/make-html-list.pipe";
12
+ export class MenuNavigationComponent extends AccessibilityComponent {
13
+ constructor(changeDetectorRef) {
14
+ super();
15
+ this.changeDetectorRef = changeDetectorRef;
16
+ this.itemsChange = new EventEmitter();
17
+ this.activeItemChange = new EventEmitter();
18
+ this.activeSubItemChange = new EventEmitter();
19
+ this.cfg = true;
20
+ this.viewInit = false;
21
+ this.currentFocusItemIndex = 0;
22
+ }
23
+ ngOnChanges(changes) {
24
+ this.roleData = this.role ? this.role : null;
25
+ this.ariaLabelData = this.ariaLabel ? this.ariaLabel : null;
26
+ this.ariaDescribedbyData = this.ariaDescribedBy ? this.ariaDescribedBy : null;
27
+ this.ariaLabelledbyData = this.ariaLabelledBy ? this.ariaLabelledBy : null;
28
+ this.ariaHiddenData = this.ariaHidden ? this.ariaHidden : null;
29
+ this.ariaDisabledData = this.ariaDisabled ? this.ariaDisabled : null;
30
+ this.ariaControlsData = this.ariaControls ? this.ariaControls : null;
31
+ this.ariaCurrentData = this.ariaCurrent ? this.ariaCurrent : null;
32
+ this.ariaLiveData = this.ariaLive ? this.ariaLive : null;
33
+ this.ariaExpandedData = this.ariaExpanded ? this.ariaExpanded : null;
34
+ this.ariaErrormessageData = this.ariaErrorMessage ? this.ariaErrorMessage : null;
35
+ this.ariaHaspopupData = this.ariaHasPopup ? this.ariaHasPopup : null;
36
+ this.ariaModalData = this.ariaModal ? this.ariaModal : null;
37
+ if (this.viewInit) {
38
+ this.checkChanges();
39
+ }
40
+ }
41
+ ngAfterViewInit() {
42
+ this.viewInit = true;
43
+ this.checkChanges();
44
+ }
45
+ checkChanges() {
46
+ if (!this.menuItems) {
47
+ return;
48
+ }
49
+ this.menuData = [];
50
+ this.getItems().forEach((_, index) => {
51
+ const itemData = {
52
+ open: false,
53
+ currentFocusSubItemIndex: 0,
54
+ currentFocusSubSubItemIndex: 0,
55
+ menuItem: this.menuItems.toArray()[index]
56
+ };
57
+ this.menuData.push(itemData);
58
+ });
59
+ if (this.viewInit) {
60
+ this.checkRequired();
61
+ }
62
+ const lastCurrentFocusItemIndex = this.currentFocusItemIndex;
63
+ const items = this.getItems();
64
+ if (items) {
65
+ while (!this.isItemFocusable(this.currentFocusItemIndex % items.length)) {
66
+ this.currentFocusItemIndex = (this.currentFocusItemIndex + items.length + 1) % items.length;
67
+ if (this.currentFocusItemIndex === lastCurrentFocusItemIndex) {
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ handleMenuFocusIn() {
74
+ this.isFocused = true;
75
+ this.changeDetectorRef.detectChanges();
76
+ }
77
+ handleMenuFocusOut(event) {
78
+ if (!this.menunavigation.nativeElement.contains(event.relatedTarget)) {
79
+ this.closeMenu();
80
+ }
81
+ this.isFocused = false;
82
+ this.changeDetectorRef.detectChanges();
83
+ }
84
+ handleMenuItemClick(event, itemIndex) {
85
+ if (this.hasPopupMenu(itemIndex)) {
86
+ event.preventDefault();
87
+ const isOpen = this.menuData[itemIndex].open;
88
+ this.closeMenu();
89
+ if (!isOpen) {
90
+ this.openMenu(itemIndex);
91
+ }
92
+ }
93
+ else {
94
+ this.activateMenuItem(itemIndex);
95
+ }
96
+ }
97
+ handleMenuItemKeydown(event, itemIndex) {
98
+ switch (event.key) {
99
+ case 'Enter':
100
+ case ' ':
101
+ case 'ArrowDown':
102
+ if (this.hasPopupMenu(itemIndex)) {
103
+ this.openMenu(itemIndex);
104
+ setTimeout(() => this.focusFirstSubItem(itemIndex));
105
+ event.stopPropagation();
106
+ event.preventDefault();
107
+ }
108
+ break;
109
+ case 'Escape':
110
+ if (this.hasPopupMenu(itemIndex)) {
111
+ this.closeMenu(itemIndex);
112
+ }
113
+ event.stopPropagation();
114
+ event.preventDefault();
115
+ break;
116
+ case 'ArrowLeft':
117
+ this.focusNextAvailableItem(itemIndex, -1);
118
+ event.stopPropagation();
119
+ event.preventDefault();
120
+ break;
121
+ case 'ArrowRight':
122
+ this.focusNextAvailableItem(itemIndex, +1);
123
+ event.stopPropagation();
124
+ event.preventDefault();
125
+ break;
126
+ case 'ArrowUp':
127
+ if (this.hasPopupMenu(itemIndex)) {
128
+ this.openMenu(itemIndex);
129
+ setTimeout(() => this.focusLastSubItem(itemIndex));
130
+ }
131
+ event.stopPropagation();
132
+ event.preventDefault();
133
+ break;
134
+ case 'Home':
135
+ case 'PageUp':
136
+ if (this.hasPopupMenu(itemIndex)) {
137
+ this.closeMenu();
138
+ }
139
+ this.focusFirstItem();
140
+ event.stopPropagation();
141
+ event.preventDefault();
142
+ break;
143
+ case 'End':
144
+ case 'PageDown':
145
+ if (this.hasPopupMenu(itemIndex)) {
146
+ this.closeMenu();
147
+ }
148
+ this.focusLastItem();
149
+ event.stopPropagation();
150
+ event.preventDefault();
151
+ break;
152
+ default:
153
+ if (this.isPrintableChar(event.key)) {
154
+ this.focusItemByFirstChar(event.key);
155
+ event.stopPropagation();
156
+ event.preventDefault();
157
+ }
158
+ break;
159
+ }
160
+ }
161
+ handleMenuItemMouseOver(itemIndex) {
162
+ this.focusItem(itemIndex, true);
163
+ }
164
+ handlePopupMenuItemClick(itemIndex, subItemIndex, subSubItemIndex) {
165
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
166
+ this.focusItem(itemIndex);
167
+ this.closeMenu(itemIndex);
168
+ }
169
+ handlePopupMenuItemKeydown(event, itemIndex, subItemIndex, subSubItemIndex) {
170
+ const currentSubIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
171
+ const currentSubSubIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
172
+ const items = this.getItems();
173
+ switch (event.key) {
174
+ case ' ':
175
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
176
+ if (this.mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex)) {
177
+ this.closeMenu(itemIndex);
178
+ this.focusItem(itemIndex);
179
+ }
180
+ event.stopPropagation();
181
+ event.preventDefault();
182
+ break;
183
+ case 'Enter':
184
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
185
+ this.closeMenu(itemIndex);
186
+ this.focusItem(itemIndex);
187
+ event.stopPropagation();
188
+ event.preventDefault();
189
+ break;
190
+ case 'Escape':
191
+ this.closeMenu(itemIndex);
192
+ this.focusItem(itemIndex);
193
+ event.stopPropagation();
194
+ event.preventDefault();
195
+ break;
196
+ case 'ArrowUp':
197
+ this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, -1);
198
+ event.stopPropagation();
199
+ event.preventDefault();
200
+ break;
201
+ case 'ArrowDown':
202
+ this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, +1);
203
+ event.stopPropagation();
204
+ event.preventDefault();
205
+ break;
206
+ case 'ArrowLeft':
207
+ this.closeMenu(itemIndex);
208
+ this.focusItem((itemIndex + items.length - 1) % items.length);
209
+ event.stopPropagation();
210
+ event.preventDefault();
211
+ break;
212
+ case 'ArrowRight':
213
+ this.closeMenu(itemIndex);
214
+ this.focusItem((itemIndex + items.length + 1) % items.length);
215
+ event.stopPropagation();
216
+ event.preventDefault();
217
+ break;
218
+ case 'Home':
219
+ case 'PageUp':
220
+ this.focusFirstSubItem(itemIndex);
221
+ event.stopPropagation();
222
+ event.preventDefault();
223
+ break;
224
+ case 'End':
225
+ case 'PageDown':
226
+ this.focusLastSubItem(itemIndex);
227
+ event.stopPropagation();
228
+ event.preventDefault();
229
+ break;
230
+ case 'Tab':
231
+ this.closeMenu(itemIndex);
232
+ this.focusItem(itemIndex);
233
+ break;
234
+ default:
235
+ if (this.isPrintableChar(event.key)) {
236
+ this.focusSubItemByFirstChar(itemIndex, event.key);
237
+ event.stopPropagation();
238
+ event.preventDefault();
239
+ }
240
+ break;
241
+ }
242
+ }
243
+ handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subSubItemIndex) {
244
+ this.focusSubItem(itemIndex, subItemIndex, subSubItemIndex);
245
+ }
246
+ checkRequired() {
247
+ const items = this.getItems();
248
+ }
249
+ activateMenuItem(itemIndex) {
250
+ const items = this.getItems();
251
+ this.activeItemChange.emit(items[itemIndex]);
252
+ if (items[itemIndex] instanceof MenuNavigationItemComponent) {
253
+ items[itemIndex].selected.emit();
254
+ }
255
+ }
256
+ activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex) {
257
+ const items = this.getItems();
258
+ const subItems = this.getItemSubitems(items[itemIndex]);
259
+ let item = subItems[subItemIndex];
260
+ this.itemsChange.emit(items);
261
+ this.activeSubItemChange.emit(item);
262
+ if (item instanceof MenuNavigationSubitemComponent) {
263
+ item.selected.emit();
264
+ }
265
+ }
266
+ mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex) {
267
+ const items = this.getItems();
268
+ const subItems = this.getItemSubitems(items[itemIndex]);
269
+ let item = subItems[subItemIndex];
270
+ return item.role !== 'menuitemcheckbox' && item.role !== 'menuitemradio';
271
+ }
272
+ openMenu(itemIndex) {
273
+ const wasOpened = this.menuData[itemIndex].open;
274
+ this.menuData[itemIndex].open = true;
275
+ if (wasOpened) {
276
+ this.activateMenuItem(itemIndex);
277
+ }
278
+ }
279
+ closeMenu(itemIndex) {
280
+ if (itemIndex !== null && itemIndex !== undefined) {
281
+ this.menuData[itemIndex].open = false;
282
+ }
283
+ else {
284
+ this.menuData.forEach(item => item.open = false);
285
+ }
286
+ }
287
+ hasPopupMenu(itemIndex) {
288
+ const items = this.getItems();
289
+ const subItems = this.getItemSubitems(items[itemIndex]);
290
+ return items[itemIndex].sub && subItems && subItems.length > 0;
291
+ }
292
+ isPrintableChar(str) {
293
+ return str.length === 1 && !!str.match(/\S/);
294
+ }
295
+ focusItem(itemIndex, hover) {
296
+ const hasFocus = this.menunavigation.nativeElement.contains(document.activeElement);
297
+ const isOpen = this.menuData[this.currentFocusItemIndex].open;
298
+ if (!hover || hasFocus) {
299
+ this.menuData[itemIndex].menuItem.link.nativeElement.focus();
300
+ }
301
+ this.closeMenu();
302
+ if (isOpen && this.hasPopupMenu(itemIndex)) {
303
+ this.openMenu(itemIndex);
304
+ }
305
+ this.currentFocusItemIndex = itemIndex;
306
+ }
307
+ focusNextAvailableItem(fromItemIndex, step) {
308
+ let nextItem = fromItemIndex;
309
+ const items = this.getItems();
310
+ do {
311
+ nextItem = (nextItem + items.length + step) % items.length;
312
+ } while (!this.isItemFocusable(nextItem) && nextItem !== fromItemIndex);
313
+ if (nextItem !== fromItemIndex) {
314
+ this.focusItem(nextItem);
315
+ }
316
+ }
317
+ focusFirstItem() {
318
+ if (this.isItemFocusable(0)) {
319
+ this.focusItem(0);
320
+ }
321
+ else {
322
+ this.focusNextAvailableItem(0, +1);
323
+ }
324
+ }
325
+ focusLastItem() {
326
+ const items = this.getItems();
327
+ if (this.isItemFocusable(items.length - 1)) {
328
+ this.focusItem(items.length - 1);
329
+ }
330
+ else {
331
+ this.focusNextAvailableItem(items.length - 1, -1);
332
+ }
333
+ }
334
+ isItemFocusable(itemIndex) {
335
+ return !this.getItems()[itemIndex].disabled;
336
+ }
337
+ focusItemByFirstChar(char) {
338
+ const itemContents = this.menuItems.map(menuItem => menuItem.itemContentWrapper.nativeElement.textContent);
339
+ let index = this.currentFocusItemIndex;
340
+ let foundIndex = -1;
341
+ do {
342
+ index = (index + itemContents.length + 1) % itemContents.length;
343
+ if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
344
+ && this.isItemFocusable(index)) {
345
+ foundIndex = index;
346
+ }
347
+ } while (foundIndex === -1 && index !== this.currentFocusItemIndex);
348
+ if (foundIndex >= 0) {
349
+ this.focusItem(foundIndex);
350
+ }
351
+ }
352
+ focusSubItem(itemIndex, subItemIndex, subSubItemIndex) {
353
+ if (this.menuData[itemIndex].menuItem.popupMenuItems.length > 0) {
354
+ const menuDataIndex = subItemIndex;
355
+ this.menuData[itemIndex].currentFocusSubItemIndex = subItemIndex;
356
+ this.menuData[itemIndex].currentFocusSubSubItemIndex = subSubItemIndex;
357
+ const elem = this.menuData[itemIndex].menuItem.popupMenuItems.toArray()[menuDataIndex].nativeElement;
358
+ if (elem) {
359
+ elem.focus();
360
+ }
361
+ else {
362
+ console.error('No subitem to focus');
363
+ }
364
+ }
365
+ else {
366
+ console.error('No subitems');
367
+ }
368
+ }
369
+ focusNextAvailableSubItem(itemIndex, fromItemSubIndex, fromItemSubSubIndex, step) {
370
+ let nextSubIndex = fromItemSubIndex;
371
+ let nextSubSubIndex = fromItemSubSubIndex;
372
+ let allSubItemsChecked;
373
+ const items = this.getItems();
374
+ do {
375
+ const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step);
376
+ nextSubIndex = nextIndexes.subIndex;
377
+ nextSubSubIndex = nextIndexes.subSubIndex;
378
+ allSubItemsChecked = (fromItemSubIndex === nextSubIndex && fromItemSubSubIndex === nextSubSubIndex);
379
+ } while (!this.isSubItemFocusable(itemIndex, nextSubIndex, nextSubSubIndex) && !allSubItemsChecked);
380
+ if (!allSubItemsChecked) {
381
+ this.focusSubItem(itemIndex, nextSubIndex, nextSubSubIndex);
382
+ }
383
+ }
384
+ focusFirstSubItem(itemIndex) {
385
+ let firstSubSubItem = null;
386
+ const items = this.getItems();
387
+ const subItems = this.getItemSubitems(items[itemIndex]);
388
+ if (subItems && subItems.length > 0) {
389
+ firstSubSubItem = 0;
390
+ }
391
+ if (this.isSubItemFocusable(itemIndex, 0, firstSubSubItem)) {
392
+ this.focusSubItem(itemIndex, 0, firstSubSubItem);
393
+ }
394
+ else {
395
+ this.focusNextAvailableSubItem(itemIndex, 0, firstSubSubItem, +1);
396
+ }
397
+ }
398
+ focusLastSubItem(itemIndex) {
399
+ const items = this.getItems();
400
+ const subItems = this.getItemSubitems(items[itemIndex]);
401
+ const lastItemIndex = subItems.length - 1;
402
+ const lastItem = subItems[lastItemIndex];
403
+ let lastSubSubItem = null;
404
+ if (this.isSubItemFocusable(itemIndex, lastItemIndex, lastSubSubItem)) {
405
+ this.focusSubItem(itemIndex, lastItemIndex, lastSubSubItem);
406
+ }
407
+ else {
408
+ this.focusNextAvailableSubItem(itemIndex, lastItemIndex, lastSubSubItem, -1);
409
+ }
410
+ }
411
+ isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex) {
412
+ const items = this.getItems();
413
+ const subItems = this.getItemSubitems(items[itemIndex]);
414
+ let item = subItems[subItemIndex];
415
+ let isFocusable = false;
416
+ if (item.role !== 'separator' && item.role !== 'none') {
417
+ isFocusable = true;
418
+ }
419
+ return isFocusable;
420
+ }
421
+ focusSubItemByFirstChar(itemIndex, char) {
422
+ const itemContents = this.menuItems.toArray()[itemIndex].popupMenuItems.map(menuItem => menuItem.nativeElement.textContent);
423
+ let subItemIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
424
+ let subSubItemIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
425
+ let foundSubIndex = -1;
426
+ let foundSubSubIndex = null;
427
+ let allSubItemsChecked = false;
428
+ const items = this.getItems();
429
+ do {
430
+ const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, subItemIndex, subSubItemIndex, +1);
431
+ subItemIndex = nextIndexes.subIndex;
432
+ subSubItemIndex = nextIndexes.subSubIndex;
433
+ const index = subItemIndex;
434
+ if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
435
+ && this.isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex)) {
436
+ foundSubIndex = subItemIndex;
437
+ foundSubSubIndex = subSubItemIndex;
438
+ }
439
+ allSubItemsChecked = (this.menuData[itemIndex].currentFocusSubItemIndex === subItemIndex
440
+ && this.menuData[itemIndex].currentFocusSubSubItemIndex === subSubItemIndex);
441
+ } while (foundSubIndex === -1 && !allSubItemsChecked);
442
+ if (foundSubIndex >= 0) {
443
+ this.focusSubItem(itemIndex, foundSubIndex, foundSubSubIndex);
444
+ }
445
+ }
446
+ getItems() {
447
+ let items;
448
+ if (this.itemComponentList && this.itemComponentList.length > 0) {
449
+ items = this.itemComponentList.toArray();
450
+ }
451
+ else {
452
+ items = this.items;
453
+ }
454
+ return items;
455
+ }
456
+ getItemSubitems(item) {
457
+ let subItems = [];
458
+ if (item instanceof MenuNavigationItemComponent) {
459
+ subItems = item.getSubItems();
460
+ }
461
+ if (!subItems || subItems.length === 0) {
462
+ subItems = item.sub ? item.sub.items : [];
463
+ }
464
+ return subItems;
465
+ }
466
+ getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step) {
467
+ const subItems = this.getItemSubitems(items[itemIndex]);
468
+ let checkNextSubItem = true;
469
+ if (checkNextSubItem) {
470
+ nextSubIndex = (nextSubIndex + step + subItems.length) % subItems.length;
471
+ }
472
+ return { subIndex: nextSubIndex, subSubIndex: nextSubSubIndex };
473
+ }
474
+ getIdPrefix() {
475
+ return this.idPrefix ? this.idPrefix : this.id + 'menunavigation-item';
476
+ }
477
+ getItemId(item, index) {
478
+ let id;
479
+ if (item) {
480
+ if (item.id) {
481
+ id = item.id;
482
+ }
483
+ else {
484
+ id = index === 0 ? this.getIdPrefix() : `${this.getIdPrefix()}-${index}`;
485
+ }
486
+ }
487
+ return id;
488
+ }
489
+ getPopupStyle(itemIndex) {
490
+ let style = {};
491
+ if (this.menuData && itemIndex < this.menuData.length) {
492
+ const menuItem = this.menuData[itemIndex].menuItem;
493
+ const rect = menuItem.link.nativeElement.getBoundingClientRect();
494
+ if (this.menuData[itemIndex].open) {
495
+ style = {
496
+ position: 'absolute',
497
+ top: '0px',
498
+ left: '0px',
499
+ zIndex: 100,
500
+ display: 'block'
501
+ };
502
+ }
503
+ else {
504
+ style = {
505
+ zIndex: 0,
506
+ display: 'none'
507
+ };
508
+ }
509
+ }
510
+ return style;
511
+ }
512
+ getSubItemId(item, index, parentId) {
513
+ let id;
514
+ if (item) {
515
+ if (item.id) {
516
+ id = item.id;
517
+ }
518
+ else {
519
+ id = index === 0 ? `sub-${parentId}` : `sub-${parentId}-${index}`;
520
+ }
521
+ }
522
+ return id;
523
+ }
524
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: MenuNavigationComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
525
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: MenuNavigationComponent, selector: "desy-menu-navigation", inputs: { idPrefix: "idPrefix", items: "items", classes: "classes", id: "id" }, outputs: { itemsChange: "itemsChange", activeItemChange: "activeItemChange", activeSubItemChange: "activeSubItemChange" }, host: { properties: { "class": "this.classes", "class.c-menu-navigation": "this.cfg", "attr.id": "this.id", "attr.role": "this.roleData", "attr.aria-label": "this.ariaLabelData", "attr.aria-describedby": "this.ariaDescribedbyData", "attr.aria-labelledby": "this.ariaLabelledbyData", "attr.aria-hidden": "this.ariaHiddenData", "attr.aria-disabled": "this.ariaDisabledData", "attr.aria-controls": "this.ariaControlsData", "attr.aria-current": "this.ariaCurrentData", "attr.aria-live": "this.ariaLiveData", "attr.aria-expanded": "this.ariaExpandedData", "attr.aria-errormessage": "this.ariaErrormessageData", "attr.aria-haspopup": "this.ariaHaspopupData", "attr.aria-modal": "this.ariaModalData" } }, queries: [{ propertyName: "itemComponentList", predicate: MenuNavigationItemComponent }], viewQueries: [{ propertyName: "menunavigation", first: true, predicate: ["menunavigation"], descendants: true, read: ElementRef }, { propertyName: "menuItems", predicate: MenubaritemDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ul #menunavigation [id]=\"id + '-menu-navigation'\" class=\"flex flex-wrap gap-base\"\n(focusin)=\"handleMenuFocusIn()\"\n(focusout)=\"handleMenuFocusOut($event)\"\n[ngClass]=\"{ 'focus': isFocused }\"\n[attr.aria-label]=\"ariaLabel ? ariaLabel : 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.href\" #link\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n role=\"item.disabled ? link : null\"\n [id]=\"getItemId(item, itemIndex)\"\n [target]=\"item.target\"\n [href]=\"item.href\"\n [class]=\"['c-menu-navigation__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menu-navigation__button--disabled': item.disabled, 'c-menu-navigation__button--primary': item.active, 'c-menu-navigation__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.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.disabled ? 'page' : (item.ariaCurrent ? item.ariaCurrent : null)\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate pointer-events-none\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span> \n </a>\n <button *ngIf=\"!item.href\" #link #itemContentWrapper\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n aria-expanded=\"item.sub ? true : false\"\n aria-controls=\"item.sub ? id + '-sub-list' : ''\"\n [class]=\"['c-menu-navigation__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menu-navigation__button--disabled': item.disabled, 'c-menu-navigation__button--primary': item.active, 'c-menu-navigation__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.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span *ngIf=\"item.active\" class=\"sr-only\">Item activo: </span>\n <span class=\"inline-flex self-center max-w-xs align-middle truncate pointer-events-none\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span>\n <svg *ngIf=\"item.sub\" class=\"inline-block -mr-2 align-middle -my-px pointer-events-none\" 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 </button> \n\n <div *ngIf=\"item.sub && getItemSubitems(item)\" class=\"c-menu-navigation__sub absolute bottom-0 left-0\">\n <ul [id]=\"id + '-sub-list'\" [ngStyle]=\"getPopupStyle(itemIndex)\" #popupMenu role=\"menu\" tabindex=\"-1\"\n [class]=\"item.sub.classes ? item.sub.classes : 'c-menu-navigation__tooltip w-max max-w-64 border border-neutral-base shadow-md bg-white text-sm'\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\n [attr.aria-describedby]=\"item.sub.ariaDescribedBy ? item.sub.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.sub.ariaLabelledBy ? item.sub.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.sub.ariaHidden ? item.sub.ariaHidden : null\"\n [attr.aria-disabled]=\"item.sub.ariaDisabled ? item.sub.ariaDisabled : null\"\n [attr.aria-controls]=\"item.sub.ariaControls ? item.sub.ariaControls : null\"\n [attr.aria-current]=\"item.sub.ariaCurrent ? item.sub.ariaCurrent : null\"\n [attr.aria-live]=\"item.sub.ariaLive ? item.sub.ariaLive : null\"\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\"\n [attr.aria-errormessage]=\"item.sub.ariaErrorMessage ? item.sub.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.sub.ariaHasPopup ? item.sub.ariaHasPopup : null\"\n [attr.aria-modal]=\"item.sub.ariaModal ? item.sub.ariaModal : null\">\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\t\t\t\t\n <li #popupMenuItem *ngIf=\"subItem.href\" role=\"none\" tabindex=\"-1\"\n class=\"focus:bg-primary-base focus:text-white focus:outline-none\"\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 <span *ngIf=\"subItem.active\" id=\"subItem.id\" #itemContentWrapper \n [class]=\"['flex items-center px-base py-sm text-sm font-semibold cursor-pointer hover:bg-primary-base hover:text-white', subItem.classes] | makeHtmlList\" \n aria-current=\"page\"\n \n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (subItem.ariaLabel ? subItem.ariaLabel : null)\"\n [attr.aria-describedby]=\"subItem.ariaDescribedBy ? subItem.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"subItem.ariaLabelledBy ? subItem.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"subItem.ariaHidden ? subItem.ariaHidden : null\"\n [attr.aria-disabled]=\"subItem.ariaDisabled ? subItem.ariaDisabled : null\"\n [attr.aria-controls]=\"subItem.ariaControls ? subItem.ariaControls : null\"\n [attr.aria-current]=\"subItem.ariaCurrent ? subItem.ariaCurrent : null\"\n [attr.aria-live]=\"subItem.ariaLive ? subItem.ariaLive : null\"\n [attr.aria-expanded]=\"!!(menuData && menuData[subItemIndex].open)\"\n [attr.aria-errormessage]=\"subItem.ariaErrorMessage ? subItem.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"subItem.ariaHasPopup ? subItem.ariaHasPopup : null\"\n [attr.aria-modal]=\"subItem.ariaModal ? subItem.ariaModal : null\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n \n <a *ngIf=\"!subItem.active\" #itemContentWrapper\n [href]=\"subItem.href\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n (desyAttributeChange)=\"checkChanges()\"\n [class]=\"['flex items-center px-base py-sm text-sm hover:bg-primary-base hover:text-white focus:bg-warning-base focus:outline-none focus:shadow-outline-focus focus:text-black', subItem.classes] | makeHtmlList\"\n [ngClass]=\"{'pointer-events-none': subItem.disabled}\"\n [tabindex]=\"subItem.disabled ? -1 : null\"\n [target] = \"subItem.target\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n <svg *ngIf=\"subItem.disabled\" viewBox=\"0 0 140 140\" height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" class=\"inline-block align-middle ml-sm text-neutral-base fill-current\" aria-hidden=\"true\" focusable=\"false\" ><path d=\"M70 0a70 70 0 1070 70A70.08 70.08 0 0070 0zM20 70a50 50 0 0174.8-43.4 2.51 2.51 0 011.23 1.84 2.48 2.48 0 01-.71 2.1L30.54 95.32a2.51 2.51 0 01-3.94-.52A49.63 49.63 0 0120 70zm100 0a50 50 0 01-74.8 43.4 2.51 2.51 0 01-1.23-1.84 2.48 2.48 0 01.71-2.1l64.78-64.78a2.51 2.51 0 013.94.52A49.63 49.63 0 01120 70z\"/></svg>\n </a>\n </li>\n <li #popupMenuItem *ngIf=\"!subItem.href\" role=\"none\" tabindex=\"-1\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"focus:bg-primary-base focus:text-white focus:outline-none\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <span [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, subItemIndex))\"\n class=\"flex items-center px-base py-sm text-sm cursor-pointer hover:bg-primary-base hover:text-white\"\n [ngClass]=\"{'font-bold': subItem.active, 'pointer-events-none': subItem.disabled}\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n <svg *ngIf=\"subItem.disabled\" viewBox=\"0 0 140 140\" height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" class=\"inline-block align-middle ml-sm text-neutral-base fill-current\" aria-hidden=\"true\" focusable=\"false\" ><path d=\"M70 0a70 70 0 1070 70A70.08 70.08 0 0070 0zM20 70a50 50 0 0174.8-43.4 2.51 2.51 0 011.23 1.84 2.48 2.48 0 01-.71 2.1L30.54 95.32a2.51 2.51 0 01-3.94-.52A49.63 49.63 0 0120 70zm100 0a50 50 0 01-74.8 43.4 2.51 2.51 0 01-1.23-1.84 2.48 2.48 0 01.71-2.1l64.78-64.78a2.51 2.51 0 013.94.52A49.63 49.63 0 01120 70z\"/></svg>\n </li>\n \n <li *ngIf=\"subItem.divider\" class=\"my-sm border-b border-neutral-base\">\n <div class=\"sr-only\">Separador</div>\n </li>\n </ng-container>\n </ul>\n </div>\n</li>\n<li #popupMenuItem *ngIf=\"item.divider\" class=\"item.divider.classes\" role=\"presentation\" aria-hidden=\"true\">\n <ng-container *desyCustomInnerContent=\"{ component: item.divider, html: item.divider.html, text: item.divider.text}\"></ng-container>\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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.AttributeChangeDirective, selector: "[desyAttributeChange]", inputs: ["attributesToCheck", "desyAttributeChangeEnabled"], outputs: ["desyAttributeChange", "desyAttributeChangeMutation"] }, { kind: "directive", type: i3.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "directive", type: i4.MenubaritemDirective, selector: "[desyMenubaritem]", outputs: ["contentChanged"] }, { kind: "pipe", type: i5.MakeHtmlListPipe, name: "makeHtmlList" }] }); }
526
+ }
527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: MenuNavigationComponent, decorators: [{
528
+ type: Component,
529
+ args: [{ selector: 'desy-menu-navigation', template: "<ul #menunavigation [id]=\"id + '-menu-navigation'\" class=\"flex flex-wrap gap-base\"\n(focusin)=\"handleMenuFocusIn()\"\n(focusout)=\"handleMenuFocusOut($event)\"\n[ngClass]=\"{ 'focus': isFocused }\"\n[attr.aria-label]=\"ariaLabel ? ariaLabel : 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.href\" #link\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n role=\"item.disabled ? link : null\"\n [id]=\"getItemId(item, itemIndex)\"\n [target]=\"item.target\"\n [href]=\"item.href\"\n [class]=\"['c-menu-navigation__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menu-navigation__button--disabled': item.disabled, 'c-menu-navigation__button--primary': item.active, 'c-menu-navigation__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.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.disabled ? 'page' : (item.ariaCurrent ? item.ariaCurrent : null)\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate pointer-events-none\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span> \n </a>\n <button *ngIf=\"!item.href\" #link #itemContentWrapper\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n aria-expanded=\"item.sub ? true : false\"\n aria-controls=\"item.sub ? id + '-sub-list' : ''\"\n [class]=\"['c-menu-navigation__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menu-navigation__button--disabled': item.disabled, 'c-menu-navigation__button--primary': item.active, 'c-menu-navigation__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.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span *ngIf=\"item.active\" class=\"sr-only\">Item activo: </span>\n <span class=\"inline-flex self-center max-w-xs align-middle truncate pointer-events-none\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span>\n <svg *ngIf=\"item.sub\" class=\"inline-block -mr-2 align-middle -my-px pointer-events-none\" 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 </button> \n\n <div *ngIf=\"item.sub && getItemSubitems(item)\" class=\"c-menu-navigation__sub absolute bottom-0 left-0\">\n <ul [id]=\"id + '-sub-list'\" [ngStyle]=\"getPopupStyle(itemIndex)\" #popupMenu role=\"menu\" tabindex=\"-1\"\n [class]=\"item.sub.classes ? item.sub.classes : 'c-menu-navigation__tooltip w-max max-w-64 border border-neutral-base shadow-md bg-white text-sm'\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\n [attr.aria-describedby]=\"item.sub.ariaDescribedBy ? item.sub.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.sub.ariaLabelledBy ? item.sub.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.sub.ariaHidden ? item.sub.ariaHidden : null\"\n [attr.aria-disabled]=\"item.sub.ariaDisabled ? item.sub.ariaDisabled : null\"\n [attr.aria-controls]=\"item.sub.ariaControls ? item.sub.ariaControls : null\"\n [attr.aria-current]=\"item.sub.ariaCurrent ? item.sub.ariaCurrent : null\"\n [attr.aria-live]=\"item.sub.ariaLive ? item.sub.ariaLive : null\"\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\"\n [attr.aria-errormessage]=\"item.sub.ariaErrorMessage ? item.sub.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.sub.ariaHasPopup ? item.sub.ariaHasPopup : null\"\n [attr.aria-modal]=\"item.sub.ariaModal ? item.sub.ariaModal : null\">\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\t\t\t\t\n <li #popupMenuItem *ngIf=\"subItem.href\" role=\"none\" tabindex=\"-1\"\n class=\"focus:bg-primary-base focus:text-white focus:outline-none\"\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 <span *ngIf=\"subItem.active\" id=\"subItem.id\" #itemContentWrapper \n [class]=\"['flex items-center px-base py-sm text-sm font-semibold cursor-pointer hover:bg-primary-base hover:text-white', subItem.classes] | makeHtmlList\" \n aria-current=\"page\"\n \n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (subItem.ariaLabel ? subItem.ariaLabel : null)\"\n [attr.aria-describedby]=\"subItem.ariaDescribedBy ? subItem.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"subItem.ariaLabelledBy ? subItem.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"subItem.ariaHidden ? subItem.ariaHidden : null\"\n [attr.aria-disabled]=\"subItem.ariaDisabled ? subItem.ariaDisabled : null\"\n [attr.aria-controls]=\"subItem.ariaControls ? subItem.ariaControls : null\"\n [attr.aria-current]=\"subItem.ariaCurrent ? subItem.ariaCurrent : null\"\n [attr.aria-live]=\"subItem.ariaLive ? subItem.ariaLive : null\"\n [attr.aria-expanded]=\"!!(menuData && menuData[subItemIndex].open)\"\n [attr.aria-errormessage]=\"subItem.ariaErrorMessage ? subItem.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"subItem.ariaHasPopup ? subItem.ariaHasPopup : null\"\n [attr.aria-modal]=\"subItem.ariaModal ? subItem.ariaModal : null\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n \n <a *ngIf=\"!subItem.active\" #itemContentWrapper\n [href]=\"subItem.href\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n (desyAttributeChange)=\"checkChanges()\"\n [class]=\"['flex items-center px-base py-sm text-sm hover:bg-primary-base hover:text-white focus:bg-warning-base focus:outline-none focus:shadow-outline-focus focus:text-black', subItem.classes] | makeHtmlList\"\n [ngClass]=\"{'pointer-events-none': subItem.disabled}\"\n [tabindex]=\"subItem.disabled ? -1 : null\"\n [target] = \"subItem.target\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n <svg *ngIf=\"subItem.disabled\" viewBox=\"0 0 140 140\" height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" class=\"inline-block align-middle ml-sm text-neutral-base fill-current\" aria-hidden=\"true\" focusable=\"false\" ><path d=\"M70 0a70 70 0 1070 70A70.08 70.08 0 0070 0zM20 70a50 50 0 0174.8-43.4 2.51 2.51 0 011.23 1.84 2.48 2.48 0 01-.71 2.1L30.54 95.32a2.51 2.51 0 01-3.94-.52A49.63 49.63 0 0120 70zm100 0a50 50 0 01-74.8 43.4 2.51 2.51 0 01-1.23-1.84 2.48 2.48 0 01.71-2.1l64.78-64.78a2.51 2.51 0 013.94.52A49.63 49.63 0 01120 70z\"/></svg>\n </a>\n </li>\n <li #popupMenuItem *ngIf=\"!subItem.href\" role=\"none\" tabindex=\"-1\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"focus:bg-primary-base focus:text-white focus:outline-none\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <span [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, subItemIndex))\"\n class=\"flex items-center px-base py-sm text-sm cursor-pointer hover:bg-primary-base hover:text-white\"\n [ngClass]=\"{'font-bold': subItem.active, 'pointer-events-none': subItem.disabled}\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </span>\n <svg *ngIf=\"subItem.disabled\" viewBox=\"0 0 140 140\" height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" class=\"inline-block align-middle ml-sm text-neutral-base fill-current\" aria-hidden=\"true\" focusable=\"false\" ><path d=\"M70 0a70 70 0 1070 70A70.08 70.08 0 0070 0zM20 70a50 50 0 0174.8-43.4 2.51 2.51 0 011.23 1.84 2.48 2.48 0 01-.71 2.1L30.54 95.32a2.51 2.51 0 01-3.94-.52A49.63 49.63 0 0120 70zm100 0a50 50 0 01-74.8 43.4 2.51 2.51 0 01-1.23-1.84 2.48 2.48 0 01.71-2.1l64.78-64.78a2.51 2.51 0 013.94.52A49.63 49.63 0 01120 70z\"/></svg>\n </li>\n \n <li *ngIf=\"subItem.divider\" class=\"my-sm border-b border-neutral-base\">\n <div class=\"sr-only\">Separador</div>\n </li>\n </ng-container>\n </ul>\n </div>\n</li>\n<li #popupMenuItem *ngIf=\"item.divider\" class=\"item.divider.classes\" role=\"presentation\" aria-hidden=\"true\">\n <ng-container *desyCustomInnerContent=\"{ component: item.divider, html: item.divider.html, text: item.divider.text}\"></ng-container>\n</li>\n</ng-container>\n</ul>\n" }]
530
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { idPrefix: [{
531
+ type: Input
532
+ }], items: [{
533
+ type: Input
534
+ }], itemsChange: [{
535
+ type: Output
536
+ }], activeItemChange: [{
537
+ type: Output
538
+ }], activeSubItemChange: [{
539
+ type: Output
540
+ }], menunavigation: [{
541
+ type: ViewChild,
542
+ args: ['menunavigation', { read: ElementRef }]
543
+ }], menuItems: [{
544
+ type: ViewChildren,
545
+ args: [MenubaritemDirective]
546
+ }], itemComponentList: [{
547
+ type: ContentChildren,
548
+ args: [MenuNavigationItemComponent]
549
+ }], classes: [{
550
+ type: Input
551
+ }, {
552
+ type: HostBinding,
553
+ args: ['class']
554
+ }], cfg: [{
555
+ type: HostBinding,
556
+ args: ['class.c-menu-navigation']
557
+ }], id: [{
558
+ type: Input
559
+ }, {
560
+ type: HostBinding,
561
+ args: ['attr.id']
562
+ }], roleData: [{
563
+ type: HostBinding,
564
+ args: ['attr.role']
565
+ }], ariaLabelData: [{
566
+ type: HostBinding,
567
+ args: ['attr.aria-label']
568
+ }], ariaDescribedbyData: [{
569
+ type: HostBinding,
570
+ args: ['attr.aria-describedby']
571
+ }], ariaLabelledbyData: [{
572
+ type: HostBinding,
573
+ args: ['attr.aria-labelledby']
574
+ }], ariaHiddenData: [{
575
+ type: HostBinding,
576
+ args: ['attr.aria-hidden']
577
+ }], ariaDisabledData: [{
578
+ type: HostBinding,
579
+ args: ['attr.aria-disabled']
580
+ }], ariaControlsData: [{
581
+ type: HostBinding,
582
+ args: ['attr.aria-controls']
583
+ }], ariaCurrentData: [{
584
+ type: HostBinding,
585
+ args: ['attr.aria-current']
586
+ }], ariaLiveData: [{
587
+ type: HostBinding,
588
+ args: ['attr.aria-live']
589
+ }], ariaExpandedData: [{
590
+ type: HostBinding,
591
+ args: ['attr.aria-expanded']
592
+ }], ariaErrormessageData: [{
593
+ type: HostBinding,
594
+ args: ['attr.aria-errormessage']
595
+ }], ariaHaspopupData: [{
596
+ type: HostBinding,
597
+ args: ['attr.aria-haspopup']
598
+ }], ariaModalData: [{
599
+ type: HostBinding,
600
+ args: ['attr.aria-modal']
601
+ }] } });
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1uYXZpZ2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc3ktYW5ndWxhci9zcmMvbGliL2Rlc3ktbmF2L2NvbXBvbmVudHMvbWVudS1uYXZpZ2F0aW9uL21lbnUtbmF2aWdhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LW5hdi9jb21wb25lbnRzL21lbnUtbmF2aWdhdGlvbi9tZW51LW5hdmlnYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVCxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0VBQWtFLENBQUM7QUFDL0csT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7Ozs7Ozs7QUFNeEgsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHNCQUFzQjtJQW1DakUsWUFBb0IsaUJBQW9DO1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBRFUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQS9COUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUN2RCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUMxRCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBZ0UsQ0FBQztRQU96RSxRQUFHLEdBQUcsSUFBSSxDQUFBO1FBa0JsRCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztJQUkxQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsd0JBQXdCLEVBQUUsQ0FBQztnQkFDM0IsMkJBQTJCLEVBQUUsQ0FBQztnQkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQzFDLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7UUFHRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM1RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyx5QkFBeUIsRUFBRTtvQkFDNUQsTUFBTTtpQkFDUDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBT0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFNBQWlCO1FBQzFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMxQjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBb0IsRUFBRSxTQUFpQjtRQUMzRCxRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDakIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssV0FBVztnQkFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDcEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQ3hCO2dCQUNELE1BQU07WUFFUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMzQjtnQkFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUVSLEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBRVIsS0FBSyxZQUFZO2dCQUNmLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2dCQUNELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBRVIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2xCO2dCQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssVUFBVTtnQkFDYixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUVSO2dCQUNFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUN4QjtnQkFDRCxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsU0FBaUI7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELHdCQUF3QixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxlQUF3QjtRQUN4RixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELDBCQUEwQixDQUFDLEtBQW9CLEVBQUUsU0FBaUIsRUFBRSxZQUFvQixFQUFFLGVBQXdCO1FBQ2hILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsd0JBQXdCLENBQUM7UUFDMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDO1FBQ2hGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDakIsS0FBSyxHQUFHO2dCQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxFQUFFO29CQUNoRixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMzQjtnQkFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUVSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbkYsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbkYsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFFUixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBRVIsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUVSLEtBQUssS0FBSztnQkFDUixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixNQUFNO1lBRVI7Z0JBQ0UsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25ELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUN4QjtnQkFDRCxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLGVBQXdCO1FBQzVGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBTUQsYUFBYTtRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBdUIsQ0FBQyxDQUFDO1FBQ25FLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLDJCQUEyQixFQUFFO1lBQzFELEtBQUssQ0FBQyxTQUFTLENBQWlDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25FO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxlQUF3QjtRQUNyRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLElBQUksR0FBK0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTlGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBMEIsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxZQUFZLDhCQUE4QixFQUFFO1lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLGVBQXdCO1FBQzdGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksSUFBSSxHQUErRCxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFOUYsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDO0lBQzNFLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBaUI7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxTQUFrQjtRQUMxQixJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7U0FDdkM7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUI7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVc7UUFDakMsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBUUQsU0FBUyxDQUFDLFNBQWlCLEVBQUUsS0FBZTtRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTlELElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDOUQ7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsYUFBcUIsRUFBRSxJQUFZO1FBQ3hELElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsR0FBRztZQUNELFFBQVEsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDNUQsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRTtRQUV4RSxJQUFJLFFBQVEsS0FBSyxhQUFhLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7YUFBTTtZQUNMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0wsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLFNBQWlCO1FBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sWUFBWSxHQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNySCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDdkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsR0FBRztZQUNELEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDaEUsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTttQkFDaEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEMsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUNwQjtTQUNGLFFBQVEsVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMscUJBQXFCLEVBQUU7UUFFcEUsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxlQUF3QjtRQUM1RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDJCQUEyQixHQUFHLGVBQWUsQ0FBQztZQUN2RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQ3JHLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUN0QztTQUNGO2FBQU07WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQWlCLEVBQUUsZ0JBQXdCLEVBQUUsbUJBQTJCLEVBQUUsSUFBWTtRQUM5RyxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztRQUNwQyxJQUFJLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztRQUMxQyxJQUFJLGtCQUFrQixDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RyxZQUFZLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNwQyxlQUFlLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUMxQyxrQkFBa0IsR0FBRyxDQUFDLGdCQUFnQixLQUFLLFlBQVksSUFBSSxtQkFBbUIsS0FBSyxlQUFlLENBQUMsQ0FBQztTQUNyRyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUVwRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNMLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25FO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFMUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsRUFBRTtZQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDN0Q7YUFBTTtZQUNMLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlFO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxlQUF3QjtRQUNsRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLElBQUksR0FBK0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTlGLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3JELFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsdUJBQXVCLENBQUMsU0FBaUIsRUFBRSxJQUFZO1FBQ3JELE1BQU0sWUFBWSxHQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQztRQUNyRSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDO1FBQzNFLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLFlBQVksR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQ3BDLGVBQWUsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQzFDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMzQixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFO21CQUNoRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLFlBQVksQ0FBQztnQkFDN0IsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO2FBQ3BDO1lBQ0Qsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFlBQVk7bUJBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsMkJBQTJCLEtBQUssZUFBZSxDQUFDLENBQUM7U0FDaEYsUUFBUSxhQUFhLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUV0RCxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDO0lBTUQsUUFBUTtRQUNOLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0QsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQzthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDcEI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBb0Q7UUFDbEUsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxZQUFZLDJCQUEyQixFQUFDO1lBQzlDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0I7UUFFRCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxJQUFJO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFeEQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixZQUFZLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQzFFO1FBQ0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLHFCQUFxQixDQUFDO0lBQ3pFLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQWE7UUFDM0IsSUFBSSxFQUFVLENBQUM7UUFDZixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDWCxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNkO2lCQUFNO2dCQUNMLEVBQUUsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO2FBQzFFO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxhQUFhLENBQUMsU0FBaUI7UUFDN0IsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pDLEtBQUssR0FBRztvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsR0FBRyxFQUFFLEtBQUs7b0JBQ1YsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsTUFBTSxFQUFFLEdBQUc7b0JBQ1gsT0FBTyxFQUFFLE9BQU87aUJBQ2pCLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxLQUFLLEdBQUc7b0JBQ04sTUFBTSxFQUFFLENBQUM7b0JBQ1QsT0FBTyxFQUFFLE1BQU07aUJBQ2hCLENBQUM7YUFDSDtTQUNGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFhLEVBQUUsUUFBZ0I7UUFDaEQsSUFBSSxFQUFVLENBQUM7UUFDZixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDWCxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNkO2lCQUFNO2dCQUNMLEVBQUUsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQzthQUNuRTtTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOzhHQTltQlUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsbStCQVVqQiwyQkFBMkIsMEhBRlAsVUFBVSw0Q0FDakMsb0JBQW9CLDRGQ2xDcEMsMmdZQWdKQTs7MkZEdkhhLHVCQUF1QjtrQkFKbkMsU0FBUzsrQkFDRSxzQkFBc0I7d0dBS3ZCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFNEMsY0FBYztzQkFBaEUsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ2IsU0FBUztzQkFBNUMsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBQ1ksaUJBQWlCO3NCQUE5RCxlQUFlO3VCQUFDLDJCQUEyQjtnQkFFYixPQUFPO3NCQUFyQyxLQUFLOztzQkFBSSxXQUFXO3VCQUFDLE9BQU87Z0JBQ1csR0FBRztzQkFBMUMsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBQ0wsRUFBRTtzQkFBbEMsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxTQUFTO2dCQUVMLFFBQVE7c0JBQWpDLFdBQVc7dUJBQUMsV0FBVztnQkFDUSxhQUFhO3NCQUE1QyxXQUFXO3VCQUFDLGlCQUFpQjtnQkFDUSxtQkFBbUI7c0JBQXhELFdBQVc7dUJBQUMsdUJBQXVCO2dCQUNDLGtCQUFrQjtzQkFBdEQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBQ0YsY0FBYztzQkFBOUMsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBQ0ksZ0JBQWdCO3NCQUFsRCxXQUFXO3VCQUFDLG9CQUFvQjtnQkFDRSxnQkFBZ0I7c0JBQWxELFdBQVc7dUJBQUMsb0JBQW9CO2dCQUNDLGVBQWU7c0JBQWhELFdBQVc7dUJBQUMsbUJBQW1CO2dCQUNELFlBQVk7c0JBQTFDLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUNNLGdCQUFnQjtzQkFBbEQsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBQ00sb0JBQW9CO3NCQUExRCxXQUFXO3VCQUFDLHdCQUF3QjtnQkFDRixnQkFBZ0I7c0JBQWxELFdBQVc7dUJBQUMsb0JBQW9CO2dCQUNELGFBQWE7c0JBQTVDLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgXG4gIENoYW5nZURldGVjdG9yUmVmLCBcbiAgQ29tcG9uZW50LCBcbiAgQ29udGVudENoaWxkcmVuLCBcbiAgRWxlbWVudFJlZiwgXG4gIEV2ZW50RW1pdHRlciwgXG4gIEhvc3RCaW5kaW5nLCBcbiAgSW5wdXQsIFxuICBPbkNoYW5nZXMsIFxuICBPdXRwdXQsIFxuICBRdWVyeUxpc3QsIFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsIFxuICBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBNZW51TmF2aWdhdGlvbkl0ZW1TdWJJdGVtLCBNZW51TmF2aWdhdGlvbkl0ZW1TdWJJdGVtU3ViSXRlbSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWVudU5hdmlnYXRpb25JdGVtIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tZW51LW5hdmlnYXRpb24nO1xuaW1wb3J0IHsgTWVudWJhcml0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9tZW51YmFyL2RpcmVjdGl2ZXMvbWVudWJhcml0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE1lbnVOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tZW51LW5hdmlnYXRpb24taXRlbS9tZW51LW5hdmlnYXRpb24taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudU5hdmlnYXRpb25TdWJpdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21lbnUtbmF2aWdhdGlvbi1zdWJpdGVtL21lbnUtbmF2aWdhdGlvbi1zdWJpdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rlc3ktbWVudS1uYXZpZ2F0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUtbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTWVudU5hdmlnYXRpb25Db21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0e1xuXG4gIEBJbnB1dCgpIGlkUHJlZml4OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGl0ZW1zOiBNZW51TmF2aWdhdGlvbkl0ZW1bXTtcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51TmF2aWdhdGlvbkl0ZW1bXT4oKTtcbiAgQE91dHB1dCgpIGFjdGl2ZUl0ZW1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVOYXZpZ2F0aW9uSXRlbT4oKTtcbiAgQE91dHB1dCgpIGFjdGl2ZVN1Ykl0ZW1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVOYXZpZ2F0aW9uSXRlbVN1Ykl0ZW0gfCBNZW51TmF2aWdhdGlvbkl0ZW1TdWJJdGVtU3ViSXRlbT4oKTtcblxuICBAVmlld0NoaWxkKCdtZW51bmF2aWdhdGlvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBtZW51bmF2aWdhdGlvbjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZHJlbihNZW51YmFyaXRlbURpcmVjdGl2ZSkgbWVudUl0ZW1zOiBRdWVyeUxpc3Q8TWVudWJhcml0ZW1EaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKE1lbnVOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCkgaXRlbUNvbXBvbmVudExpc3Q6IFF1ZXJ5TGlzdDxNZW51TmF2aWdhdGlvbkl0ZW1Db21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc2VzOiBhbnk7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYy1tZW51LW5hdmlnYXRpb24nKSBjZmcgPSB0cnVlXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnYXR0ci5pZCcpIGlkOiBhbnk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSByb2xlRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpIGFyaWFMYWJlbERhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBhcmlhRGVzY3JpYmVkYnlEYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRieURhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJykgYXJpYUhpZGRlbkRhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGlzYWJsZWQnKSBhcmlhRGlzYWJsZWREYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWNvbnRyb2xzJykgYXJpYUNvbnRyb2xzRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jdXJyZW50JykgYXJpYUN1cnJlbnREYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxpdmUnKSBhcmlhTGl2ZURhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKSBhcmlhRXhwYW5kZWREYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWVycm9ybWVzc2FnZScpIGFyaWFFcnJvcm1lc3NhZ2VEYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJykgYXJpYUhhc3BvcHVwRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1tb2RhbCcpIGFyaWFNb2RhbERhdGE6IGFueTtcblxuICBtZW51RGF0YTogYW55W107XG4gIHZpZXdJbml0ID0gZmFsc2U7XG4gIGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgY3VycmVudEZvY3VzSXRlbUluZGV4ID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMucm9sZURhdGEgPSB0aGlzLnJvbGUgPyB0aGlzLnJvbGUgOiBudWxsO1xuICAgIHRoaXMuYXJpYUxhYmVsRGF0YSA9IHRoaXMuYXJpYUxhYmVsID8gdGhpcy5hcmlhTGFiZWwgOiBudWxsO1xuICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5RGF0YSA9IHRoaXMuYXJpYURlc2NyaWJlZEJ5ID8gdGhpcy5hcmlhRGVzY3JpYmVkQnkgOiBudWxsO1xuICAgIHRoaXMuYXJpYUxhYmVsbGVkYnlEYXRhID0gdGhpcy5hcmlhTGFiZWxsZWRCeSA/IHRoaXMuYXJpYUxhYmVsbGVkQnkgOiBudWxsO1xuICAgIHRoaXMuYXJpYUhpZGRlbkRhdGEgPSB0aGlzLmFyaWFIaWRkZW4gPyB0aGlzLmFyaWFIaWRkZW4gOiBudWxsO1xuICAgIHRoaXMuYXJpYURpc2FibGVkRGF0YSA9IHRoaXMuYXJpYURpc2FibGVkID8gdGhpcy5hcmlhRGlzYWJsZWQgOiBudWxsO1xuICAgIHRoaXMuYXJpYUNvbnRyb2xzRGF0YSA9IHRoaXMuYXJpYUNvbnRyb2xzID8gdGhpcy5hcmlhQ29udHJvbHMgOiBudWxsO1xuICAgIHRoaXMuYXJpYUN1cnJlbnREYXRhID0gdGhpcy5hcmlhQ3VycmVudCA/IHRoaXMuYXJpYUN1cnJlbnQgOiBudWxsO1xuICAgIHRoaXMuYXJpYUxpdmVEYXRhID0gdGhpcy5hcmlhTGl2ZSA/IHRoaXMuYXJpYUxpdmUgOiBudWxsO1xuICAgIHRoaXMuYXJpYUV4cGFuZGVkRGF0YSA9IHRoaXMuYXJpYUV4cGFuZGVkID8gdGhpcy5hcmlhRXhwYW5kZWQgOiBudWxsO1xuICAgIHRoaXMuYXJpYUVycm9ybWVzc2FnZURhdGEgPSB0aGlzLmFyaWFFcnJvck1lc3NhZ2UgPyB0aGlzLmFyaWFFcnJvck1lc3NhZ2UgOiBudWxsO1xuICAgIHRoaXMuYXJpYUhhc3BvcHVwRGF0YSA9IHRoaXMuYXJpYUhhc1BvcHVwID8gdGhpcy5hcmlhSGFzUG9wdXAgOiBudWxsO1xuICAgIHRoaXMuYXJpYU1vZGFsRGF0YSA9IHRoaXMuYXJpYU1vZGFsID8gdGhpcy5hcmlhTW9kYWwgOiBudWxsO1xuICAgIGlmICh0aGlzLnZpZXdJbml0KSB7XG4gICAgICB0aGlzLmNoZWNrQ2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdJbml0ID0gdHJ1ZTtcbiAgICB0aGlzLmNoZWNrQ2hhbmdlcygpO1xuICB9XG5cbiAgY2hlY2tDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZW51SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5tZW51RGF0YSA9IFtdO1xuICAgIHRoaXMuZ2V0SXRlbXMoKS5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXRlbURhdGEgPSB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBjdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXg6IDAsXG4gICAgICAgIGN1cnJlbnRGb2N1c1N1YlN1Ykl0ZW1JbmRleDogMCxcbiAgICAgICAgbWVudUl0ZW06IHRoaXMubWVudUl0ZW1zLnRvQXJyYXkoKVtpbmRleF1cbiAgICAgIH07XG4gICAgICB0aGlzLm1lbnVEYXRhLnB1c2goaXRlbURhdGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMudmlld0luaXQpIHtcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZCgpO1xuICAgIH1cblxuXG4gICAgY29uc3QgbGFzdEN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9IHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4O1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGlmIChpdGVtcykge1xuICAgICAgd2hpbGUgKCF0aGlzLmlzSXRlbUZvY3VzYWJsZSh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCAlIGl0ZW1zLmxlbmd0aCkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggPSAodGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggKyBpdGVtcy5sZW5ndGggKyAxKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4ID09PSBsYXN0Q3VycmVudEZvY3VzSXRlbUluZGV4KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qXG4gICAqIEV2ZW50b3NcbiAgICovXG5cbiAgaGFuZGxlTWVudUZvY3VzSW4oKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGFuZGxlTWVudUZvY3VzT3V0KGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnVuYXZpZ2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgfVxuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbUNsaWNrKGV2ZW50LCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW47XG4gICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgaWYgKCFpc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCkpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShpdGVtSW5kZXgsIC0xKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKGl0ZW1JbmRleCwgKzEpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgICAgIHRoaXMub3Blbk1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNMYXN0U3ViSXRlbShpdGVtSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c0xhc3RJdGVtKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuaXNQcmludGFibGVDaGFyKGV2ZW50LmtleSkpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzSXRlbUJ5Rmlyc3RDaGFyKGV2ZW50LmtleSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCwgdHJ1ZSk7XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3ViSW5kZXggPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViSXRlbUluZGV4O1xuICAgIGNvbnN0IGN1cnJlbnRTdWJTdWJJbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMubXVzdENsb3NlQWZ0ZXJTZWxlY3RQb3B1cEl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIHRoaXMuYWN0aXZhdGVQb3B1cE1lbnVJdGVtKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXgsIGN1cnJlbnRTdWJJbmRleCwgY3VycmVudFN1YlN1YkluZGV4LCAtMSk7XG4gICAgICAgIC8vIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgKGN1cnJlbnRTdWJJbmRleCArIGxpc3RMZW5ndGggLSAxKSAlIGxpc3RMZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXgsIGN1cnJlbnRTdWJJbmRleCwgY3VycmVudFN1YlN1YkluZGV4LCArMSk7XG4gICAgICAgIC8vIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgKGN1cnJlbnRTdWJJbmRleCArIGxpc3RMZW5ndGggKyAxKSAlIGxpc3RMZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpdGVtSW5kZXggKyBpdGVtcy5sZW5ndGggLSAxKSAlIGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpdGVtSW5kZXggKyBpdGVtcy5sZW5ndGggKyAxKSAlIGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgdGhpcy5mb2N1c0xhc3RTdWJJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlQ2hhcihldmVudC5rZXkpKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW1CeUZpcnN0Q2hhcihpdGVtSW5kZXgsIGV2ZW50LmtleSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCk7XG4gIH1cblxuICAvKlxuICAgKiBDb211bmVzXG4gICAqL1xuXG4gIGNoZWNrUmVxdWlyZWQoKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gIH1cblxuXG4gIGFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICB0aGlzLmFjdGl2ZUl0ZW1DaGFuZ2UuZW1pdChpdGVtc1tpdGVtSW5kZXhdIGFzIE1lbnVOYXZpZ2F0aW9uSXRlbSk7XG4gICAgaWYgKGl0ZW1zW2l0ZW1JbmRleF0gaW5zdGFuY2VvZiBNZW51TmF2aWdhdGlvbkl0ZW1Db21wb25lbnQpIHtcbiAgICAgIChpdGVtc1tpdGVtSW5kZXhdIGFzIE1lbnVOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCkuc2VsZWN0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgbGV0IGl0ZW06IE1lbnVOYXZpZ2F0aW9uSXRlbVN1Ykl0ZW18TWVudU5hdmlnYXRpb25JdGVtU3ViSXRlbVN1Ykl0ZW0gPSBzdWJJdGVtc1tzdWJJdGVtSW5kZXhdOyAgICAgICAgXG5cbiAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgIHRoaXMuYWN0aXZlU3ViSXRlbUNoYW5nZS5lbWl0KGl0ZW0gYXMgTWVudU5hdmlnYXRpb25JdGVtKTtcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnVOYXZpZ2F0aW9uU3ViaXRlbUNvbXBvbmVudCkge1xuICAgICAgaXRlbS5zZWxlY3RlZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdENsb3NlQWZ0ZXJTZWxlY3RQb3B1cEl0ZW0oaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGxldCBpdGVtOiBNZW51TmF2aWdhdGlvbkl0ZW1TdWJJdGVtfE1lbnVOYXZpZ2F0aW9uSXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcblxuICAgIHJldHVybiBpdGVtLnJvbGUgIT09ICdtZW51aXRlbWNoZWNrYm94JyAmJiBpdGVtLnJvbGUgIT09ICdtZW51aXRlbXJhZGlvJztcbiAgfVxuXG4gIG9wZW5NZW51KGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzT3BlbmVkID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW47XG4gICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4gPSB0cnVlO1xuICAgIGlmICh3YXNPcGVuZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVNZW51SXRlbShpdGVtSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTWVudShpdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaXRlbUluZGV4ICE9PSBudWxsICYmIGl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3BlbiA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lbnVEYXRhLmZvckVhY2goaXRlbSA9PiBpdGVtLm9wZW4gPSBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgaGFzUG9wdXBNZW51KGl0ZW1JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcbiAgICByZXR1cm4gaXRlbXNbaXRlbUluZGV4XS5zdWIgJiYgc3ViSXRlbXMgJiYgc3ViSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNQcmludGFibGVDaGFyKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPT09IDEgJiYgISFzdHIubWF0Y2goL1xcUy8pO1xuICB9XG5cbiAgXG5cbiAgLypcbiAgICogQ29tdW5lcyAtIGZvY3VzXG4gICAqL1xuXG4gIGZvY3VzSXRlbShpdGVtSW5kZXg6IG51bWJlciwgaG92ZXI/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRm9jdXMgPSB0aGlzLm1lbnVuYXZpZ2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgY29uc3QgaXNPcGVuID0gdGhpcy5tZW51RGF0YVt0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleF0ub3BlbjtcblxuICAgIGlmICghaG92ZXIgfHwgaGFzRm9jdXMpIHtcbiAgICAgIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5tZW51SXRlbS5saW5rLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgIGlmIChpc09wZW4gJiYgdGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4ID0gaXRlbUluZGV4O1xuICB9XG5cbiAgZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShmcm9tSXRlbUluZGV4OiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBuZXh0SXRlbSA9IGZyb21JdGVtSW5kZXg7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgZG8ge1xuICAgICAgbmV4dEl0ZW0gPSAobmV4dEl0ZW0gKyBpdGVtcy5sZW5ndGggKyBzdGVwKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICB9IHdoaWxlICghdGhpcy5pc0l0ZW1Gb2N1c2FibGUobmV4dEl0ZW0pICYmIG5leHRJdGVtICE9PSBmcm9tSXRlbUluZGV4KTtcblxuICAgIGlmIChuZXh0SXRlbSAhPT0gZnJvbUl0ZW1JbmRleCkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0obmV4dEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzRmlyc3RJdGVtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSXRlbUZvY3VzYWJsZSgwKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbSgwLCArMSk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNMYXN0SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBpZiAodGhpcy5pc0l0ZW1Gb2N1c2FibGUoaXRlbXMubGVuZ3RoIC0gMSkpIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZUl0ZW0oaXRlbXMubGVuZ3RoIC0gMSwgLTEpO1xuICAgIH1cbiAgfVxuXG4gIGlzSXRlbUZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5nZXRJdGVtcygpW2l0ZW1JbmRleF0uZGlzYWJsZWQ7XG4gIH1cblxuICBmb2N1c0l0ZW1CeUZpcnN0Q2hhcihjaGFyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtQ29udGVudHM6IHN0cmluZ1tdID0gdGhpcy5tZW51SXRlbXMubWFwKG1lbnVJdGVtID0+IG1lbnVJdGVtLml0ZW1Db250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50KTtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleDtcbiAgICBsZXQgZm91bmRJbmRleCA9IC0xO1xuICAgIGRvIHtcbiAgICAgIGluZGV4ID0gKGluZGV4ICsgaXRlbUNvbnRlbnRzLmxlbmd0aCArIDEpICUgaXRlbUNvbnRlbnRzLmxlbmd0aDtcbiAgICAgIGlmIChpdGVtQ29udGVudHNbaW5kZXhdICYmIGl0ZW1Db250ZW50c1tpbmRleF0udHJpbSgpLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpID09PSBjaGFyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAmJiB0aGlzLmlzSXRlbUZvY3VzYWJsZShpbmRleCkpIHtcbiAgICAgICAgZm91bmRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGZvdW5kSW5kZXggPT09IC0xICYmIGluZGV4ICE9PSB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCk7XG5cbiAgICBpZiAoZm91bmRJbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbShmb3VuZEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBmb2N1c1N1Ykl0ZW0oaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm1lbnVJdGVtLnBvcHVwTWVudUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1lbnVEYXRhSW5kZXggPSBzdWJJdGVtSW5kZXg7XG4gICAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViSXRlbUluZGV4ID0gc3ViSXRlbUluZGV4O1xuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1YlN1Ykl0ZW1JbmRleCA9IHN1YlN1Ykl0ZW1JbmRleDtcbiAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ucG9wdXBNZW51SXRlbXMudG9BcnJheSgpW21lbnVEYXRhSW5kZXhdLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbSkge1xuICAgICAgICBlbGVtLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzdWJpdGVtIHRvIGZvY3VzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHN1Yml0ZW1zJyk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXg6IG51bWJlciwgZnJvbUl0ZW1TdWJJbmRleDogbnVtYmVyLCBmcm9tSXRlbVN1YlN1YkluZGV4OiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBuZXh0U3ViSW5kZXggPSBmcm9tSXRlbVN1YkluZGV4O1xuICAgIGxldCBuZXh0U3ViU3ViSW5kZXggPSBmcm9tSXRlbVN1YlN1YkluZGV4O1xuICAgIGxldCBhbGxTdWJJdGVtc0NoZWNrZWQ7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbmV4dEluZGV4ZXMgPSB0aGlzLmdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCwgc3RlcCk7XG4gICAgICBuZXh0U3ViSW5kZXggPSBuZXh0SW5kZXhlcy5zdWJJbmRleDtcbiAgICAgIG5leHRTdWJTdWJJbmRleCA9IG5leHRJbmRleGVzLnN1YlN1YkluZGV4O1xuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKGZyb21JdGVtU3ViSW5kZXggPT09IG5leHRTdWJJbmRleCAmJiBmcm9tSXRlbVN1YlN1YkluZGV4ID09PSBuZXh0U3ViU3ViSW5kZXgpO1xuICAgIH0gd2hpbGUgKCF0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIG5leHRTdWJJbmRleCwgbmV4dFN1YlN1YkluZGV4KSAmJiAhYWxsU3ViSXRlbXNDaGVja2VkKTtcblxuICAgIGlmICghYWxsU3ViSXRlbXNDaGVja2VkKSB7XG4gICAgICB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIG5leHRTdWJJbmRleCwgbmV4dFN1YlN1YkluZGV4KTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0ZpcnN0U3ViSXRlbShpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBmaXJzdFN1YlN1Ykl0ZW0gPSBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgaWYgKHN1Ykl0ZW1zICYmIHN1Ykl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpcnN0U3ViU3ViSXRlbSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgMCwgZmlyc3RTdWJTdWJJdGVtKSkge1xuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCAwLCBmaXJzdFN1YlN1Ykl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCAwLCBmaXJzdFN1YlN1Ykl0ZW0sICsxKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0xhc3RTdWJJdGVtKGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcbiAgICBjb25zdCBsYXN0SXRlbUluZGV4ID0gc3ViSXRlbXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0SXRlbSA9IHN1Ykl0ZW1zW2xhc3RJdGVtSW5kZXhdO1xuICAgIGxldCBsYXN0U3ViU3ViSXRlbSA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5pc1N1Ykl0ZW1Gb2N1c2FibGUoaXRlbUluZGV4LCBsYXN0SXRlbUluZGV4LCBsYXN0U3ViU3ViSXRlbSkpIHtcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCBsYXN0SXRlbUluZGV4LCBsYXN0U3ViU3ViSXRlbSwgLTEpO1xuICAgIH1cbiAgfVxuXG4gIGlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgbGV0IGl0ZW06IE1lbnVOYXZpZ2F0aW9uSXRlbVN1Ykl0ZW18TWVudU5hdmlnYXRpb25JdGVtU3ViSXRlbVN1Ykl0ZW0gPSBzdWJJdGVtc1tzdWJJdGVtSW5kZXhdO1xuXG4gICAgbGV0IGlzRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgaWYgKGl0ZW0ucm9sZSAhPT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5yb2xlICE9PSAnbm9uZScpIHtcbiAgICAgIGlzRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRm9jdXNhYmxlO1xuICB9XG5cbiAgZm9jdXNTdWJJdGVtQnlGaXJzdENoYXIoaXRlbUluZGV4OiBudW1iZXIsIGNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1Db250ZW50czogc3RyaW5nW10gPSB0aGlzLm1lbnVJdGVtcy50b0FycmF5KClbaXRlbUluZGV4XS5wb3B1cE1lbnVJdGVtcy5tYXAobWVudUl0ZW0gPT4gbWVudUl0ZW0ubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgbGV0IHN1Ykl0ZW1JbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXg7XG4gICAgbGV0IHN1YlN1Ykl0ZW1JbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg7XG4gICAgbGV0IGZvdW5kU3ViSW5kZXggPSAtMTtcbiAgICBsZXQgZm91bmRTdWJTdWJJbmRleCA9IG51bGw7XG4gICAgbGV0IGFsbFN1Ykl0ZW1zQ2hlY2tlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gdGhpcy5nZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgsICsxKTtcbiAgICAgIHN1Ykl0ZW1JbmRleCA9IG5leHRJbmRleGVzLnN1YkluZGV4O1xuICAgICAgc3ViU3ViSXRlbUluZGV4ID0gbmV4dEluZGV4ZXMuc3ViU3ViSW5kZXg7XG4gICAgICBjb25zdCBpbmRleCA9IHN1Ykl0ZW1JbmRleDtcbiAgICAgIGlmIChpdGVtQ29udGVudHNbaW5kZXhdICYmIGl0ZW1Db250ZW50c1tpbmRleF0udHJpbSgpLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpID09PSBjaGFyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAmJiB0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KSkge1xuICAgICAgICBmb3VuZFN1YkluZGV4ID0gc3ViSXRlbUluZGV4O1xuICAgICAgICBmb3VuZFN1YlN1YkluZGV4ID0gc3ViU3ViSXRlbUluZGV4O1xuICAgICAgfVxuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXggPT09IHN1Ykl0ZW1JbmRleFxuICAgICAgICAmJiB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4ID09PSBzdWJTdWJJdGVtSW5kZXgpO1xuICAgIH0gd2hpbGUgKGZvdW5kU3ViSW5kZXggPT09IC0xICYmICFhbGxTdWJJdGVtc0NoZWNrZWQpO1xuXG4gICAgaWYgKGZvdW5kU3ViSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCBmb3VuZFN1YkluZGV4LCBmb3VuZFN1YlN1YkluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBNZXRvZG9zIHBhcmEgZmFjaWxpdGFyIGNvbnRlbmlkb1xuICAgKi9cblxuICBnZXRJdGVtcygpOiBNZW51TmF2aWdhdGlvbkl0ZW1bXXxNZW51TmF2aWdhdGlvbkl0ZW1Db21wb25lbnRbXSB7XG4gICAgbGV0IGl0ZW1zO1xuICAgIGlmICh0aGlzLml0ZW1Db21wb25lbnRMaXN0ICYmIHRoaXMuaXRlbUNvbXBvbmVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMgPSB0aGlzLml0ZW1Db21wb25lbnRMaXN0LnRvQXJyYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBnZXRJdGVtU3ViaXRlbXMoaXRlbTogTWVudU5hdmlnYXRpb25JdGVtfE1lbnVOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCk6IE1lbnVOYXZpZ2F0aW9uSXRlbVN1Ykl0ZW1bXXxNZW51TmF2aWdhdGlvblN1Yml0ZW1Db21wb25lbnRbXSB7XG4gICAgbGV0IHN1Ykl0ZW1zID0gW107XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51TmF2aWdhdGlvbkl0ZW1Db21wb25lbnQpe1xuICAgICAgc3ViSXRlbXMgPSBpdGVtLmdldFN1Ykl0ZW1zKCk7XG4gICAgfVxuXG4gICAgaWYgKCFzdWJJdGVtcyB8fCBzdWJJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN1Ykl0ZW1zID0gaXRlbS5zdWIgPyBpdGVtLnN1Yi5pdGVtcyA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gc3ViSXRlbXM7XG4gIH1cblxuICBnZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgbmV4dFN1YkluZGV4LCBuZXh0U3ViU3ViSW5kZXgsIHN0ZXApOiB7IHN1YkluZGV4OiBudW1iZXIsIHN1YlN1YkluZGV4PzogbnVtYmVyfSB7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcblxuICAgIGxldCBjaGVja05leHRTdWJJdGVtID0gdHJ1ZTtcbiAgICBpZiAoY2hlY2tOZXh0U3ViSXRlbSkge1xuICAgICAgbmV4dFN1YkluZGV4ID0gKG5leHRTdWJJbmRleCArIHN0ZXAgKyBzdWJJdGVtcy5sZW5ndGgpICUgc3ViSXRlbXMubGVuZ3RoO1xuICAgIH0gIFxuICAgIHJldHVybiB7c3ViSW5kZXg6IG5leHRTdWJJbmRleCwgc3ViU3ViSW5kZXg6IG5leHRTdWJTdWJJbmRleH07XG4gIH1cblxuICBnZXRJZFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkUHJlZml4ID8gdGhpcy5pZFByZWZpeCA6IHRoaXMuaWQgKyAnbWVudW5hdmlnYXRpb24taXRlbSc7XG4gIH1cblxuICBnZXRJdGVtSWQoaXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLmlkKSB7XG4gICAgICAgIGlkID0gaXRlbS5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gaW5kZXggPT09IDAgPyB0aGlzLmdldElkUHJlZml4KCkgOiBgJHt0aGlzLmdldElkUHJlZml4KCl9LSR7aW5kZXh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgZ2V0UG9wdXBTdHlsZShpdGVtSW5kZXg6IG51bWJlcik6IG9iamVjdCB7XG4gICAgbGV0IHN0eWxlID0ge307XG4gICAgaWYgKHRoaXMubWVudURhdGEgJiYgaXRlbUluZGV4IDwgdGhpcy5tZW51RGF0YS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm1lbnVJdGVtO1xuICAgICAgY29uc3QgcmVjdCA9IG1lbnVJdGVtLmxpbmsubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3Blbikge1xuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3A6ICcwcHgnLFxuICAgICAgICAgIGxlZnQ6ICcwcHgnLFxuICAgICAgICAgIHpJbmRleDogMTAwLFxuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIHpJbmRleDogMCxcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBnZXRTdWJJdGVtSWQoaXRlbSwgaW5kZXg6IG51bWJlciwgcGFyZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLmlkKSB7XG4gICAgICAgIGlkID0gaXRlbS5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gaW5kZXggPT09IDAgPyBgc3ViLSR7cGFyZW50SWR9YCA6IGBzdWItJHtwYXJlbnRJZH0tJHtpbmRleH1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cbiAgXG59XG4iLCI8dWwgI21lbnVuYXZpZ2F0aW9uIFtpZF09XCJpZCArICctbWVudS1uYXZpZ2F0aW9uJ1wiIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLWJhc2VcIlxuKGZvY3VzaW4pPVwiaGFuZGxlTWVudUZvY3VzSW4oKVwiXG4oZm9jdXNvdXQpPVwiaGFuZGxlTWVudUZvY3VzT3V0KCRldmVudClcIlxuW25nQ2xhc3NdPVwieyAnZm9jdXMnOiBpc0ZvY3VzZWQgfVwiXG5bYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCA/IGFyaWFMYWJlbCA6IG51bGxcIj5cbjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SXRlbXMoKTsgaW5kZXggYXMgaXRlbUluZGV4XCI+XG48bGkgY2xhc3M9XCJyZWxhdGl2ZVwiIHJvbGU9XCJub25lXCIgZGVzeU1lbnViYXJpdGVtIChjb250ZW50Q2hhbmdlZCk9XCJjaGVja0NoYW5nZXMoKVwiPlxuICA8YSAqbmdJZj1cIml0ZW0uaHJlZlwiICNsaW5rXG4gICAgIChjbGljayk9XCJoYW5kbGVNZW51SXRlbUNsaWNrKCRldmVudCwgaXRlbUluZGV4KVwiXG4gICAgICAoa2V5ZG93bik9XCJoYW5kbGVNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgpXCJcbiAgICAgIChtb3VzZW92ZXIpPVwiaGFuZGxlTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4KVwiXG4gICAgICAoZGVzeUF0dHJpYnV0ZUNoYW5nZSk9XCJjaGVja0NoYW5nZXMoKVwiIFthdHRyaWJ1dGVzVG9DaGVja109XCInZGlzYWJsZWQnXCJcbiAgICAgIHJvbGU9XCJpdGVtLmRpc2FibGVkID8gbGluayA6IG51bGxcIlxuICAgICAgW2lkXT1cImdldEl0ZW1JZChpdGVtLCBpdGVtSW5kZXgpXCJcbiAgICAgIFt0YXJnZXRdPVwiaXRlbS50YXJnZXRcIlxuICAgICAgW2hyZWZdPVwiaXRlbS5ocmVmXCJcbiAgICAgIFtjbGFzc109XCJbJ2MtbWVudS1uYXZpZ2F0aW9uX19idXR0b24nLCBpdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0tZGlzYWJsZWQnOiBpdGVtLmRpc2FibGVkLCAnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0tcHJpbWFyeSc6IGl0ZW0uYWN0aXZlLCAnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0taGFzLXNlbGVjdGlvbic6IGl0ZW0uYWN0aXZlfVwiXG4gICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IChpdGVtLmFyaWFEaXNhYmxlZCA/IGl0ZW0uYXJpYURpc2FibGVkIDogbnVsbClcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpdGVtLmFyaWFEZXNjcmliZWRCeSA/IGl0ZW0uYXJpYURlc2NyaWJlZEJ5IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaXRlbS5hcmlhTGFiZWxsZWRCeSA/IGl0ZW0uYXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIml0ZW0uYXJpYUhpZGRlbiA/IGl0ZW0uYXJpYUhpZGRlbiA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpdGVtLmFyaWFDb250cm9scyA/IGl0ZW0uYXJpYUNvbnRyb2xzIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXRlbS5kaXNhYmxlZCA/ICdwYWdlJyA6IChpdGVtLmFyaWFDdXJyZW50ID8gaXRlbS5hcmlhQ3VycmVudCA6IG51bGwpXCJcbiAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJpdGVtLmFyaWFMaXZlID8gaXRlbS5hcmlhTGl2ZSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwiaXRlbS5hcmlhRXJyb3JNZXNzYWdlID8gaXRlbS5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLW1vZGFsXT1cIml0ZW0uYXJpYU1vZGFsID8gaXRlbS5hcmlhTW9kYWwgOiBudWxsXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIml0ZW0uZGlzYWJsZWQgPyAtMSA6IChpdGVtSW5kZXggPT09IGN1cnJlbnRGb2N1c0l0ZW1JbmRleCA/IDAgOiAtMSlcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggc2VsZi1jZW50ZXIgbWF4LXcteHMgYWxpZ24tbWlkZGxlIHRydW5jYXRlIHBvaW50ZXItZXZlbnRzLW5vbmVcIiAjaXRlbUNvbnRlbnRXcmFwcGVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogaXRlbSwgaHRtbDogaXRlbS5odG1sLCB0ZXh0OiBpdGVtLnRleHR9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+ICAgICAgICAgIFxuICA8L2E+XG4gIDxidXR0b24gKm5nSWY9XCIhaXRlbS5ocmVmXCIgI2xpbmsgI2l0ZW1Db250ZW50V3JhcHBlclxuICAgICAoY2xpY2spPVwiaGFuZGxlTWVudUl0ZW1DbGljaygkZXZlbnQsIGl0ZW1JbmRleClcIlxuICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWVudUl0ZW1LZXlkb3duKCRldmVudCwgaXRlbUluZGV4KVwiXG4gICAgICAobW91c2VvdmVyKT1cImhhbmRsZU1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleClcIlxuICAgICAgKGRlc3lBdHRyaWJ1dGVDaGFuZ2UpPVwiY2hlY2tDaGFuZ2VzKClcIiBbYXR0cmlidXRlc1RvQ2hlY2tdPVwiJ2Rpc2FibGVkJ1wiXG4gICAgICBhcmlhLWV4cGFuZGVkPVwiaXRlbS5zdWIgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgYXJpYS1jb250cm9scz1cIml0ZW0uc3ViID8gaWQgKyAnLXN1Yi1saXN0JyA6ICcnXCJcbiAgICAgIFtjbGFzc109XCJbJ2MtbWVudS1uYXZpZ2F0aW9uX19idXR0b24nLCBpdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0tZGlzYWJsZWQnOiBpdGVtLmRpc2FibGVkLCAnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0tcHJpbWFyeSc6IGl0ZW0uYWN0aXZlLCAnYy1tZW51LW5hdmlnYXRpb25fX2J1dHRvbi0taGFzLXNlbGVjdGlvbic6IGl0ZW0uYWN0aXZlfVwiXG4gICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkID8gaXRlbS5kaXNhYmxlZCA6IChpdGVtLmFyaWFEaXNhYmxlZCA/IGl0ZW0uYXJpYURpc2FibGVkIDogbnVsbClcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpdGVtLmFyaWFEZXNjcmliZWRCeSA/IGl0ZW0uYXJpYURlc2NyaWJlZEJ5IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaXRlbS5hcmlhTGFiZWxsZWRCeSA/IGl0ZW0uYXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIml0ZW0uYXJpYUhpZGRlbiA/IGl0ZW0uYXJpYUhpZGRlbiA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpdGVtLmFyaWFDb250cm9scyA/IGl0ZW0uYXJpYUNvbnRyb2xzIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXRlbS5hcmlhQ3VycmVudCA/IGl0ZW0uYXJpYUN1cnJlbnQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJpdGVtLmFyaWFMaXZlID8gaXRlbS5hcmlhTGl2ZSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwiaXRlbS5hcmlhRXJyb3JNZXNzYWdlID8gaXRlbS5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLW1vZGFsXT1cIml0ZW0uYXJpYU1vZGFsID8gaXRlbS5hcmlhTW9kYWwgOiBudWxsXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIml0ZW0uZGlzYWJsZWQgPyAtMSA6IChpdGVtSW5kZXggPT09IGN1cnJlbnRGb2N1c0l0ZW1JbmRleCA/IDAgOiAtMSlcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uYWN0aXZlXCIgY2xhc3M9XCJzci1vbmx5XCI+SXRlbSBhY3Rpdm86IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlubGluZS1mbGV4IHNlbGYtY2VudGVyIG1heC13LXhzIGFsaWduLW1pZGRsZSB0cnVuY2F0ZSBwb2ludGVyLWV2ZW50cy1ub25lXCIgI2l0ZW1Db250ZW50V3JhcHBlcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBpdGVtLCBodG1sOiBpdGVtLmh0bWwsIHRleHQ6IGl0ZW0udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbS5zdWJcIiBjbGFzcz1cImlubGluZS1ibG9jayAtbXItMiAgYWxpZ24tbWlkZGxlIC1teS1weCBwb2ludGVyLWV2ZW50cy1ub25lXCIgdmlld0JveD1cIjAgMCA5NiA5NlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmb2N1c2FibGU9XCJmYWxzZVwiIHdpZHRoPVwiMS41ZW1cIiBoZWlnaHQ9XCIxLjVlbVwiPjxnPjxwYXRoIGQ9XCJNNDYuNzEgNTguMDM3YTEuODIzIDEuODIzIDAgMDAyLjU4MSAwTDYyLjA0OCA0NS4yOGExLjgyMyAxLjgyMyAwIDAwLTEuMjktMy4xMTNIMzUuMjQzYTEuODIzIDEuODIzIDAgMDAtMS4yOTEgMy4xMTN6XCIvPjwvZz48L3N2Zz5cbiAgPC9idXR0b24+ICAgICAgICBcblxuICA8ZGl2ICpuZ0lmPVwiaXRlbS5zdWIgJiYgZ2V0SXRlbVN1Yml0ZW1zKGl0ZW0pXCIgY2xhc3M9XCJjLW1lbnUtbmF2aWdhdGlvbl9fc3ViIGFic29sdXRlIGJvdHRvbS0wIGxlZnQtMFwiPlxuICAgICAgPHVsICBbaWRdPVwiaWQgKyAnLXN1Yi1saXN0J1wiIFtuZ1N0eWxlXT1cImdldFBvcHVwU3R5bGUoaXRlbUluZGV4KVwiICNwb3B1cE1lbnUgcm9sZT1cIm1lbnVcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgIFtjbGFzc109XCJpdGVtLnN1Yi5jbGFzc2VzID8gaXRlbS5zdWIuY2xhc3NlcyA6ICdjLW1lbnUtbmF2aWdhdGlvbl9fdG9vbHRpcCB3LW1heCBtYXgtdy02NCBib3JkZXIgYm9yZGVyLW5ldXRyYWwtYmFzZSBzaGFkb3ctbWQgYmctd2hpdGUgdGV4dC1zbSdcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbCA/IGl0ZW0uYXJpYUxhYmVsIDogKGl0ZW0uc3ViLmFyaWFMYWJlbCA/IGl0ZW0uc3ViLmFyaWFMYWJlbCA6IG51bGwpXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaXRlbS5zdWIuYXJpYURlc2NyaWJlZEJ5ID8gaXRlbS5zdWIuYXJpYURlc2NyaWJlZEJ5IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaXRlbS5zdWIuYXJpYUxhYmVsbGVkQnkgPyBpdGVtLnN1Yi5hcmlhTGFiZWxsZWRCeSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXRlbS5zdWIuYXJpYUhpZGRlbiA/IGl0ZW0uc3ViLmFyaWFIaWRkZW4gOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXRlbS5zdWIuYXJpYURpc2FibGVkID8gaXRlbS5zdWIuYXJpYURpc2FibGVkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIml0ZW0uc3ViLmFyaWFDb250cm9scyA/IGl0ZW0uc3ViLmFyaWFDb250cm9scyA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cIml0ZW0uc3ViLmFyaWFDdXJyZW50ID8gaXRlbS5zdWIuYXJpYUN1cnJlbnQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJpdGVtLnN1Yi5hcmlhTGl2ZSA/IGl0ZW0uc3ViLmFyaWFMaXZlIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiEhKG1lbnVEYXRhICYmIG1lbnVEYXRhW2l0ZW1JbmRleF0ub3BlbilcIlxuICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwiaXRlbS5zdWIuYXJpYUVycm9yTWVzc2FnZSA/IGl0ZW0uc3ViLmFyaWFFcnJvck1lc3NhZ2UgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiaXRlbS5zdWIuYXJpYUhhc1BvcHVwID8gaXRlbS5zdWIuYXJpYUhhc1BvcHVwIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLW1vZGFsXT1cIml0ZW0uc3ViLmFyaWFNb2RhbCA/IGl0ZW0uc3ViLmFyaWFNb2RhbCA6IG51bGxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBnZXRJdGVtU3ViaXRlbXMoaXRlbSk7IGluZGV4IGFzIHN1Ykl0ZW1JbmRleFwiPlx0XHRcdFx0XG4gICAgICAgICAgICA8bGkgI3BvcHVwTWVudUl0ZW0gKm5nSWY9XCJzdWJJdGVtLmhyZWZcIiByb2xlPVwibm9uZVwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb2N1czpiZy1wcmltYXJ5LWJhc2UgZm9jdXM6dGV4dC13aGl0ZSBmb2N1czpvdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJnZXRTdWJJdGVtSWQoc3ViSXRlbSwgc3ViSXRlbUluZGV4LCBnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KSlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVQb3B1cE1lbnVJdGVtS2V5ZG93bigkZXZlbnQsIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1Ykl0ZW0uYWN0aXZlXCIgaWQ9XCJzdWJJdGVtLmlkXCIgI2l0ZW1Db250ZW50V3JhcHBlciBcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ2ZsZXggaXRlbXMtY2VudGVyIHB4LWJhc2UgcHktc20gdGV4dC1zbSBmb250LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXByaW1hcnktYmFzZSBob3Zlcjp0ZXh0LXdoaXRlJywgc3ViSXRlbS5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiIFxuICAgICAgICAgICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXRlbS5hcmlhTGFiZWwgPyBpdGVtLmFyaWFMYWJlbCA6IChzdWJJdGVtLmFyaWFMYWJlbCA/IHN1Ykl0ZW0uYXJpYUxhYmVsIDogbnVsbClcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzdWJJdGVtLmFyaWFEZXNjcmliZWRCeSA/IHN1Ykl0ZW0uYXJpYURlc2NyaWJlZEJ5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwic3ViSXRlbS5hcmlhTGFiZWxsZWRCeSA/IHN1Ykl0ZW0uYXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cInN1Ykl0ZW0uYXJpYUhpZGRlbiA/IHN1Ykl0ZW0uYXJpYUhpZGRlbiA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJzdWJJdGVtLmFyaWFEaXNhYmxlZCA/IHN1Ykl0ZW0uYXJpYURpc2FibGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInN1Ykl0ZW0uYXJpYUNvbnRyb2xzID8gc3ViSXRlbS5hcmlhQ29udHJvbHMgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJzdWJJdGVtLmFyaWFDdXJyZW50ID8gc3ViSXRlbS5hcmlhQ3VycmVudCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1saXZlXT1cInN1Ykl0ZW0uYXJpYUxpdmUgPyBzdWJJdGVtLmFyaWFMaXZlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiEhKG1lbnVEYXRhICYmIG1lbnVEYXRhW3N1Ykl0ZW1JbmRleF0ub3BlbilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwic3ViSXRlbS5hcmlhRXJyb3JNZXNzYWdlID8gc3ViSXRlbS5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInN1Ykl0ZW0uYXJpYUhhc1BvcHVwID8gc3ViSXRlbS5hcmlhSGFzUG9wdXAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbW9kYWxdPVwic3ViSXRlbS5hcmlhTW9kYWwgPyBzdWJJdGVtLmFyaWFNb2RhbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlUG9wdXBNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IHN1Ykl0ZW0sIGh0bWw6IHN1Ykl0ZW0uaHRtbCwgdGV4dDogc3ViSXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8YSAqbmdJZj1cIiFzdWJJdGVtLmFjdGl2ZVwiICNpdGVtQ29udGVudFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgIFtocmVmXT1cInN1Ykl0ZW0uaHJlZlwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUG9wdXBNZW51SXRlbUNsaWNrKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVBvcHVwTWVudUl0ZW1LZXlkb3duKCRldmVudCwgaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChkZXN5QXR0cmlidXRlQ2hhbmdlKT1cImNoZWNrQ2hhbmdlcygpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ2ZsZXggaXRlbXMtY2VudGVyIHB4LWJhc2UgcHktc20gdGV4dC1zbSBob3ZlcjpiZy1wcmltYXJ5LWJhc2UgaG92ZXI6dGV4dC13aGl0ZSBmb2N1czpiZy13YXJuaW5nLWJhc2UgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnNoYWRvdy1vdXRsaW5lLWZvY3VzIGZvY3VzOnRleHQtYmxhY2snLCBzdWJJdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncG9pbnRlci1ldmVudHMtbm9uZSc6IHN1Ykl0ZW0uZGlzYWJsZWR9XCJcbiAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzdWJJdGVtLmRpc2FibGVkID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFt0YXJnZXRdID0gXCJzdWJJdGVtLnRhcmdldFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBzZWxmLWNlbnRlciBtYXgtdy14cyBhbGlnbi1taWRkbGUgdHJ1bmNhdGVcIiAjaXRlbUNvbnRlbnRXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogc3ViSXRlbSwgaHRtbDogc3ViSXRlbS5odG1sLCB0ZXh0OiBzdWJJdGVtLnRleHR9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwic3ViSXRlbS5kaXNhYmxlZFwiIHZpZXdCb3g9XCIwIDAgMTQwIDE0MFwiIGhlaWdodD1cIjFlbVwiIHdpZHRoPVwiMWVtXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiaW5saW5lLWJsb2NrIGFsaWduLW1pZGRsZSBtbC1zbSB0ZXh0LW5ldXRyYWwtYmFzZSBmaWxsLWN1cnJlbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiID48cGF0aCBkPVwiTTcwIDBhNzAgNzAgMCAxMDcwIDcwQTcwLjA4IDcwLjA4IDAgMDA3MCAwek0yMCA3MGE1MCA1MCAwIDAxNzQuOC00My40IDIuNTEgMi41MSAwIDAxMS4yMyAxLjg0IDIuNDggMi40OCAwIDAxLS43MSAyLjFMMzAuNTQgOTUuMzJhMi41MSAyLjUxIDAgMDEtMy45NC0uNTJBNDkuNjMgNDkuNjMgMCAwMTIwIDcwem0xMDAgMGE1MCA1MCAwIDAxLTc0LjggNDMuNCAyLjUxIDIuNTEgMCAwMS0xLjIzLTEuODQgMi40OCAyLjQ4IDAgMDEuNzEtMi4xbDY0Ljc4LTY0Ljc4YTIuNTEgMi41MSAwIDAxMy45NC41MkE0OS42MyA0OS42MyAwIDAxMTIwIDcwelwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAjcG9wdXBNZW51SXRlbSAqbmdJZj1cIiFzdWJJdGVtLmhyZWZcIiByb2xlPVwibm9uZVwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJnZXRTdWJJdGVtSWQoc3ViSXRlbSwgc3ViSXRlbUluZGV4LCBnZXRJdGVtSWQoaXRlbSwgaXRlbUluZGV4KSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9jdXM6YmctcHJpbWFyeS1iYXNlIGZvY3VzOnRleHQtd2hpdGUgZm9jdXM6b3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUG9wdXBNZW51SXRlbUNsaWNrKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJoYW5kbGVQb3B1cE1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlUG9wdXBNZW51SXRlbUtleWRvd24oJGV2ZW50LCBpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaWRdPVwiZ2V0U3ViSXRlbUlkKHN1Ykl0ZW0sIHN1Ykl0ZW1JbmRleCwgZ2V0SXRlbUlkKGl0ZW0sIHN1Ykl0ZW1JbmRleCkpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtYmFzZSBweS1zbSB0ZXh0LXNtIGN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXByaW1hcnktYmFzZSBob3Zlcjp0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZm9udC1ib2xkJzogc3ViSXRlbS5hY3RpdmUsICdwb2ludGVyLWV2ZW50cy1ub25lJzogc3ViSXRlbS5kaXNhYmxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IHN1Ykl0ZW0sIGh0bWw6IHN1Ykl0ZW0uaHRtbCwgdGV4dDogc3ViSXRlbS50ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInN1Ykl0ZW0uZGlzYWJsZWRcIiB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiBoZWlnaHQ9XCIxZW1cIiB3aWR0aD1cIjFlbVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImlubGluZS1ibG9jayBhbGlnbi1taWRkbGUgbWwtc20gdGV4dC1uZXV0cmFsLWJhc2UgZmlsbC1jdXJyZW50XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiA+PHBhdGggZD1cIk03MCAwYTcwIDcwIDAgMTA3MCA3MEE3MC4wOCA3MC4wOCAwIDAwNzAgMHpNMjAgNzBhNTAgNTAgMCAwMTc0LjgtNDMuNCAyLjUxIDIuNTEgMCAwMTEuMjMgMS44NCAyLjQ4IDIuNDggMCAwMS0uNzEgMi4xTDMwLjU0IDk1LjMyYTIuNTEgMi41MSAwIDAxLTMuOTQtLjUyQTQ5LjYzIDQ5LjYzIDAgMDEyMCA3MHptMTAwIDBhNTAgNTAgMCAwMS03NC44IDQzLjQgMi41MSAyLjUxIDAgMDEtMS4yMy0xLjg0IDIuNDggMi40OCAwIDAxLjcxLTIuMWw2NC43OC02NC43OGEyLjUxIDIuNTEgMCAwMTMuOTQuNTJBNDkuNjMgNDkuNjMgMCAwMTEyMCA3MHpcIi8+PC9zdmc+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJzdWJJdGVtLmRpdmlkZXJcIiBjbGFzcz1cIm15LXNtIGJvcmRlci1iIGJvcmRlci1uZXV0cmFsLWJhc2VcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNyLW9ubHlcIj5TZXBhcmFkb3I8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9saT5cbjxsaSAjcG9wdXBNZW51SXRlbSAqbmdJZj1cIml0ZW0uZGl2aWRlclwiIGNsYXNzPVwiaXRlbS5kaXZpZGVyLmNsYXNzZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBpdGVtLmRpdmlkZXIsIGh0bWw6IGl0ZW0uZGl2aWRlci5odG1sLCB0ZXh0OiBpdGVtLmRpdmlkZXIudGV4dH1cIj48L25nLWNvbnRhaW5lcj5cbjwvbGk+XG48L25nLWNvbnRhaW5lcj5cbjwvdWw+XG4iXX0=