desy-angular 14.2.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/desy-angular.mjs +1290 -821
  3. package/fesm2022/desy-angular.mjs.map +1 -1
  4. package/index.d.ts +3 -0
  5. package/lib/desy-forms/components/character-count/character-count.component.d.ts +1 -8
  6. package/lib/desy-forms/components/checkboxes/checkboxes-parent.component.d.ts +8 -0
  7. package/lib/desy-forms/components/checkboxes/checkboxes.component.d.ts +26 -0
  8. package/lib/desy-forms/components/date-input/date-input.component.d.ts +13 -7
  9. package/lib/desy-forms/components/datepicker/datepicker.component.d.ts +1 -5
  10. package/lib/desy-forms/components/fieldset/fieldset.component.d.ts +7 -0
  11. package/lib/desy-forms/components/file-upload/file-upload.component.d.ts +5 -0
  12. package/lib/desy-forms/components/input/input.component.d.ts +1 -4
  13. package/lib/desy-forms/components/input-group/input-group.component.d.ts +7 -0
  14. package/lib/desy-forms/components/label/label.component.d.ts +1 -2
  15. package/lib/desy-forms/components/radios/radios-parent.component.d.ts +8 -0
  16. package/lib/desy-forms/components/radios/radios.component.d.ts +26 -0
  17. package/lib/desy-forms/components/search-bar/search-bar.component.d.ts +1 -2
  18. package/lib/desy-forms/components/select/option/option.component.d.ts +1 -2
  19. package/lib/desy-forms/components/textarea/textarea.component.d.ts +1 -3
  20. package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +4 -0
  21. package/lib/desy-forms/components/tree/tree.component.d.ts +62 -2
  22. package/lib/desy-forms/directives/condition.directive.d.ts +5 -0
  23. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.d.ts +7 -0
  24. package/lib/desy-nav/components/menubar/menubar.component.d.ts +7 -0
  25. package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +55 -0
  26. package/lib/desy-tables/directives/cell.directive.d.ts +3 -0
  27. package/lib/desy-tables/directives/row.directive.d.ts +7 -0
  28. package/lib/shared/components/accessibility/accessibility.component.d.ts +3 -0
  29. package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +8 -0
  30. package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +6 -0
  31. package/lib/shared/components/content-base/content-base.component.d.ts +3 -0
  32. package/lib/shared/components/text-or-html-required/text-or-html-required.component.d.ts +4 -0
  33. package/lib/shared/decorators/desy-content-child.decorator.d.ts +11 -0
  34. package/lib/shared/decorators/desy-on-input-change.decorator.d.ts +4 -0
  35. package/lib/shared/directives/content-change.directive.d.ts +4 -0
  36. package/lib/shared/directives/custom-inner-content.directive.d.ts +6 -0
  37. package/lib/shared/pipes/external-href.pipe.d.ts +4 -0
  38. package/lib/shared/utils/search-utils.d.ts +10 -0
  39. package/lib/shared/utils/string-utils.d.ts +7 -0
  40. package/package.json +9 -11
  41. package/esm2022/desy-angular.mjs +0 -2
  42. package/esm2022/lib/desy-angular.module.mjs +0 -76
  43. package/esm2022/lib/desy-buttons/components/button/button.component.mjs +0 -118
  44. package/esm2022/lib/desy-buttons/components/button-loader/button-loader.component.mjs +0 -66
  45. package/esm2022/lib/desy-buttons/components/dropdown/dropdown.component.mjs +0 -159
  46. package/esm2022/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +0 -39
  47. package/esm2022/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.mjs +0 -14
  48. package/esm2022/lib/desy-buttons/components/listbox/listbox.component.mjs +0 -334
  49. package/esm2022/lib/desy-buttons/components/pill/pill.component.mjs +0 -83
  50. package/esm2022/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.mjs +0 -17
  51. package/esm2022/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.mjs +0 -17
  52. package/esm2022/lib/desy-buttons/components/toggle/toggle.component.mjs +0 -62
  53. package/esm2022/lib/desy-buttons/desy-buttons.module.mjs +0 -70
  54. package/esm2022/lib/desy-buttons/interfaces/listbox-item-data.mjs +0 -2
  55. package/esm2022/lib/desy-buttons/interfaces/listbox-label-data.mjs +0 -2
  56. package/esm2022/lib/desy-commons/components/content/content.component.mjs +0 -14
  57. package/esm2022/lib/desy-commons/components/description/description.component.mjs +0 -19
  58. package/esm2022/lib/desy-commons/components/divider/divider.component.mjs +0 -16
  59. package/esm2022/lib/desy-commons/components/icon/icon.component.mjs +0 -16
  60. package/esm2022/lib/desy-commons/components/title/title.component.mjs +0 -17
  61. package/esm2022/lib/desy-commons/desy-commons.module.mjs +0 -24
  62. package/esm2022/lib/desy-commons/interfaces/content-data.mjs +0 -2
  63. package/esm2022/lib/desy-commons/interfaces/description-data.mjs +0 -2
  64. package/esm2022/lib/desy-commons/interfaces/divider-data.mjs +0 -2
  65. package/esm2022/lib/desy-commons/interfaces/icon-data.mjs +0 -2
  66. package/esm2022/lib/desy-commons/interfaces/index.mjs +0 -6
  67. package/esm2022/lib/desy-commons/interfaces/title-data.mjs +0 -2
  68. package/esm2022/lib/desy-forms/components/character-count/character-count.component.mjs +0 -156
  69. package/esm2022/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +0 -191
  70. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes-parent.component.mjs +0 -15
  71. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +0 -275
  72. package/esm2022/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.mjs +0 -55
  73. package/esm2022/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.mjs +0 -19
  74. package/esm2022/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.mjs +0 -42
  75. package/esm2022/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.mjs +0 -55
  76. package/esm2022/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.mjs +0 -51
  77. package/esm2022/lib/desy-forms/components/date-input/date-input.component.mjs +0 -303
  78. package/esm2022/lib/desy-forms/components/datepicker/datepicker.component.mjs +0 -190
  79. package/esm2022/lib/desy-forms/components/datepicker/datepicker.pipe.mjs +0 -34
  80. package/esm2022/lib/desy-forms/components/error-message/error-message.component.mjs +0 -32
  81. package/esm2022/lib/desy-forms/components/fieldset/fieldset.component.mjs +0 -59
  82. package/esm2022/lib/desy-forms/components/fieldset/legend/legend.component.mjs +0 -34
  83. package/esm2022/lib/desy-forms/components/file-upload/file-upload.component.mjs +0 -78
  84. package/esm2022/lib/desy-forms/components/form-field/form-field.component.mjs +0 -127
  85. package/esm2022/lib/desy-forms/components/hint/hint.component.mjs +0 -30
  86. package/esm2022/lib/desy-forms/components/input/input.component.mjs +0 -110
  87. package/esm2022/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.mjs +0 -20
  88. package/esm2022/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.mjs +0 -59
  89. package/esm2022/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.mjs +0 -42
  90. package/esm2022/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.mjs +0 -51
  91. package/esm2022/lib/desy-forms/components/input-group/input-group.component.mjs +0 -232
  92. package/esm2022/lib/desy-forms/components/label/label.component.mjs +0 -39
  93. package/esm2022/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +0 -138
  94. package/esm2022/lib/desy-forms/components/radios/radios-parent.component.mjs +0 -15
  95. package/esm2022/lib/desy-forms/components/radios/radios.component.mjs +0 -286
  96. package/esm2022/lib/desy-forms/components/search-bar/search-bar.component.mjs +0 -65
  97. package/esm2022/lib/desy-forms/components/select/option/option.component.mjs +0 -22
  98. package/esm2022/lib/desy-forms/components/select/option-group/option-group.component.mjs +0 -18
  99. package/esm2022/lib/desy-forms/components/select/select-item/select-item.component.mjs +0 -14
  100. package/esm2022/lib/desy-forms/components/select/select.component.mjs +0 -94
  101. package/esm2022/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.mjs +0 -12
  102. package/esm2022/lib/desy-forms/components/textarea/textarea.component.mjs +0 -86
  103. package/esm2022/lib/desy-forms/components/tree/interfaces/itree-item.mjs +0 -3
  104. package/esm2022/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.mjs +0 -2
  105. package/esm2022/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +0 -174
  106. package/esm2022/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +0 -381
  107. package/esm2022/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.mjs +0 -25
  108. package/esm2022/lib/desy-forms/components/tree/tree-sub/tree-sub.component.mjs +0 -16
  109. package/esm2022/lib/desy-forms/components/tree/tree.component.mjs +0 -362
  110. package/esm2022/lib/desy-forms/desy-forms.module.mjs +0 -223
  111. package/esm2022/lib/desy-forms/directives/condition.directive.mjs +0 -34
  112. package/esm2022/lib/desy-forms/interfaces/error-message-data.mjs +0 -2
  113. package/esm2022/lib/desy-forms/interfaces/fieldset-data.mjs +0 -2
  114. package/esm2022/lib/desy-forms/interfaces/hint-data.mjs +0 -2
  115. package/esm2022/lib/desy-forms/interfaces/index.mjs +0 -13
  116. package/esm2022/lib/desy-forms/interfaces/item-checkbox-data.mjs +0 -2
  117. package/esm2022/lib/desy-forms/interfaces/item-date-input-data.mjs +0 -2
  118. package/esm2022/lib/desy-forms/interfaces/item-divider-date-input-data.mjs +0 -2
  119. package/esm2022/lib/desy-forms/interfaces/item-divider-input-group-data.mjs +0 -2
  120. package/esm2022/lib/desy-forms/interfaces/item-input-group-data.mjs +0 -2
  121. package/esm2022/lib/desy-forms/interfaces/item-radio-data.mjs +0 -2
  122. package/esm2022/lib/desy-forms/interfaces/item-radio-with-template-data.mjs +0 -2
  123. package/esm2022/lib/desy-forms/interfaces/label-data.mjs +0 -2
  124. package/esm2022/lib/desy-forms/interfaces/legend-data.mjs +0 -2
  125. package/esm2022/lib/desy-forms/interfaces/select-item-data.mjs +0 -2
  126. package/esm2022/lib/desy-modals/components/dialog/dialog.component.mjs +0 -155
  127. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.mjs +0 -25
  128. package/esm2022/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.mjs +0 -23
  129. package/esm2022/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.mjs +0 -23
  130. package/esm2022/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.mjs +0 -23
  131. package/esm2022/lib/desy-modals/components/modal/modal.component.mjs +0 -192
  132. package/esm2022/lib/desy-modals/desy-modals.module.mjs +0 -50
  133. package/esm2022/lib/desy-modals/interfaces/dialog-options.mjs +0 -2
  134. package/esm2022/lib/desy-modals/interfaces/index.mjs +0 -7
  135. package/esm2022/lib/desy-modals/interfaces/modal-button-data.mjs +0 -2
  136. package/esm2022/lib/desy-modals/interfaces/modal-data.mjs +0 -2
  137. package/esm2022/lib/desy-modals/interfaces/modal-icon-data.mjs +0 -2
  138. package/esm2022/lib/desy-modals/interfaces/modal-options.mjs +0 -2
  139. package/esm2022/lib/desy-modals/interfaces/open-dialog-result.mjs +0 -2
  140. package/esm2022/lib/desy-modals/services/dialog.service.mjs +0 -114
  141. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.mjs +0 -16
  142. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +0 -53
  143. package/esm2022/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.mjs +0 -19
  144. package/esm2022/lib/desy-nav/components/error-summary/error-summary.component.mjs +0 -67
  145. package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.mjs +0 -25
  146. package/esm2022/lib/desy-nav/components/footer/footer-meta/footer-meta.component.mjs +0 -31
  147. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.mjs +0 -25
  148. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +0 -21
  149. package/esm2022/lib/desy-nav/components/footer/footer.component.mjs +0 -91
  150. package/esm2022/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.mjs +0 -15
  151. package/esm2022/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.mjs +0 -46
  152. package/esm2022/lib/desy-nav/components/header/header-mobileText/header-mobile-text.component.mjs +0 -336
  153. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.mjs +0 -31
  154. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +0 -36
  155. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.mjs +0 -20
  156. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.mjs +0 -15
  157. package/esm2022/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.mjs +0 -93
  158. package/esm2022/lib/desy-nav/components/header/header-subnav/header-subnav.component.mjs +0 -41
  159. package/esm2022/lib/desy-nav/components/header/header.component.mjs +0 -119
  160. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-custom-navigation/header-custom-navigation.component.mjs +0 -14
  161. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.mjs +0 -38
  162. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-logo/header-advanced-logo.component.mjs +0 -37
  163. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-sub/header-advanced-sub.component.mjs +0 -42
  164. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-subtitle/header-advanced-subtitle.component.mjs +0 -14
  165. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-super/header-advanced-super.component.mjs +0 -42
  166. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title/header-advanced-title.component.mjs +0 -19
  167. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-title-container/header-advanced-title-container.component.mjs +0 -38
  168. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced.component.mjs +0 -54
  169. package/esm2022/lib/desy-nav/components/header-mini/header-mini.component.mjs +0 -32
  170. package/esm2022/lib/desy-nav/components/links-list/links-list-icon-right/links-list-icon-right.component.mjs +0 -16
  171. package/esm2022/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.mjs +0 -46
  172. package/esm2022/lib/desy-nav/components/links-list/links-list-item-sub/links-list-item-sub.component.mjs +0 -14
  173. package/esm2022/lib/desy-nav/components/links-list/links-list.component.mjs +0 -44
  174. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.mjs +0 -42
  175. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +0 -76
  176. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +0 -55
  177. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.mjs +0 -49
  178. package/esm2022/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +0 -858
  179. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +0 -44
  180. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.mjs +0 -18
  181. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.mjs +0 -34
  182. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +0 -98
  183. package/esm2022/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +0 -51
  184. package/esm2022/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.mjs +0 -14
  185. package/esm2022/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.mjs +0 -36
  186. package/esm2022/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.mjs +0 -27
  187. package/esm2022/lib/desy-nav/components/menubar/directives/menubaritem.directive.mjs +0 -47
  188. package/esm2022/lib/desy-nav/components/menubar/menubar.component.mjs +0 -966
  189. package/esm2022/lib/desy-nav/components/nav/nav-item/nav-item.component.mjs +0 -43
  190. package/esm2022/lib/desy-nav/components/nav/nav.component.mjs +0 -115
  191. package/esm2022/lib/desy-nav/components/notification/notification-item/notification-item.component.mjs +0 -25
  192. package/esm2022/lib/desy-nav/components/notification/notification.component.mjs +0 -127
  193. package/esm2022/lib/desy-nav/components/skip-link/skip-link.component.mjs +0 -62
  194. package/esm2022/lib/desy-nav/desy-nav.module.mjs +0 -290
  195. package/esm2022/lib/desy-nav/directives/dynamic-heading.directive.mjs +0 -40
  196. package/esm2022/lib/desy-nav/interfaces/breadcrumbs.data.mjs +0 -2
  197. package/esm2022/lib/desy-nav/interfaces/error-summary-data.mjs +0 -2
  198. package/esm2022/lib/desy-nav/interfaces/footer-data.mjs +0 -2
  199. package/esm2022/lib/desy-nav/interfaces/footer-logo.mjs +0 -10
  200. package/esm2022/lib/desy-nav/interfaces/header-advanced-logo.mjs +0 -7
  201. package/esm2022/lib/desy-nav/interfaces/header-dropdown-data.mjs +0 -2
  202. package/esm2022/lib/desy-nav/interfaces/header-mobile-text-data.mjs +0 -2
  203. package/esm2022/lib/desy-nav/interfaces/header-navigation-data.mjs +0 -2
  204. package/esm2022/lib/desy-nav/interfaces/header-navigation-item-data.mjs +0 -2
  205. package/esm2022/lib/desy-nav/interfaces/header-offcanvas-data.mjs +0 -2
  206. package/esm2022/lib/desy-nav/interfaces/header-skiplink-data.mjs +0 -2
  207. package/esm2022/lib/desy-nav/interfaces/header-subnav-data.mjs +0 -2
  208. package/esm2022/lib/desy-nav/interfaces/index.mjs +0 -21
  209. package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-data.mjs +0 -2
  210. package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-event-data.mjs +0 -2
  211. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.mjs +0 -2
  212. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item.mjs +0 -2
  213. package/esm2022/lib/desy-nav/interfaces/menu-navigation.mjs +0 -2
  214. package/esm2022/lib/desy-nav/interfaces/menu-vertical-items-data.mjs +0 -2
  215. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-data.mjs +0 -2
  216. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-items-data.mjs +0 -2
  217. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.mjs +0 -2
  218. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub-item.mjs +0 -2
  219. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub.mjs +0 -2
  220. package/esm2022/lib/desy-nav/interfaces/menubar-item.mjs +0 -2
  221. package/esm2022/lib/desy-nav/interfaces/nav-item-event.data.mjs +0 -2
  222. package/esm2022/lib/desy-nav/interfaces/nav-item.data.mjs +0 -2
  223. package/esm2022/lib/desy-nav/interfaces/notification-items-data.mjs +0 -2
  224. package/esm2022/lib/desy-nav/interfaces/notification-options.mjs +0 -2
  225. package/esm2022/lib/desy-pagination/components/pagination/pagination.component.mjs +0 -242
  226. package/esm2022/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.mjs +0 -19
  227. package/esm2022/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.mjs +0 -17
  228. package/esm2022/lib/desy-pagination/desy-pagination.module.mjs +0 -25
  229. package/esm2022/lib/desy-pagination/interfaces/pagination-item.data.mjs +0 -2
  230. package/esm2022/lib/desy-tables/components/table/components/table-caption.component.mjs +0 -17
  231. package/esm2022/lib/desy-tables/components/table/components/table-cell.component.mjs +0 -23
  232. package/esm2022/lib/desy-tables/components/table/components/table-footer.component.mjs +0 -18
  233. package/esm2022/lib/desy-tables/components/table/components/table-header.component.mjs +0 -18
  234. package/esm2022/lib/desy-tables/components/table/components/table-row.component.mjs +0 -18
  235. package/esm2022/lib/desy-tables/components/table/table.component.mjs +0 -120
  236. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer-cell.component.mjs +0 -23
  237. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-footer.component.mjs +0 -27
  238. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.mjs +0 -56
  239. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.mjs +0 -18
  240. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.mjs +0 -23
  241. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.mjs +0 -27
  242. package/esm2022/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.mjs +0 -28
  243. package/esm2022/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +0 -516
  244. package/esm2022/lib/desy-tables/desy-tables.module.mjs +0 -100
  245. package/esm2022/lib/desy-tables/directives/cell.directive.mjs +0 -25
  246. package/esm2022/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +0 -89
  247. package/esm2022/lib/desy-tables/directives/row.directive.mjs +0 -22
  248. package/esm2022/lib/desy-tables/interfaces/cell-data.mjs +0 -2
  249. package/esm2022/lib/desy-tables/interfaces/head-cell-data.mjs +0 -7
  250. package/esm2022/lib/desy-tables/interfaces/index.mjs +0 -5
  251. package/esm2022/lib/desy-tables/interfaces/recalculate-table-params.mjs +0 -2
  252. package/esm2022/lib/desy-tables/interfaces/row-data.mjs +0 -2
  253. package/esm2022/lib/desy-tables/interfaces/wrapper-data.mjs +0 -2
  254. package/esm2022/lib/desy-views/components/accordion/accordion-header/accordion-header.component.mjs +0 -17
  255. package/esm2022/lib/desy-views/components/accordion/accordion-item/accordion-item.component.mjs +0 -61
  256. package/esm2022/lib/desy-views/components/accordion/accordion.component.mjs +0 -447
  257. package/esm2022/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.mjs +0 -41
  258. package/esm2022/lib/desy-views/components/accordion-history/accordion-history.component.mjs +0 -20
  259. package/esm2022/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.mjs +0 -17
  260. package/esm2022/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.mjs +0 -17
  261. package/esm2022/lib/desy-views/components/alert/alert.component.mjs +0 -82
  262. package/esm2022/lib/desy-views/components/card/card-sectors/card-left.component.mjs +0 -21
  263. package/esm2022/lib/desy-views/components/card/card-sectors/card-right.component.mjs +0 -21
  264. package/esm2022/lib/desy-views/components/card/card-sectors/card-sub.component.mjs +0 -21
  265. package/esm2022/lib/desy-views/components/card/card-sectors/card-super.component.mjs +0 -21
  266. package/esm2022/lib/desy-views/components/card/card.component.mjs +0 -48
  267. package/esm2022/lib/desy-views/components/collapsible/collapsible.component.mjs +0 -66
  268. package/esm2022/lib/desy-views/components/description-list/definition/definition.component.mjs +0 -19
  269. package/esm2022/lib/desy-views/components/description-list/description-item/description-item.component.mjs +0 -36
  270. package/esm2022/lib/desy-views/components/description-list/description-list.component.mjs +0 -29
  271. package/esm2022/lib/desy-views/components/description-list/term/term.component.mjs +0 -19
  272. package/esm2022/lib/desy-views/components/details/details.component.mjs +0 -43
  273. package/esm2022/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.mjs +0 -17
  274. package/esm2022/lib/desy-views/components/item/item-content-right/item-content-right.component.mjs +0 -15
  275. package/esm2022/lib/desy-views/components/item/item-item/item-item.component.mjs +0 -15
  276. package/esm2022/lib/desy-views/components/item/item.component.mjs +0 -122
  277. package/esm2022/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.mjs +0 -12
  278. package/esm2022/lib/desy-views/components/media-object/media-object.component.mjs +0 -369
  279. package/esm2022/lib/desy-views/components/status/status.component.mjs +0 -366
  280. package/esm2022/lib/desy-views/components/status-item/status-item.component.mjs +0 -401
  281. package/esm2022/lib/desy-views/components/tabs/panel/panel.component.mjs +0 -19
  282. package/esm2022/lib/desy-views/components/tabs/tab-item/tab-item.component.mjs +0 -41
  283. package/esm2022/lib/desy-views/components/tabs/tabs.component.mjs +0 -446
  284. package/esm2022/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.mjs +0 -12
  285. package/esm2022/lib/desy-views/components/tooltip/tooltip.component.mjs +0 -450
  286. package/esm2022/lib/desy-views/desy-views.module.mjs +0 -181
  287. package/esm2022/lib/desy-views/interfaces/accordion-header.data.mjs +0 -2
  288. package/esm2022/lib/desy-views/interfaces/accordion-item.data.mjs +0 -2
  289. package/esm2022/lib/desy-views/interfaces/alert-options.mjs +0 -2
  290. package/esm2022/lib/desy-views/interfaces/description-item.data.mjs +0 -2
  291. package/esm2022/lib/desy-views/interfaces/index.mjs +0 -11
  292. package/esm2022/lib/desy-views/interfaces/open-alert-result.mjs +0 -2
  293. package/esm2022/lib/desy-views/interfaces/status-data.mjs +0 -2
  294. package/esm2022/lib/desy-views/interfaces/status-icon-data.mjs +0 -2
  295. package/esm2022/lib/desy-views/interfaces/status-item-title-data.mjs +0 -2
  296. package/esm2022/lib/desy-views/interfaces/tabs-items-data.mjs +0 -2
  297. package/esm2022/lib/desy-views/interfaces/tabs-panel-data.mjs +0 -2
  298. package/esm2022/lib/desy-views/interfaces/term-definition.data.mjs +0 -2
  299. package/esm2022/lib/desy-views/services/alert.service.mjs +0 -88
  300. package/esm2022/lib/shared/components/accessibility/accessibility-attributes.mjs +0 -78
  301. package/esm2022/lib/shared/components/accessibility/accessibility.component.mjs +0 -164
  302. package/esm2022/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.mjs +0 -168
  303. package/esm2022/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.mjs +0 -165
  304. package/esm2022/lib/shared/components/content-base/content-base.component.mjs +0 -21
  305. package/esm2022/lib/shared/components/index.mjs +0 -7
  306. package/esm2022/lib/shared/components/spinner/spinner.component.mjs +0 -329
  307. package/esm2022/lib/shared/components/text-or-html-required/text-or-html-required.component.mjs +0 -18
  308. package/esm2022/lib/shared/decorators/desy-content-child.decorator.mjs +0 -34
  309. package/esm2022/lib/shared/decorators/desy-on-input-change.decorator.mjs +0 -15
  310. package/esm2022/lib/shared/directives/accessibility-directive.mjs +0 -54
  311. package/esm2022/lib/shared/directives/attribute-change.directive.mjs +0 -50
  312. package/esm2022/lib/shared/directives/click-outside.directive.mjs +0 -40
  313. package/esm2022/lib/shared/directives/content-change.directive.mjs +0 -41
  314. package/esm2022/lib/shared/directives/custom-inner-content.directive.mjs +0 -63
  315. package/esm2022/lib/shared/directives/inner-content.directive.mjs +0 -37
  316. package/esm2022/lib/shared/interfaces/accessibility-data.mjs +0 -2
  317. package/esm2022/lib/shared/pipes/external-href.pipe.mjs +0 -28
  318. package/esm2022/lib/shared/pipes/inner-html.pipe.mjs +0 -21
  319. package/esm2022/lib/shared/pipes/make-html-list.pipe.mjs +0 -20
  320. package/esm2022/lib/shared/shared.module.mjs +0 -86
  321. package/esm2022/lib/shared/sharedExternal.module.mjs +0 -20
  322. package/esm2022/lib/shared/utils/focus-utils.mjs +0 -50
  323. package/esm2022/lib/shared/utils/search-utils.mjs +0 -70
  324. package/esm2022/lib/shared/utils/string-utils.mjs +0 -13
  325. package/esm2022/public-api.mjs +0 -225
@@ -1,516 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren, } from '@angular/core';
3
- import { CheckboxItemComponent } from '../../../desy-forms/components/checkboxes/checkbox-item/checkbox-item.component';
4
- import { AccessibilityComponent } from '../../../shared/components';
5
- import { DesyContentChild } from '../../../shared/decorators/desy-content-child.decorator';
6
- import { SearchUtils } from '../../../shared/utils/search-utils';
7
- import { RowDirective } from '../../directives/row.directive';
8
- import { OrderBy } from '../../interfaces';
9
- import { TableCaptionComponent } from '../table/components/table-caption.component';
10
- import { TableAdvancedFooterComponent } from './components/table-advanced-footer.component';
11
- import { TableAdvancedHeaderComponent } from './components/table-advanced-header.component';
12
- import { TableAdvancedRowComponent } from './components/table-advanced-row.component';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/common";
15
- import * as i2 from "@angular/forms";
16
- import * as i3 from "../../../shared/directives/custom-inner-content.directive";
17
- import * as i4 from "../../../shared/directives/accessibility-directive";
18
- import * as i5 from "../../../desy-forms/components/select/select.component";
19
- import * as i6 from "../../../desy-forms/components/checkboxes/checkboxes.component";
20
- import * as i7 from "../../../desy-forms/components/checkboxes/checkbox-item/checkbox-item.component";
21
- import * as i8 from "../../../desy-forms/components/search-bar/search-bar.component";
22
- import * as i9 from "../../directives/focus-clicked-cell.directive";
23
- import * as i10 from "../../directives/cell.directive";
24
- import * as i11 from "../../directives/row.directive";
25
- import * as i12 from "../../../shared/pipes/make-html-list.pipe";
26
- export class TableAdvancedComponent extends AccessibilityComponent {
27
- set rows(rows) {
28
- this._rows = rows;
29
- this.recalculateVisibleElements();
30
- }
31
- get rows() {
32
- return this._rows;
33
- }
34
- constructor(el, changeDetector) {
35
- super();
36
- this.el = el;
37
- this.changeDetector = changeDetector;
38
- this.selectAllPages = true;
39
- this.totalItems = 0;
40
- this.usePagination = false;
41
- this.rowsCheckedInside = {};
42
- this.numberOfSelectedRows = 0;
43
- this.rowsChange = new EventEmitter();
44
- this.rowsChecked = new EventEmitter();
45
- this.allRowsChecked = new EventEmitter();
46
- this.recalculateTable = new EventEmitter();
47
- this.filterBy = new EventEmitter();
48
- this.selectedBy = new EventEmitter();
49
- this.sortBy = new EventEmitter();
50
- this.rowsUnChecked = new EventEmitter();
51
- this.orderByType = OrderBy;
52
- this.unselectedRows = new Set();
53
- this.selectedAllRowsChecked = false;
54
- }
55
- ngAfterContentInit() {
56
- this.rowsSubscription = this.rowComponentList.changes.subscribe(() => this.recalculateVisibleElements());
57
- }
58
- ngOnDestroy() {
59
- if (this.rowsSubscription) {
60
- this.rowsSubscription.unsubscribe();
61
- }
62
- }
63
- ngAfterViewInit() {
64
- const elemntsFocus = this.el.nativeElement.querySelector('[tabindex]');
65
- if (elemntsFocus) {
66
- elemntsFocus.setAttribute('tabindex', '0');
67
- }
68
- this.recalculateVisibleElements();
69
- }
70
- recalculateVisibleElements() {
71
- const recalculateParams = this.buildRecalculateParams();
72
- if (this.recalculateTable.observers.length > 0) {
73
- this.recalculateTable.emit(recalculateParams);
74
- this.changeDetector.markForCheck();
75
- }
76
- else {
77
- this.visibleRows = this.getRows();
78
- this.changeDetector.detectChanges();
79
- if (!this.usePagination) {
80
- let rowData = this.filterRows(recalculateParams, this.rowData.toArray());
81
- rowData = this.sortRows(recalculateParams, rowData);
82
- this.visibleRows = rowData.map((r) => r.desyRow);
83
- this.changeDetector.detectChanges();
84
- }
85
- }
86
- if (this.checkboxComponent && !this.selectAllPages && this.usePagination) {
87
- const allChecked = this.getRows().every((row) => this.rowsCheckedInside && this.rowsCheckedInside[row.id]);
88
- const anyChecked = this.getRows().some((row) => this.rowsCheckedInside && this.rowsCheckedInside[row.id]);
89
- this.checkboxComponent.indeterminateChecked = !allChecked && anyChecked;
90
- this.checkboxComponent.checked = allChecked;
91
- }
92
- }
93
- buildRecalculateParams() {
94
- const params = {
95
- filters: [],
96
- sort: null,
97
- };
98
- const head = this.getHeaderCells();
99
- if (head) {
100
- head.forEach((headerCell, headerCellIndex) => {
101
- if (headerCell.hasFilter && headerCell.activeFilter) {
102
- params.filters.push({
103
- columnIndex: headerCellIndex,
104
- filterText: headerCell.valueFilter,
105
- identifier: headerCell.identifier,
106
- });
107
- }
108
- if (headerCell.hasSelect && headerCell.activeSelect) {
109
- params.filters.push({
110
- columnIndex: headerCellIndex,
111
- filterText: headerCell.valueSelect,
112
- identifier: headerCell.identifier,
113
- });
114
- }
115
- });
116
- const orderByColumnIndex = head.findIndex((cell) => cell.orderBy && cell.orderBy !== OrderBy.none);
117
- params.sort =
118
- orderByColumnIndex >= 0 ? { columnIndex: orderByColumnIndex, order: head[orderByColumnIndex].orderBy } : null;
119
- }
120
- return params;
121
- }
122
- hasFilters() {
123
- const head = this.getHeaderCells();
124
- return head ? head.findIndex((cell) => cell.hasFilter || cell.hasSelect) >= 0 : false;
125
- }
126
- getHeaderCells() {
127
- return this.headerComponent && this.headerComponent.cells.length > 0
128
- ? this.headerComponent.cells.toArray()
129
- : this.head;
130
- }
131
- getFooterCells() {
132
- return this.footerComponent && this.footerComponent.length > 0 ? this.footerComponent.toArray() : this.foot;
133
- }
134
- getRows() {
135
- let rows = [];
136
- if (this.rowComponentList?.length > 0) {
137
- rows = this.rowComponentList.toArray();
138
- }
139
- else if (this.rows) {
140
- rows = this.rows;
141
- }
142
- return rows;
143
- }
144
- getVisibleRows() {
145
- let rows = this.recalculateTable.observers.length > 0 ? this.getRows() : this.visibleRows;
146
- if (this.selectAllPages &&
147
- this.checkboxComponent &&
148
- this.selectedAllRowsChecked &&
149
- (this.checkboxComponent.checked || this.unselectedRows.size > 0)) {
150
- rows.forEach((row) => {
151
- row.checked = true;
152
- });
153
- }
154
- for (const id in this.rowsCheckedInside) {
155
- const row = rows.find((r) => r.id == String(id));
156
- if (row) {
157
- row.checked = this.rowsCheckedInside[id];
158
- }
159
- }
160
- return rows;
161
- }
162
- getIdPrefix() {
163
- return this.idPrefix ? this.idPrefix : 'id-table-row';
164
- }
165
- getIdHeader(index) {
166
- return this.getIdPrefix() + '-header-' + index;
167
- }
168
- getIdRowCheckbox(index) {
169
- return this.getIdPrefix() + '-checkbox-' + index;
170
- }
171
- getIdHeaderFilter(index) {
172
- return this.getIdPrefix() + '-header-filter-' + index;
173
- }
174
- getIdHeaderSelect(index) {
175
- return this.getIdPrefix() + '-header-select-' + index;
176
- }
177
- getCaptionClass() {
178
- return this.captionComponent ? this.captionComponent.classes : this.captionClasses;
179
- }
180
- getStringOrderBy(orderBy) {
181
- if (orderBy === OrderBy.asc) {
182
- return 'ascending';
183
- }
184
- else if (orderBy === OrderBy.desc) {
185
- return 'descending';
186
- }
187
- else if (orderBy === OrderBy.none) {
188
- return 'none';
189
- }
190
- }
191
- getSelectForItem(item) {
192
- return item.selectComponent ? item.selectComponent : null;
193
- }
194
- getItemSelectOptions(item) {
195
- return item.selectItemComponentList && item.selectItemComponentList.length > 0
196
- ? item.selectItemComponentList.toArray()
197
- : item.items;
198
- }
199
- getContentComponent(item) {
200
- return item.contentComponent ? item.contentComponent : null;
201
- }
202
- handleCheckboxChange(row) {
203
- if (row instanceof TableAdvancedRowComponent) {
204
- row.checkedChange.emit(row.checked);
205
- }
206
- this.notifyCheckedChange();
207
- }
208
- uncheckAll() {
209
- this.rowsCheckedInside = {};
210
- this.unselectedRows.clear();
211
- this.selectedAllRowsChecked = false;
212
- this.numberOfSelectedRows = 0;
213
- this.getRows().forEach((r) => {
214
- const mustEmit = r.checked && r instanceof TableAdvancedRowComponent;
215
- r.checked = false;
216
- if (mustEmit) {
217
- r.checkedChange.emit(r.checked);
218
- }
219
- });
220
- this.notifyCheckedChange();
221
- }
222
- notifyCheckedChange() {
223
- if (this.rowComponentList.length === 0) {
224
- this.rowsChange.emit(this.rows);
225
- }
226
- const rowChecks = {};
227
- this.getRows().forEach((r) => {
228
- rowChecks[r.id] = !!r.checked;
229
- if (this.selectAllPages && this.selectedAllRowsChecked) {
230
- if (r.checked) {
231
- this.unselectedRows.delete(r.id);
232
- }
233
- else {
234
- this.unselectedRows.add(r.id);
235
- }
236
- this.numberOfSelectedRows = this.totalItems - this.unselectedRows.size;
237
- }
238
- });
239
- this.rowsCheckedInside = { ...this.rowsCheckedInside, ...rowChecks };
240
- this.rowsChecked.emit(this.rowsCheckedInside);
241
- Promise.resolve().then(() => {
242
- if (this.checkboxComponent) {
243
- const visibleRows = this.getVisibleRows();
244
- const anyChecked = this.selectAllPages && this.totalItems && this.usePagination
245
- ? this.areAnyRowsChecked()
246
- : visibleRows.some((r) => r.checked);
247
- const allChecked = this.selectAllPages && this.totalItems && this.usePagination
248
- ? this.areAllRowsChecked()
249
- : visibleRows.every((r) => r.checked);
250
- this.checkboxComponent.indeterminateChecked =
251
- (!this.selectedAllRowsChecked && this.selectAllPages && this.usePagination && anyChecked && !allChecked) ||
252
- (anyChecked && !allChecked) ||
253
- (this.unselectedRows.size > 0 && this.unselectedRows.size < this.totalItems);
254
- this.checkboxComponent.checked = allChecked && this.unselectedRows.size == 0 && visibleRows.length > 0;
255
- const { checked, indeterminateChecked } = this.checkboxComponent;
256
- if (!this.selectedAllRowsChecked && checked)
257
- this.selectedAllRowsChecked = true;
258
- else if (this.selectedAllRowsChecked && !checked && !indeterminateChecked) {
259
- this.selectedAllRowsChecked = false;
260
- this.unselectedRows.clear();
261
- }
262
- if (checked) {
263
- this.allRowsChecked.emit(true);
264
- }
265
- else if (indeterminateChecked || !checked) {
266
- this.allRowsChecked.emit(false);
267
- }
268
- }
269
- if (this.selectAllPages) {
270
- this.rowsUnChecked.emit(Array.from(this.unselectedRows));
271
- }
272
- });
273
- }
274
- areAllRowsChecked() {
275
- const items = Object.keys(this.rowsCheckedInside);
276
- if (items.length !== this.totalItems && this.numberOfSelectedRows !== this.totalItems) {
277
- return false;
278
- }
279
- const allTrue = items.every((key) => this.rowsCheckedInside[key]);
280
- return allTrue;
281
- }
282
- areAnyRowsChecked() {
283
- const items = Object.keys(this.rowsCheckedInside);
284
- if (items.length === 0) {
285
- return false;
286
- }
287
- const anyTrue = items.some((key) => this.rowsCheckedInside[key]);
288
- return anyTrue;
289
- }
290
- handleInputSearch(item) {
291
- if (item.hasFilter) {
292
- item.activeFilter = !!item.valueFilter;
293
- this.uncheckAll();
294
- }
295
- if (item.hasSelect) {
296
- item.activeSelect = !!item.valueSelect;
297
- this.uncheckAll();
298
- }
299
- this.recalculateVisibleElements();
300
- }
301
- handleButtonSearch(item) {
302
- if (item.hasFilter) {
303
- item.activeFilter = !!item.valueFilter;
304
- this.filterBy.emit({ id: item.identifier, value: item.valueFilter });
305
- this.uncheckAll();
306
- }
307
- if (item.hasSelect) {
308
- item.activeSelect = !!item.valueSelect;
309
- this.selectedBy.emit(item.valueSelect);
310
- this.uncheckAll();
311
- }
312
- }
313
- filterRows(recalculateParams, rows) {
314
- let filteredRows = rows;
315
- recalculateParams.filters.forEach((filter) => {
316
- filteredRows = filteredRows.filter((row) => SearchUtils.containsAnyWordFrom(row.getCell(filter.columnIndex).getContent(), filter.filterText));
317
- });
318
- return filteredRows;
319
- }
320
- handleSortByColumn(index, event) {
321
- const head = this.getHeaderCells();
322
- let order = OrderBy.asc;
323
- if (head) {
324
- head.forEach((cell, cellIndex) => {
325
- if (cell.orderBy) {
326
- if (cellIndex === index) {
327
- order = this.getNextDirection(cell);
328
- }
329
- cell.orderBy = cellIndex === index ? this.getNextDirection(cell) : OrderBy.none;
330
- }
331
- });
332
- }
333
- if (this.usePagination) {
334
- this.sortBy.emit({ id: index, order: order });
335
- this.uncheckAll();
336
- }
337
- else {
338
- this.recalculateVisibleElements();
339
- }
340
- event?.preventDefault();
341
- }
342
- sortRows(recalculateParams, rows) {
343
- let sortedRows = rows;
344
- if (recalculateParams.sort) {
345
- const columnIndex = recalculateParams.sort.columnIndex;
346
- const isAsc = recalculateParams.sort.order === OrderBy.asc;
347
- sortedRows = rows.sort((a, b) => this.compareCellContent(a.getCell(columnIndex), b.getCell(columnIndex), isAsc));
348
- }
349
- return sortedRows;
350
- }
351
- compareCellContent(a, b, isAsc) {
352
- let result;
353
- const aComparable = this.cleanCurrency(a.getContent()).trim();
354
- const bComparable = this.cleanCurrency(b.getContent()).trim();
355
- const numberRegex = /^-?\d+(\.|,)?\d*$/;
356
- const dateRegex = /^(\d{2})(\/|-)(\d{2})(\/|-)(\d{4})( (\d{2}):(\d{2})(:(\d{2}))?)?$/;
357
- if (aComparable && bComparable) {
358
- if (numberRegex.test(aComparable) && numberRegex.test(bComparable)) {
359
- result = parseFloat(aComparable) - parseFloat(bComparable);
360
- }
361
- else if (dateRegex.test(aComparable) && dateRegex.test(bComparable)) {
362
- result = this.parseDateTime(aComparable) - this.parseDateTime(bComparable);
363
- }
364
- else {
365
- result = aComparable.localeCompare(bComparable, 'es', { sensitivity: 'base', ignorePunctuation: true });
366
- }
367
- }
368
- return result * (isAsc ? 1 : -1);
369
- }
370
- parseDateTime(input) {
371
- let [datePart, timePart] = input.split(' ');
372
- let [day, month, year] = datePart.split(/\/|-/).map(Number);
373
- let [hours = 0, minutes = 0, seconds = 0] = (timePart ? timePart.split(':') : []).map(Number);
374
- let date = new Date(year, month - 1, day, hours, minutes, seconds);
375
- return date.getTime();
376
- }
377
- getNextDirection(item) {
378
- if (item.orderBy === OrderBy.none || item.orderBy === OrderBy.desc) {
379
- return OrderBy.asc;
380
- }
381
- else {
382
- return OrderBy.desc;
383
- }
384
- }
385
- cleanCurrency(txt) {
386
- txt = txt.replace(/€/g, '');
387
- return txt;
388
- }
389
- selectFilter(item, itemValue) {
390
- item.valueChange.emit(itemValue);
391
- const head = this.getHeaderCells();
392
- const rows = this.getRows();
393
- if (head && rows) {
394
- head.forEach((cell, cellIndex) => { });
395
- rows.forEach((row) => { });
396
- }
397
- }
398
- checkUncheckAll() {
399
- if (!this.checkboxComponent)
400
- return;
401
- let { indeterminateChecked, checked } = this.checkboxComponent;
402
- if (!checked) {
403
- this.checkboxComponent.checked = false;
404
- this.checkboxComponent.indeterminateChecked = false;
405
- checked = false;
406
- indeterminateChecked = false;
407
- this.selectedAllRowsChecked = false;
408
- }
409
- else {
410
- this.selectedAllRowsChecked = true;
411
- this.numberOfSelectedRows = this.totalItems;
412
- }
413
- if (this.selectAllPages)
414
- this.rowsCheckedInside = {};
415
- const selectedRows = {};
416
- const rows = this.getVisibleRows();
417
- if (rows && rows.length > 0) {
418
- rows.forEach((row) => {
419
- row.checked = indeterminateChecked ? false : checked;
420
- if (!indeterminateChecked)
421
- selectedRows[row.id] = checked;
422
- });
423
- if (checked) {
424
- this.allRowsChecked.emit(true);
425
- }
426
- else if (indeterminateChecked || !checked) {
427
- this.allRowsChecked.emit(false);
428
- }
429
- if (this.selectAllPages) {
430
- this.unselectedRows.clear();
431
- this.rowsUnChecked.emit(Array.from(this.unselectedRows));
432
- }
433
- this.rowsCheckedInside = { ...this.rowsCheckedInside, ...selectedRows };
434
- this.rowsChecked.emit(this.rowsCheckedInside);
435
- }
436
- }
437
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableAdvancedComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableAdvancedComponent, selector: "desy-table-advanced", inputs: { rows: "rows", head: "head", foot: "foot", caption: "caption", captionClasses: "captionClasses", firstCellIsHeader: "firstCellIsHeader", hasCheckboxes: "hasCheckboxes", idPrefix: "idPrefix", classes: "classes", checkboxClasses: "checkboxClasses", id: "id", wrapper: "wrapper", selectAllPages: "selectAllPages", totalItems: "totalItems", usePagination: "usePagination" }, outputs: { rowsChange: "rowsChange", rowsChecked: "rowsChecked", allRowsChecked: "allRowsChecked", recalculateTable: "recalculateTable", filterBy: "filterBy", selectedBy: "selectedBy", sortBy: "sortBy", rowsUnChecked: "rowsUnChecked" }, queries: [{ propertyName: "captionComponent", predicate: TableCaptionComponent }, { propertyName: "headerComponent", predicate: TableAdvancedHeaderComponent }, { propertyName: "footerComponent", predicate: TableAdvancedFooterComponent }, { propertyName: "rowComponentList", predicate: TableAdvancedRowComponent }], viewQueries: [{ propertyName: "checkboxComponent", first: true, predicate: ["checkbox"], descendants: true }, { propertyName: "rowData", predicate: RowDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #tableContent>\n <div\n *ngIf=\"hasCheckboxes\"\n class=\"lg:flex lg:flex-wrap lg:w-full\"\n aria-labelledby=\"acciones-entradas\">\n <h3\n id=\"acciones-entradas\"\n class=\"sr-only\">\n Selecci\u00F3n m\u00FAltiple y Acciones sobre el listado de entradas\n </h3>\n <div\n id=\"selection-home\"\n class=\"pt-2 pb-0 pl-4 mt-0 lg:flex sm:flex-1 py-base\">\n <div class=\"h-10\">\n <desy-checkboxes name=\"todos-entradas-chbx\">\n <desy-checkbox-item\n #checkbox\n value=\"item-checkbox\"\n name=\"todos-entradas\"\n (checkedChange)=\"checkUncheckAll()\"\n [isIndeterminate]=\"true\"\n classes=\"c-checkboxes--sm\">\n <div class=\"pt-0.5 leading-5\">\n <label class=\"block -mt-1 text-sm ng-star-inserted\">\n {{ selectAllPages ? 'Seleccionar todo' : 'Seleccionar todos los items de esta p\u00E1gina' }}\n </label>\n </div>\n </desy-checkbox-item>\n </desy-checkboxes>\n </div>\n </div>\n <ng-content\n select=\":not(desy-table-advanced-header):not(desy-table-advanced-row):not(desy-table-advanced-footer):not(desy-table-caption)\"></ng-content>\n </div>\n <table\n role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption\n *ngIf=\"caption || captionComponent\"\n [class]=\"getCaptionClass()\">\n <ng-container\n *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th\n *ngIf=\"hasCheckboxes\"\n scope=\"col\"\n [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th\n scope=\"col\"\n *ngFor=\"let item of getHeaderCells(); index as iHeader\"\n [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"\n [\n 'align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark',\n item.classes,\n ] | makeHtmlList\n \"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n <span\n *ngIf=\"item.orderBy\"\n class=\"inline-block relative\"\n (click)=\"handleSortByColumn(iHeader, $event)\"\n (keydown.enter)=\"handleSortByColumn(iHeader, $event)\"\n (keydown.space)=\"handleSortByColumn(iHeader, $event)\"\n desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{ item.text }}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span\n class=\"c-table-advanced__order\"\n *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span\n class=\"c-table-advanced__ascending\"\n *ngIf=\"item.orderBy === orderByType.asc\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span\n class=\"c-table-advanced__descending\"\n *ngIf=\"item.orderBy === orderByType.desc\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span\n class=\"c-table-advanced__none\"\n *ngIf=\"item.orderBy === orderByType.none\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n class=\"text-neutral-dark\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n </span>\n </span>\n\n <span\n *ngIf=\"!item.orderBy\"\n class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{ item.text }}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr\n class=\"divide-x divide-neutral-base\"\n *ngIf=\"hasFilters()\">\n <td\n *ngIf=\"hasCheckboxes\"\n [ngClass]=\"checkboxClasses\"></td>\n <td\n tabindex=\"-1\"\n *ngFor=\"let item of getHeaderCells(); index as iHead\"\n desyFocusClickedCell\n [class]=\"\n [\n 'align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark',\n item.classes,\n ] | makeHtmlList\n \">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container\n *ngTemplateOutlet=\"tableSelect; context: { selectable: getSelectForItem(item) }\"></ng-container>\n <ng-template\n #tableSelect\n let-selectable=\"selectable\">\n <desy-select\n [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n [(ngModel)]=\"item.valueSelect\"\n (ngModelChange)=\"usePagination ? handleButtonSearch(item) : handleInputSearch(item)\"\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\"></desy-select>\n </ng-template>\n </ng-container>\n\n <div\n *ngIf=\"item.hasSelect && item.hasFilter\"\n class=\"pb-sm\"></div>\n\n <desy-search-bar\n *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\"\n [ngModelOptions]=\"{ standalone: true }\"\n (clickEvent)=\"usePagination ? handleButtonSearch(item) : null\"\n (ngModelChange)=\"!usePagination ? handleInputSearch(item) : null\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"></desy-search-bar>\n </td>\n </tr>\n\n <tr\n *ngFor=\"let row of getVisibleRows(); index as iRow\"\n class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td\n *ngIf=\"hasCheckboxes\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input\n type=\"checkbox\"\n class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\"\n (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\" />\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label\n class=\"sr-only block text-sm -mt-1\"\n [for]=\"getIdRowCheckbox(iRow)\">\n Selecciona fila {{ iRow }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th\n *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\"\n scope=\"row\"\n [class]=\"\n [\n 'px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark',\n cell.classes,\n ] | makeHtmlList\n \"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iRow\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td\n tabindex=\"-1\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iRow\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n\n <tfoot *ngIf=\"getFooterCells()\">\n <tr\n *ngFor=\"let foot of getFooterCells(); index as iFooter\"\n class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td\n *ngIf=\"hasCheckboxes\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input\n type=\"checkbox\"\n class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\"\n (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\" />\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label\n class=\"sr-only block text-sm -mt-1\"\n [for]=\"getIdRowCheckbox(iFooter)\">\n Selecciona fila {{ iFooter }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th\n *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\"\n scope=\"row\"\n [class]=\"\n [\n 'px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark',\n cell.classes,\n ] | makeHtmlList\n \"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iFooter\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td\n tabindex=\"-1\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iFooter\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div\n *ngIf=\"wrapper; else tableContent\"\n [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "directive", type: i4.AccessibilityDirective, selector: "[desyAppAccessibility]", inputs: ["desyAppAccessibility"] }, { kind: "component", type: i5.SelectComponent, selector: "desy-select", inputs: ["name", "items", "describedBy", "formGroupClasses", "classes"] }, { kind: "component", type: i6.CheckboxesComponent, selector: "desy-checkboxes", inputs: ["fieldsetData", "legendRef", "legendData", "legendText", "idPrefix", "name", "items", "formGroupClasses", "hasDividers", "hasError", "classes", "describedBy"], outputs: ["itemsChange"] }, { kind: "component", type: i7.CheckboxItemComponent, selector: "desy-checkbox-item", inputs: ["id", "value", "name", "conditional", "disabled", "isIndeterminate", "indeterminateChecked", "classes", "checked"], outputs: ["checkedChange", "indeterminateChange"] }, { kind: "component", type: i8.SearchBarComponent, selector: "desy-search-bar", inputs: ["describedBy", "classes", "buttonClasses", "placeholder"], outputs: ["clickEvent"] }, { kind: "directive", type: i9.FocusClickedCellDirective, selector: "[desyFocusClickedCell]" }, { kind: "directive", type: i10.CellDirective, selector: "[desyCell]", inputs: ["row", "rowIndex", "columnIndex"] }, { kind: "directive", type: i11.RowDirective, selector: "[desyRow]", inputs: ["desyRow"] }, { kind: "pipe", type: i12.MakeHtmlListPipe, name: "makeHtmlList" }] }); }
439
- }
440
- __decorate([
441
- DesyContentChild(),
442
- __metadata("design:type", TableCaptionComponent)
443
- ], TableAdvancedComponent.prototype, "captionComponent", void 0);
444
- __decorate([
445
- DesyContentChild(),
446
- __metadata("design:type", TableAdvancedHeaderComponent)
447
- ], TableAdvancedComponent.prototype, "headerComponent", void 0);
448
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableAdvancedComponent, decorators: [{
449
- type: Component,
450
- args: [{ selector: 'desy-table-advanced', template: "<ng-template #tableContent>\n <div\n *ngIf=\"hasCheckboxes\"\n class=\"lg:flex lg:flex-wrap lg:w-full\"\n aria-labelledby=\"acciones-entradas\">\n <h3\n id=\"acciones-entradas\"\n class=\"sr-only\">\n Selecci\u00F3n m\u00FAltiple y Acciones sobre el listado de entradas\n </h3>\n <div\n id=\"selection-home\"\n class=\"pt-2 pb-0 pl-4 mt-0 lg:flex sm:flex-1 py-base\">\n <div class=\"h-10\">\n <desy-checkboxes name=\"todos-entradas-chbx\">\n <desy-checkbox-item\n #checkbox\n value=\"item-checkbox\"\n name=\"todos-entradas\"\n (checkedChange)=\"checkUncheckAll()\"\n [isIndeterminate]=\"true\"\n classes=\"c-checkboxes--sm\">\n <div class=\"pt-0.5 leading-5\">\n <label class=\"block -mt-1 text-sm ng-star-inserted\">\n {{ selectAllPages ? 'Seleccionar todo' : 'Seleccionar todos los items de esta p\u00E1gina' }}\n </label>\n </div>\n </desy-checkbox-item>\n </desy-checkboxes>\n </div>\n </div>\n <ng-content\n select=\":not(desy-table-advanced-header):not(desy-table-advanced-row):not(desy-table-advanced-footer):not(desy-table-caption)\"></ng-content>\n </div>\n <table\n role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption\n *ngIf=\"caption || captionComponent\"\n [class]=\"getCaptionClass()\">\n <ng-container\n *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th\n *ngIf=\"hasCheckboxes\"\n scope=\"col\"\n [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th\n scope=\"col\"\n *ngFor=\"let item of getHeaderCells(); index as iHeader\"\n [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"\n [\n 'align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark',\n item.classes,\n ] | makeHtmlList\n \"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n <span\n *ngIf=\"item.orderBy\"\n class=\"inline-block relative\"\n (click)=\"handleSortByColumn(iHeader, $event)\"\n (keydown.enter)=\"handleSortByColumn(iHeader, $event)\"\n (keydown.space)=\"handleSortByColumn(iHeader, $event)\"\n desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{ item.text }}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span\n class=\"c-table-advanced__order\"\n *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span\n class=\"c-table-advanced__ascending\"\n *ngIf=\"item.orderBy === orderByType.asc\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span\n class=\"c-table-advanced__descending\"\n *ngIf=\"item.orderBy === orderByType.desc\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span\n class=\"c-table-advanced__none\"\n *ngIf=\"item.orderBy === orderByType.none\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 140 140\"\n class=\"text-neutral-dark\"\n aria-hidden=\"true\"\n width=\"1em\"\n height=\"1em\">\n <path\n d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n </span>\n </span>\n\n <span\n *ngIf=\"!item.orderBy\"\n class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{ item.text }}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr\n class=\"divide-x divide-neutral-base\"\n *ngIf=\"hasFilters()\">\n <td\n *ngIf=\"hasCheckboxes\"\n [ngClass]=\"checkboxClasses\"></td>\n <td\n tabindex=\"-1\"\n *ngFor=\"let item of getHeaderCells(); index as iHead\"\n desyFocusClickedCell\n [class]=\"\n [\n 'align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark',\n item.classes,\n ] | makeHtmlList\n \">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container\n *ngTemplateOutlet=\"tableSelect; context: { selectable: getSelectForItem(item) }\"></ng-container>\n <ng-template\n #tableSelect\n let-selectable=\"selectable\">\n <desy-select\n [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n [(ngModel)]=\"item.valueSelect\"\n (ngModelChange)=\"usePagination ? handleButtonSearch(item) : handleInputSearch(item)\"\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\"></desy-select>\n </ng-template>\n </ng-container>\n\n <div\n *ngIf=\"item.hasSelect && item.hasFilter\"\n class=\"pb-sm\"></div>\n\n <desy-search-bar\n *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\"\n [ngModelOptions]=\"{ standalone: true }\"\n (clickEvent)=\"usePagination ? handleButtonSearch(item) : null\"\n (ngModelChange)=\"!usePagination ? handleInputSearch(item) : null\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"></desy-search-bar>\n </td>\n </tr>\n\n <tr\n *ngFor=\"let row of getVisibleRows(); index as iRow\"\n class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td\n *ngIf=\"hasCheckboxes\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input\n type=\"checkbox\"\n class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\"\n (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\" />\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label\n class=\"sr-only block text-sm -mt-1\"\n [for]=\"getIdRowCheckbox(iRow)\">\n Selecciona fila {{ iRow }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th\n *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\"\n scope=\"row\"\n [class]=\"\n [\n 'px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark',\n cell.classes,\n ] | makeHtmlList\n \"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iRow\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td\n tabindex=\"-1\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iRow\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n\n <tfoot *ngIf=\"getFooterCells()\">\n <tr\n *ngFor=\"let foot of getFooterCells(); index as iFooter\"\n class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td\n *ngIf=\"hasCheckboxes\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input\n type=\"checkbox\"\n class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\"\n (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\" />\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label\n class=\"sr-only block text-sm -mt-1\"\n [for]=\"getIdRowCheckbox(iFooter)\">\n Selecciona fila {{ iFooter }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th\n *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\"\n scope=\"row\"\n [class]=\"\n [\n 'px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark',\n cell.classes,\n ] | makeHtmlList\n \"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iFooter\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td\n tabindex=\"-1\"\n desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell\n [row]=\"row\"\n [rowIndex]=\"iFooter\"\n [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container\n *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div\n *ngIf=\"wrapper; else tableContent\"\n [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n" }]
451
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { rows: [{
452
- type: Input
453
- }], head: [{
454
- type: Input
455
- }], foot: [{
456
- type: Input
457
- }], caption: [{
458
- type: Input
459
- }], captionClasses: [{
460
- type: Input
461
- }], firstCellIsHeader: [{
462
- type: Input
463
- }], hasCheckboxes: [{
464
- type: Input
465
- }], idPrefix: [{
466
- type: Input
467
- }], classes: [{
468
- type: Input
469
- }], checkboxClasses: [{
470
- type: Input
471
- }], id: [{
472
- type: Input
473
- }], wrapper: [{
474
- type: Input
475
- }], selectAllPages: [{
476
- type: Input
477
- }], totalItems: [{
478
- type: Input
479
- }], usePagination: [{
480
- type: Input
481
- }], captionComponent: [{
482
- type: ContentChildren,
483
- args: [TableCaptionComponent]
484
- }], headerComponent: [{
485
- type: ContentChildren,
486
- args: [TableAdvancedHeaderComponent]
487
- }], footerComponent: [{
488
- type: ContentChildren,
489
- args: [TableAdvancedFooterComponent]
490
- }], rowComponentList: [{
491
- type: ContentChildren,
492
- args: [TableAdvancedRowComponent]
493
- }], rowData: [{
494
- type: ViewChildren,
495
- args: [RowDirective]
496
- }], rowsChange: [{
497
- type: Output
498
- }], rowsChecked: [{
499
- type: Output
500
- }], allRowsChecked: [{
501
- type: Output
502
- }], recalculateTable: [{
503
- type: Output
504
- }], filterBy: [{
505
- type: Output
506
- }], selectedBy: [{
507
- type: Output
508
- }], sortBy: [{
509
- type: Output
510
- }], rowsUnChecked: [{
511
- type: Output
512
- }], checkboxComponent: [{
513
- type: ViewChild,
514
- args: ['checkbox']
515
- }] } });
516
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWR2YW5jZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzeS1hbmd1bGFyL3NyYy9saWIvZGVzeS10YWJsZXMvY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC90YWJsZS1hZHZhbmNlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LXRhYmxlcy9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlGQUFpRixDQUFDO0FBRXhILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFxQixPQUFPLEVBQXdCLE1BQU0sa0JBQWtCLENBQUM7QUFFcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFNUYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDNUYsT0FBTyxFQUFFLHlCQUF5QixF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b3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzL2ludGVybmFsL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBDaGVja2JveEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2NvbXBvbmVudHMvY2hlY2tib3hlcy9jaGVja2JveC1pdGVtL2NoZWNrYm94LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IFNlbGVjdEl0ZW1EYXRhIH0gZnJvbSAnLi4vLi4vLi4vZGVzeS1mb3Jtcy9pbnRlcmZhY2VzL3NlbGVjdC1pdGVtLWRhdGEnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzJztcbmltcG9ydCB7IERlc3lDb250ZW50Q2hpbGQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGVjb3JhdG9ycy9kZXN5LWNvbnRlbnQtY2hpbGQuZGVjb3JhdG9yJztcbmltcG9ydCB7IFNlYXJjaFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3NlYXJjaC11dGlscyc7XG5pbXBvcnQgeyBDZWxsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jZWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSb3dEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGVhZENlbGxNb2RlbERhdGEsIE9yZGVyQnksIFJvd0RhdGEsIFdyYXBwZXJEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWNhbGN1bGF0ZS10YWJsZS1wYXJhbXMnO1xuaW1wb3J0IHsgVGFibGVDYXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFibGUvY29tcG9uZW50cy90YWJsZS1jYXB0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi8uLi8uLi8uLi9kZXN5LWNvbW1vbnMvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtZm9vdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1oZWFkZXItY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLXNlbGVjdC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZXN5LXRhYmxlLWFkdmFuY2VkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVBZHZhbmNlZENvbXBvbmVudFxuICBleHRlbmRzIEFjY2Vzc2liaWxpdHlDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3lcbntcbiAgX3Jvd3M6IFJvd0RhdGFbXTsgLy8gb3JpZ2luYWwgZGF0YVxuICBASW5wdXQoKVxuICBzZXQgcm93cyhyb3dzOiBSb3dEYXRhW10pIHtcbiAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gIH1cbiAgZ2V0IHJvd3MoKTogUm93RGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgfVxuICBASW5wdXQoKSBoZWFkOiBIZWFkQ2VsbE1vZGVsRGF0YVtdO1xuICBASW5wdXQoKSBmb290OiBSb3dEYXRhW107XG5cbiAgQElucHV0KCkgY2FwdGlvbjogc3RyaW5nO1xuICBASW5wdXQoKSBjYXB0aW9uQ2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBmaXJzdENlbGxJc0hlYWRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgaGFzQ2hlY2tib3hlczogYm9vbGVhbjtcbiAgQElucHV0KCkgaWRQcmVmaXg6IHN0cmluZztcbiAgQElucHV0KCkgY2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBjaGVja2JveENsYXNzZXM6IHN0cmluZztcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgd3JhcHBlcjogV3JhcHBlckRhdGE7XG5cbiAgQElucHV0KCkgc2VsZWN0QWxsUGFnZXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuXG4gIEBJbnB1dCgpIHVzZVBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICByb3dzQ2hlY2tlZEluc2lkZSA9IHt9O1xuICBudW1iZXJPZlNlbGVjdGVkUm93cyA9IDA7XG5cbiAgQERlc3lDb250ZW50Q2hpbGQoKVxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQ2FwdGlvbkNvbXBvbmVudClcbiAgY2FwdGlvbkNvbXBvbmVudDogVGFibGVDYXB0aW9uQ29tcG9uZW50O1xuXG4gIEBEZXN5Q29udGVudENoaWxkKClcbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUFkdmFuY2VkSGVhZGVyQ29tcG9uZW50KVxuICBoZWFkZXJDb21wb25lbnQ6IFRhYmxlQWR2YW5jZWRIZWFkZXJDb21wb25lbnQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50KSBmb290ZXJDb21wb25lbnQ6IFF1ZXJ5TGlzdDxUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50PjtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpIHJvd0NvbXBvbmVudExpc3Q6IFF1ZXJ5TGlzdDxUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50PjtcbiAgQFZpZXdDaGlsZHJlbihSb3dEaXJlY3RpdmUpIHJvd0RhdGE6IFF1ZXJ5TGlzdDxSb3dEaXJlY3RpdmU+O1xuXG4gIEBPdXRwdXQoKSByb3dzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcm93c0NoZWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhbGxSb3dzQ2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlY2FsY3VsYXRlVGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY2FsY3VsYXRlVGFibGVQYXJhbXM+KCk7XG5cbiAgQE91dHB1dCgpIGZpbHRlckJ5OiBFdmVudEVtaXR0ZXI8T2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRCeTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KCkgc29ydEJ5OiBFdmVudEVtaXR0ZXI8T2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuXG4gIEBPdXRwdXQoKSByb3dzVW5DaGVja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHZpc2libGVSb3dzOiBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50W107XG4gIG9yZGVyQnlUeXBlID0gT3JkZXJCeTtcbiAgaXNSZXNldDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHJpdmF0ZSByb3dzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm93c1N1YnNjcmlwdGlvbiA9IHRoaXMucm93Q29tcG9uZW50TGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm93c1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3dzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1udHNGb2N1cyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXhdJyk7XG4gICAgaWYgKGVsZW1udHNGb2N1cykge1xuICAgICAgZWxlbW50c0ZvY3VzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIH1cbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgbGFzIGZpbGFzIHZpc2libGVzIHRyYXMgcmVhbGl6YXJzZSB1bmEgYsO6c3F1ZWRhIG8gdW5hIG9yZGVuYWNpw7NuXG4gICAqL1xuICByZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCByZWNhbGN1bGF0ZVBhcmFtcyA9IHRoaXMuYnVpbGRSZWNhbGN1bGF0ZVBhcmFtcygpO1xuXG4gICAgLy8gU2kgc2UgY2FwdHVyYSBlbCBldmVudG8gcmVjYWxjdWxhdGVUYWJsZSBzZSBkZWphIGFsIHVzdWFyaW8gbGEgcmVzcG9uc2FiaWxpZGFkIGRlIGZpbHRyYXIgeSBvcmRlbmFyIGxvcyBlbGVtZW50b3MuXG4gICAgaWYgKHRoaXMucmVjYWxjdWxhdGVUYWJsZS5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZWNhbGN1bGF0ZVRhYmxlLmVtaXQocmVjYWxjdWxhdGVQYXJhbXMpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2UgZGViZW4gbW9zdHJhciB0b2RhcyBsYXMgZmlsYXMgdGVtcG9yYWxtZW50ZSBwYXJhIHBvZGVyIGFwbGljYXIgZWwgZmlsdHJvIHkgbGEgb3JkZW5hY2nDs24gc29icmUgZWwgY29udGVuaWRvIGluc2VydGFkb1xuICAgICAgdGhpcy52aXNpYmxlUm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIFNlIGFwbGljYSBlbCBmaWx0cm8geSBsYSBvcmRlbmFjacOzblxuICAgICAgaWYgKCF0aGlzLnVzZVBhZ2luYXRpb24pIHtcbiAgICAgICAgbGV0IHJvd0RhdGEgPSB0aGlzLmZpbHRlclJvd3MocmVjYWxjdWxhdGVQYXJhbXMsIHRoaXMucm93RGF0YS50b0FycmF5KCkpO1xuICAgICAgICByb3dEYXRhID0gdGhpcy5zb3J0Um93cyhyZWNhbGN1bGF0ZVBhcmFtcywgcm93RGF0YSk7XG4gICAgICAgIHRoaXMudmlzaWJsZVJvd3MgPSByb3dEYXRhLm1hcCgocikgPT4gci5kZXN5Um93KSBhcyBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50W107XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja2JveENvbXBvbmVudCAmJiAhdGhpcy5zZWxlY3RBbGxQYWdlcyAmJiB0aGlzLnVzZVBhZ2luYXRpb24pIHtcbiAgICAgIC8vIFNlbGVjdCBvbmx5IG9uZSBwYWdlIGxvZ2ljLCBzaG91bGQgYmUgdXNlZCB3aGVuIHVzZVBhZ2luYXRpb24gdHJ1ZS5cbiAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSB0aGlzLmdldFJvd3MoKS5ldmVyeSgocm93KSA9PiB0aGlzLnJvd3NDaGVja2VkSW5zaWRlICYmIHRoaXMucm93c0NoZWNrZWRJbnNpZGVbcm93LmlkXSk7XG4gICAgICBjb25zdCBhbnlDaGVja2VkID0gdGhpcy5nZXRSb3dzKCkuc29tZSgocm93KSA9PiB0aGlzLnJvd3NDaGVja2VkSW5zaWRlICYmIHRoaXMucm93c0NoZWNrZWRJbnNpZGVbcm93LmlkXSk7XG5cbiAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPSAhYWxsQ2hlY2tlZCAmJiBhbnlDaGVja2VkO1xuICAgICAgdGhpcy5jaGVja2JveENvbXBvbmVudC5jaGVja2VkID0gYWxsQ2hlY2tlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydXllIGxvcyBwYXLDoW1ldHJvcyBuZWNlc2FyaW9zIHBhcmEgcmVjYWxjdWxhciBsYSB0YWJsYSwgaW5kaWNhbmRvIGxvcyBmaWx0cm9zIHkgbGEgb3JkZW5hY2nDs25cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSZWNhbGN1bGF0ZVBhcmFtcygpOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgIHNvcnQ6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCkgYXMgKEhlYWRDZWxsTW9kZWxEYXRhIHwgVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnQpW107XG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoaGVhZGVyQ2VsbCwgaGVhZGVyQ2VsbEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChoZWFkZXJDZWxsLmhhc0ZpbHRlciAmJiBoZWFkZXJDZWxsLmFjdGl2ZUZpbHRlcikge1xuICAgICAgICAgIHBhcmFtcy5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgY29sdW1uSW5kZXg6IGhlYWRlckNlbGxJbmRleCxcbiAgICAgICAgICAgIGZpbHRlclRleHQ6IGhlYWRlckNlbGwudmFsdWVGaWx0ZXIsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBoZWFkZXJDZWxsLmlkZW50aWZpZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVhZGVyQ2VsbC5oYXNTZWxlY3QgJiYgaGVhZGVyQ2VsbC5hY3RpdmVTZWxlY3QpIHtcbiAgICAgICAgICBwYXJhbXMuZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICAgIGNvbHVtbkluZGV4OiBoZWFkZXJDZWxsSW5kZXgsXG4gICAgICAgICAgICBmaWx0ZXJUZXh0OiBoZWFkZXJDZWxsLnZhbHVlU2VsZWN0LFxuICAgICAgICAgICAgaWRlbnRpZmllcjogaGVhZGVyQ2VsbC5pZGVudGlmaWVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JkZXJCeUNvbHVtbkluZGV4ID0gaGVhZC5maW5kSW5kZXgoKGNlbGwpID0+IGNlbGwub3JkZXJCeSAmJiBjZWxsLm9yZGVyQnkgIT09IE9yZGVyQnkubm9uZSk7XG4gICAgICBwYXJhbXMuc29ydCA9XG4gICAgICAgIG9yZGVyQnlDb2x1bW5JbmRleCA+PSAwID8geyBjb2x1bW5JbmRleDogb3JkZXJCeUNvbHVtbkluZGV4LCBvcmRlcjogaGVhZFtvcmRlckJ5Q29sdW1uSW5kZXhdLm9yZGVyQnkgfSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogZnVuY2lvbmVzIGRlIHJlY29nZXIgaWRzLCB5IGNhcmFjdGVyaXN0aWNhc1xuICAgKi9cblxuICBoYXNGaWx0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgcmV0dXJuIGhlYWQgPyBoZWFkLmZpbmRJbmRleCgoY2VsbCkgPT4gY2VsbC5oYXNGaWx0ZXIgfHwgY2VsbC5oYXNTZWxlY3QpID49IDAgOiBmYWxzZTtcbiAgfVxuXG4gIGdldEhlYWRlckNlbGxzKCk6IEhlYWRDZWxsTW9kZWxEYXRhW10gfCBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJDb21wb25lbnQgJiYgdGhpcy5oZWFkZXJDb21wb25lbnQuY2VsbHMubGVuZ3RoID4gMFxuICAgICAgPyB0aGlzLmhlYWRlckNvbXBvbmVudC5jZWxscy50b0FycmF5KClcbiAgICAgIDogdGhpcy5oZWFkO1xuICB9XG5cbiAgZ2V0Rm9vdGVyQ2VsbHMoKTogUm93RGF0YVtdIHwgVGFibGVBZHZhbmNlZEZvb3RlckNvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb290ZXJDb21wb25lbnQgJiYgdGhpcy5mb290ZXJDb21wb25lbnQubGVuZ3RoID4gMCA/IHRoaXMuZm9vdGVyQ29tcG9uZW50LnRvQXJyYXkoKSA6IHRoaXMuZm9vdDtcbiAgfVxuXG4gIGdldFJvd3MoKSB7XG4gICAgbGV0IHJvd3MgPSBbXTtcbiAgICBpZiAodGhpcy5yb3dDb21wb25lbnRMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICByb3dzID0gdGhpcy5yb3dDb21wb25lbnRMaXN0LnRvQXJyYXkoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm93cykge1xuICAgICAgcm93cyA9IHRoaXMucm93cztcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogU2kgc2Ugc29icmVlc2NyaWJlICBlbCBjb21wb3J0YW1pZW50byBwb3IgZGVmZWN0byBkZSBmaWx0cmFkbyB5IG9yZGVuYWNpw7NuLCBzZSB1dGlsaXphcsOhbiBsYXMgaW5kaWNhZGFzIGRlc2RlIGZ1ZXJhIGRlbFxuICAgKiBjb21wb25lbnRlICh5YSBzZWEgcG9yIHBhcsOhbWV0cm8gbyBwb3IgY29udGVuaWRvKS5cbiAgICogU2kgbm8gc2Ugc29icmVlc2NyaWJlLCBkZXZ1ZWx2ZSBsYXMgZmlsYXMgY2FsY3VsYWRhcy5cbiAgICovXG4gIGdldFZpc2libGVSb3dzKCkge1xuICAgIGxldCByb3dzID0gdGhpcy5yZWNhbGN1bGF0ZVRhYmxlLm9ic2VydmVycy5sZW5ndGggPiAwID8gdGhpcy5nZXRSb3dzKCkgOiB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0QWxsUGFnZXMgJiZcbiAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCAmJlxuICAgICAgKHRoaXMuY2hlY2tib3hDb21wb25lbnQuY2hlY2tlZCB8fCB0aGlzLnVuc2VsZWN0ZWRSb3dzLnNpemUgPiAwKVxuICAgICkge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgcm93LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5yb3dzQ2hlY2tlZEluc2lkZSkge1xuICAgICAgY29uc3Qgcm93ID0gcm93cy5maW5kKChyKSA9PiByLmlkID09IFN0cmluZyhpZCkpO1xuICAgICAgaWYgKHJvdykge1xuICAgICAgICByb3cuY2hlY2tlZCA9IHRoaXMucm93c0NoZWNrZWRJbnNpZGVbaWRdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGdldElkUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWRQcmVmaXggPyB0aGlzLmlkUHJlZml4IDogJ2lkLXRhYmxlLXJvdyc7XG4gIH1cblxuICBnZXRJZEhlYWRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1oZWFkZXItJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0SWRSb3dDaGVja2JveChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1jaGVja2JveC0nICsgaW5kZXg7XG4gIH1cblxuICBnZXRJZEhlYWRlckZpbHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1oZWFkZXItZmlsdGVyLScgKyBpbmRleDtcbiAgfVxuXG4gIGdldElkSGVhZGVyU2VsZWN0KGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldElkUHJlZml4KCkgKyAnLWhlYWRlci1zZWxlY3QtJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0Q2FwdGlvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FwdGlvbkNvbXBvbmVudCA/IHRoaXMuY2FwdGlvbkNvbXBvbmVudC5jbGFzc2VzIDogdGhpcy5jYXB0aW9uQ2xhc3NlcztcbiAgfVxuXG4gIGdldFN0cmluZ09yZGVyQnkob3JkZXJCeTogT3JkZXJCeSk6IHN0cmluZyB7XG4gICAgaWYgKG9yZGVyQnkgPT09IE9yZGVyQnkuYXNjKSB7XG4gICAgICByZXR1cm4gJ2FzY2VuZGluZyc7XG4gICAgfSBlbHNlIGlmIChvcmRlckJ5ID09PSBPcmRlckJ5LmRlc2MpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfSBlbHNlIGlmIChvcmRlckJ5ID09PSBPcmRlckJ5Lm5vbmUpIHtcbiAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0Rm9ySXRlbShpdGVtOiBhbnkpOiBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gaXRlbS5zZWxlY3RDb21wb25lbnQgPyBpdGVtLnNlbGVjdENvbXBvbmVudCA6IG51bGw7XG4gIH1cblxuICBnZXRJdGVtU2VsZWN0T3B0aW9ucyhpdGVtOiBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50KTogU2VsZWN0SXRlbURhdGFbXSB7XG4gICAgcmV0dXJuIGl0ZW0uc2VsZWN0SXRlbUNvbXBvbmVudExpc3QgJiYgaXRlbS5zZWxlY3RJdGVtQ29tcG9uZW50TGlzdC5sZW5ndGggPiAwXG4gICAgICA/IGl0ZW0uc2VsZWN0SXRlbUNvbXBvbmVudExpc3QudG9BcnJheSgpXG4gICAgICA6IGl0ZW0uaXRlbXM7XG4gIH1cblxuICBnZXRDb250ZW50Q29tcG9uZW50KGl0ZW06IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50KTogQ29udGVudENvbXBvbmVudCB7XG4gICAgcmV0dXJuIGl0ZW0uY29udGVudENvbXBvbmVudCA/IGl0ZW0uY29udGVudENvbXBvbmVudCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tzXG4gICAqL1xuICBoYW5kbGVDaGVja2JveENoYW5nZShyb3c6IFJvd0RhdGEgfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKHJvdyBpbnN0YW5jZW9mIFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpIHtcbiAgICAgIHJvdy5jaGVja2VkQ2hhbmdlLmVtaXQocm93LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLm5vdGlmeUNoZWNrZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtaXRlIGRlc21hcmNhciB0b2RhcyBsYXMgZmlsYXNcbiAgICovXG4gIHByaXZhdGUgdW5jaGVja0FsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3NDaGVja2VkSW5zaWRlID0ge307XG4gICAgdGhpcy51bnNlbGVjdGVkUm93cy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJvd3MgPSAwO1xuXG4gICAgdGhpcy5nZXRSb3dzKCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgY29uc3QgbXVzdEVtaXQgPSByLmNoZWNrZWQgJiYgciBpbnN0YW5jZW9mIFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQ7XG4gICAgICByLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChtdXN0RW1pdCkge1xuICAgICAgICAociBhcyBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50KS5jaGVja2VkQ2hhbmdlLmVtaXQoci5jaGVja2VkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUNoZWNrZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIHVuc2VsZWN0ZWRSb3dzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTsgLy8gVmFyaWFibGUgZ2xvYmFsIHBhcmEgYWxtYWNlbmFyIGxvcyBpdGVtcyBkZXNlbGVjY2lvbmFkb3MgY3VhbmRvIHByZXZpYW1lbnRlIHNlIGhhIHNlbGVjY2lvbmFkbyB0b2Rvc1xuICBzZWxlY3RlZEFsbFJvd3NDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBOb3RpZmljYSBjYW1iaW9zIGVuIGxhcyBmaWxhc1xuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlDaGVja2VkQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJvd0NvbXBvbmVudExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd0NoZWNrczogYW55ID0ge307XG4gICAgdGhpcy5nZXRSb3dzKCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgcm93Q2hlY2tzW3IuaWRdID0gISFyLmNoZWNrZWQ7IC8vIFNlIGFwbGljYW4gdGFtYmnDqW4gYSBsYXMgbm8gdmlzaWJsZXNcbiAgICAgIGlmICh0aGlzLnNlbGVjdEFsbFBhZ2VzICYmIHRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCkge1xuICAgICAgICBpZiAoci5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5kZWxldGUoci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5hZGQoci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5udW1iZXJPZlNlbGVjdGVkUm93cyA9IHRoaXMudG90YWxJdGVtcyAtIHRoaXMudW5zZWxlY3RlZFJvd3Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucm93c0NoZWNrZWRJbnNpZGUgPSB7IC4uLnRoaXMucm93c0NoZWNrZWRJbnNpZGUsIC4uLnJvd0NoZWNrcyB9O1xuICAgIHRoaXMucm93c0NoZWNrZWQuZW1pdCh0aGlzLnJvd3NDaGVja2VkSW5zaWRlKTtcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoZWNrYm94Q29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IHZpc2libGVSb3dzID0gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICAgICAgICBjb25zdCBhbnlDaGVja2VkID1cbiAgICAgICAgICB0aGlzLnNlbGVjdEFsbFBhZ2VzICYmIHRoaXMudG90YWxJdGVtcyAmJiB0aGlzLnVzZVBhZ2luYXRpb25cbiAgICAgICAgICAgID8gdGhpcy5hcmVBbnlSb3dzQ2hlY2tlZCgpXG4gICAgICAgICAgICA6IHZpc2libGVSb3dzLnNvbWUoKHIpID0+IHIuY2hlY2tlZCk7XG4gICAgICAgIGNvbnN0IGFsbENoZWNrZWQgPVxuICAgICAgICAgIHRoaXMuc2VsZWN0QWxsUGFnZXMgJiYgdGhpcy50b3RhbEl0ZW1zICYmIHRoaXMudXNlUGFnaW5hdGlvblxuICAgICAgICAgICAgPyB0aGlzLmFyZUFsbFJvd3NDaGVja2VkKClcbiAgICAgICAgICAgIDogdmlzaWJsZVJvd3MuZXZlcnkoKHIpID0+IHIuY2hlY2tlZCk7XG4gICAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPVxuICAgICAgICAgICghdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkICYmIHRoaXMuc2VsZWN0QWxsUGFnZXMgJiYgdGhpcy51c2VQYWdpbmF0aW9uICYmIGFueUNoZWNrZWQgJiYgIWFsbENoZWNrZWQpIHx8XG4gICAgICAgICAgKGFueUNoZWNrZWQgJiYgIWFsbENoZWNrZWQpIHx8XG4gICAgICAgICAgKHRoaXMudW5zZWxlY3RlZFJvd3Muc2l6ZSA+IDAgJiYgdGhpcy51bnNlbGVjdGVkUm93cy5zaXplIDwgdGhpcy50b3RhbEl0ZW1zKTtcbiAgICAgICAgdGhpcy5jaGVja2JveENvbXBvbmVudC5jaGVja2VkID0gYWxsQ2hlY2tlZCAmJiB0aGlzLnVuc2VsZWN0ZWRSb3dzLnNpemUgPT0gMCAmJiB2aXNpYmxlUm93cy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCB7IGNoZWNrZWQsIGluZGV0ZXJtaW5hdGVDaGVja2VkIH0gPSB0aGlzLmNoZWNrYm94Q29tcG9uZW50O1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRBbGxSb3dzQ2hlY2tlZCAmJiBjaGVja2VkKSB0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgJiYgIWNoZWNrZWQgJiYgIWluZGV0ZXJtaW5hdGVDaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5hbGxSb3dzQ2hlY2tlZC5lbWl0KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV0ZXJtaW5hdGVDaGVja2VkIHx8ICFjaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5hbGxSb3dzQ2hlY2tlZC5lbWl0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0QWxsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5yb3dzVW5DaGVja2VkLmVtaXQoQXJyYXkuZnJvbSh0aGlzLnVuc2VsZWN0ZWRSb3dzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFyZUFsbFJvd3NDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXModGhpcy5yb3dzQ2hlY2tlZEluc2lkZSk7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gdGhpcy50b3RhbEl0ZW1zICYmIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJvd3MgIT09IHRoaXMudG90YWxJdGVtcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhbGxUcnVlID0gaXRlbXMuZXZlcnkoKGtleSkgPT4gdGhpcy5yb3dzQ2hlY2tlZEluc2lkZVtrZXldKTtcbiAgICByZXR1cm4gYWxsVHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXJlQW55Um93c0NoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyh0aGlzLnJvd3NDaGVja2VkSW5zaWRlKTtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGFueVRydWUgPSBpdGVtcy5zb21lKChrZXkpID0+IHRoaXMucm93c0NoZWNrZWRJbnNpZGVba2V5XSk7XG4gICAgcmV0dXJuIGFueVRydWU7XG4gIH1cblxuICAvKipcbiAgICogYnVzcXVlZGFcbiAgICovXG4gIGhhbmRsZUlucHV0U2VhcmNoKGl0ZW06IEhlYWRDZWxsTW9kZWxEYXRhKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaGFzRmlsdGVyKSB7XG4gICAgICAvLyBzaSB0aWVuZSBidXNjYWRvclxuICAgICAgaXRlbS5hY3RpdmVGaWx0ZXIgPSAhIWl0ZW0udmFsdWVGaWx0ZXI7XG4gICAgICB0aGlzLnVuY2hlY2tBbGwoKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0uaGFzU2VsZWN0KSB7XG4gICAgICAvL1NpIHRpZW5lIHNlbGVjY2lvbmFibGVcbiAgICAgIGl0ZW0uYWN0aXZlU2VsZWN0ID0gISFpdGVtLnZhbHVlU2VsZWN0O1xuICAgICAgdGhpcy51bmNoZWNrQWxsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpO1xuICB9XG5cbiAgaGFuZGxlQnV0dG9uU2VhcmNoKGl0ZW06IEhlYWRDZWxsTW9kZWxEYXRhKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaGFzRmlsdGVyKSB7XG4gICAgICAvLyBzaSB0aWVuZSBidXNjYWRvclxuICAgICAgaXRlbS5hY3RpdmVGaWx0ZXIgPSAhIWl0ZW0udmFsdWVGaWx0ZXI7XG4gICAgICB0aGlzLmZpbHRlckJ5LmVtaXQoeyBpZDogaXRlbS5pZGVudGlmaWVyLCB2YWx1ZTogaXRlbS52YWx1ZUZpbHRlciB9KTtcbiAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgIH1cbiAgICBpZiAoaXRlbS5oYXNTZWxlY3QpIHtcbiAgICAgIC8vU2kgdGllbmUgc2VsZWNjaW9uYWJsZVxuICAgICAgaXRlbS5hY3RpdmVTZWxlY3QgPSAhIWl0ZW0udmFsdWVTZWxlY3Q7XG4gICAgICB0aGlzLnNlbGVjdGVkQnkuZW1pdChpdGVtLnZhbHVlU2VsZWN0KTtcbiAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZSBmaWx0cmFuIGxhcyBmaWxhcyBzZWfDum4gbG8gZXNwZWNpZmljYWRvIGVuIGxhIGJhcnJhIGRlIGLDunNxdWVkYSBkZSBjYWRhIGNvbHVtbmEuXG4gICAqIFNpIG5vIGhheSBiw7pzcXVlZGEgc3NlIGRldnVlbHZlbiB0b2RhcyBsYXMgZmlsYXMuXG4gICAqIEBwYXJhbSByZWNhbGN1bGF0ZVBhcmFtcyBwYXJhbWV0cm9zIHBhcmEgcmVjYWxjdWxhciBsb3MgZWxlbWVudG9zIHZpc2libGVzXG4gICAqIEBwYXJhbSByb3dzIGxpc3RhIGNvbiB0b2RhcyBsYXMgZmlsYXNcbiAgICogQHJldHVybiBsaXN0YSBkZSBmaWxhcyBmaWx0cmFkYVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJSb3dzKHJlY2FsY3VsYXRlUGFyYW1zOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zLCByb3dzOiBSb3dEaXJlY3RpdmVbXSk6IFJvd0RpcmVjdGl2ZVtdIHtcbiAgICBsZXQgZmlsdGVyZWRSb3dzID0gcm93cztcbiAgICByZWNhbGN1bGF0ZVBhcmFtcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgZmlsdGVyZWRSb3dzID0gZmlsdGVyZWRSb3dzLmZpbHRlcigocm93KSA9PlxuICAgICAgICBTZWFyY2hVdGlscy5jb250YWluc0FueVdvcmRGcm9tKHJvdy5nZXRDZWxsKGZpbHRlci5jb2x1bW5JbmRleCkuZ2V0Q29udGVudCgpLCBmaWx0ZXIuZmlsdGVyVGV4dClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkUm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvcmRlbmFjaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBQZXJtaXRlIGluZGljYXIgcXVlIHNlIGRlYmUgb3JkZW5hciBsYSB0YWJsYVxuICAgKiBAcGFyYW0gaW5kZXggaW5kaWNlIGRlIGxhIGNvbHVtbmFcbiAgICovXG4gIGhhbmRsZVNvcnRCeUNvbHVtbihpbmRleDogbnVtYmVyLCBldmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgbGV0IG9yZGVyID0gT3JkZXJCeS5hc2M7XG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbCwgY2VsbEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjZWxsLm9yZGVyQnkpIHtcbiAgICAgICAgICBpZiAoY2VsbEluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgb3JkZXIgPSB0aGlzLmdldE5leHREaXJlY3Rpb24oY2VsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNlbGwub3JkZXJCeSA9IGNlbGxJbmRleCA9PT0gaW5kZXggPyB0aGlzLmdldE5leHREaXJlY3Rpb24oY2VsbCkgOiBPcmRlckJ5Lm5vbmU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnNvcnRCeS5lbWl0KHsgaWQ6IGluZGV4LCBvcmRlcjogb3JkZXIgfSk7XG4gICAgICB0aGlzLnVuY2hlY2tBbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpO1xuICAgIH1cbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlbmEgbGFzIGZpbGFzIGluZGljYWRhcyBzZWfDum4gbGEgY29sdW1uYSBlc3BlY2lmaWNhZGEgZW4gbGEgY2FiZWNlcmFcbiAgICogQHBhcmFtIHJlY2FsY3VsYXRlUGFyYW1zIHBhcmFtZXRyb3MgcGFyYSByZWNhbGN1bGFyIGxvcyBlbGVtZW50b3MgdmlzaWJsZXNcbiAgICogQHBhcmFtIHJvd3MgZmlsYXMgZGUgbGEgdGFibGEgYSBvcmRlbmFyXG4gICAqIEByZXR1cm4gbWlzbWFzIGZpbGFzIHBlcm8gb3JkZW5hZGFzIHBvciBsYSBjb2x1bW5hIGluZGljYWRhXG4gICAqL1xuICBwcml2YXRlIHNvcnRSb3dzKHJlY2FsY3VsYXRlUGFyYW1zOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zLCByb3dzOiBSb3dEaXJlY3RpdmVbXSk6IFJvd0RpcmVjdGl2ZVtdIHtcbiAgICBsZXQgc29ydGVkUm93cyA9IHJvd3M7XG4gICAgaWYgKHJlY2FsY3VsYXRlUGFyYW1zLnNvcnQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5jb2x1bW5JbmRleDtcbiAgICAgIGNvbnN0IGlzQXNjID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5vcmRlciA9PT0gT3JkZXJCeS5hc2M7XG4gICAgICBzb3J0ZWRSb3dzID0gcm93cy5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmVDZWxsQ29udGVudChhLmdldENlbGwoY29sdW1uSW5kZXgpLCBiLmdldENlbGwoY29sdW1uSW5kZXgpLCBpc0FzYykpO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmEgZWwgY29udGVuaWRvIGRlIGRvcyBjZWxkYXMuIEVzdGUgc2UgaW52aWVydGUgc2kgZWwgb3JkZW4gZXNwZWNpZmljYWRvIGVzIGRlc2NlbmRlbnRlLlxuICAgKi9cbiAgY29tcGFyZUNlbGxDb250ZW50KGE6IENlbGxEaXJlY3RpdmUsIGI6IENlbGxEaXJlY3RpdmUsIGlzQXNjOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IGFDb21wYXJhYmxlID0gdGhpcy5jbGVhbkN1cnJlbmN5KGEuZ2V0Q29udGVudCgpKS50cmltKCk7XG4gICAgY29uc3QgYkNvbXBhcmFibGUgPSB0aGlzLmNsZWFuQ3VycmVuY3koYi5nZXRDb250ZW50KCkpLnRyaW0oKTtcbiAgICBjb25zdCBudW1iZXJSZWdleCA9IC9eLT9cXGQrKFxcLnwsKT9cXGQqJC87XG4gICAgY29uc3QgZGF0ZVJlZ2V4ID0gL14oXFxkezJ9KShcXC98LSkoXFxkezJ9KShcXC98LSkoXFxkezR9KSggKFxcZHsyfSk6KFxcZHsyfSkoOihcXGR7Mn0pKT8pPyQvO1xuICAgIGlmIChhQ29tcGFyYWJsZSAmJiBiQ29tcGFyYWJsZSkge1xuICAgICAgaWYgKG51bWJlclJlZ2V4LnRlc3QoYUNvbXBhcmFibGUpICYmIG51bWJlclJlZ2V4LnRlc3QoYkNvbXBhcmFibGUpKSB7XG4gICAgICAgIC8vIE51bWVyb3NcbiAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChhQ29tcGFyYWJsZSkgLSBwYXJzZUZsb2F0KGJDb21wYXJhYmxlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0ZVJlZ2V4LnRlc3QoYUNvbXBhcmFibGUpICYmIGRhdGVSZWdleC50ZXN0KGJDb21wYXJhYmxlKSkge1xuICAgICAgICAvLyBGZWNoYXNcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZURhdGVUaW1lKGFDb21wYXJhYmxlKSAtIHRoaXMucGFyc2VEYXRlVGltZShiQ29tcGFyYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0b1xuICAgICAgICByZXN1bHQgPSBhQ29tcGFyYWJsZS5sb2NhbGVDb21wYXJlKGJDb21wYXJhYmxlLCAnZXMnLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScsIGlnbm9yZVB1bmN0dWF0aW9uOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICogKGlzQXNjID8gMSA6IC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlVGltZShpbnB1dDogc3RyaW5nKSB7XG4gICAgLy8gMzEvMTIvMjAyMyAxMjoxMjoxMiBvciAzMS0xMi0yMDIzIDEyOjEyOjEyIGZlY2hhcyBxdWUgYWNlcHRhLCBoaDptbTpzcyBlcyBvcGNpb25hbFxuICAgIGxldCBbZGF0ZVBhcnQsIHRpbWVQYXJ0XSA9IGlucHV0LnNwbGl0KCcgJyk7XG4gICAgbGV0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGVQYXJ0LnNwbGl0KC9cXC98LS8pLm1hcChOdW1iZXIpO1xuICAgIGxldCBbaG91cnMgPSAwLCBtaW51dGVzID0gMCwgc2Vjb25kcyA9IDBdID0gKHRpbWVQYXJ0ID8gdGltZVBhcnQuc3BsaXQoJzonKSA6IFtdKS5tYXAoTnVtYmVyKTtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcyk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlIGNhbGN1bGEgbGEgb3JkZW5hY2nDs24gbnVldmFcbiAgICovXG4gIHByaXZhdGUgZ2V0TmV4dERpcmVjdGlvbihpdGVtOiBIZWFkQ2VsbE1vZGVsRGF0YSk6IE9yZGVyQnkge1xuICAgIGlmIChpdGVtLm9yZGVyQnkgPT09IE9yZGVyQnkubm9uZSB8fCBpdGVtLm9yZGVyQnkgPT09IE9yZGVyQnkuZGVzYykge1xuICAgICAgcmV0dXJuIE9yZGVyQnkuYXNjO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT3JkZXJCeS5kZXNjO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzaSBlcyB1bmEgY2FudGlkYWQgZGUgZGluZXJvIHNlIHF1aXRhIOKCrCBwYXJhIHBvZGVyIGNvbXBhcmFyIGxvcyBudW1lcm9zXG4gICAqL1xuICBwcml2YXRlIGNsZWFuQ3VycmVuY3kodHh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHR4dCA9IHR4dC5yZXBsYWNlKC/igqwvZywgJycpO1xuICAgIHJldHVybiB0eHQ7XG4gIH1cblxuICBzZWxlY3RGaWx0ZXIoaXRlbTogVGFibGVBZHZhbmNlZFNlbGVjdENvbXBvbmVudCwgaXRlbVZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpdGVtLnZhbHVlQ2hhbmdlLmVtaXQoaXRlbVZhbHVlKTtcblxuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgIGlmIChoZWFkICYmIHJvd3MpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbDogVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnQsIGNlbGxJbmRleCkgPT4ge30pO1xuICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICBAVmlld0NoaWxkKCdjaGVja2JveCcpIGNoZWNrYm94Q29tcG9uZW50OiBDaGVja2JveEl0ZW1Db21wb25lbnQ7XG5cbiAgY2hlY2tVbmNoZWNrQWxsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGVja2JveENvbXBvbmVudCkgcmV0dXJuO1xuXG4gICAgbGV0IHsgaW5kZXRlcm1pbmF0ZUNoZWNrZWQsIGNoZWNrZWQgfSA9IHRoaXMuY2hlY2tib3hDb21wb25lbnQ7XG4gICAgaWYgKCFjaGVja2VkKSB7XG4gICAgICB0aGlzLmNoZWNrYm94Q29tcG9uZW50LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2hlY2tib3hDb21wb25lbnQuaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGluZGV0ZXJtaW5hdGVDaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsUm93c0NoZWNrZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFJvd3NDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJvd3MgPSB0aGlzLnRvdGFsSXRlbXM7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdEFsbFBhZ2VzKSB0aGlzLnJvd3NDaGVja2VkSW5zaWRlID0ge307XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0ge307XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIHJvdy5jaGVja2VkID0gaW5kZXRlcm1pbmF0ZUNoZWNrZWQgPyBmYWxzZSA6IGNoZWNrZWQ7XG4gICAgICAgIGlmICghaW5kZXRlcm1pbmF0ZUNoZWNrZWQpIHNlbGVjdGVkUm93c1tyb3cuaWRdID0gY2hlY2tlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5hbGxSb3dzQ2hlY2tlZC5lbWl0KHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChpbmRldGVybWluYXRlQ2hlY2tlZCB8fCAhY2hlY2tlZCkge1xuICAgICAgICB0aGlzLmFsbFJvd3NDaGVja2VkLmVtaXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0QWxsUGFnZXMpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkUm93cy5jbGVhcigpO1xuICAgICAgICB0aGlzLnJvd3NVbkNoZWNrZWQuZW1pdChBcnJheS5mcm9tKHRoaXMudW5zZWxlY3RlZFJvd3MpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucm93c0NoZWNrZWRJbnNpZGUgPSB7IC4uLnRoaXMucm93c0NoZWNrZWRJbnNpZGUsIC4uLnNlbGVjdGVkUm93cyB9O1xuICAgICAgdGhpcy5yb3dzQ2hlY2tlZC5lbWl0KHRoaXMucm93c0NoZWNrZWRJbnNpZGUpO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0YWJsZUNvbnRlbnQ+XG4gIDxkaXZcbiAgICAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIlxuICAgIGNsYXNzPVwibGc6ZmxleCBsZzpmbGV4LXdyYXAgbGc6dy1mdWxsXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJhY2Npb25lcy1lbnRyYWRhc1wiPlxuICAgIDxoM1xuICAgICAgaWQ9XCJhY2Npb25lcy1lbnRyYWRhc1wiXG4gICAgICBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgIFNlbGVjY2nDs24gbcO6bHRpcGxlIHkgQWNjaW9uZXMgc29icmUgZWwgbGlzdGFkbyBkZSBlbnRyYWRhc1xuICAgIDwvaDM+XG4gICAgPGRpdlxuICAgICAgaWQ9XCJzZWxlY3Rpb24taG9tZVwiXG4gICAgICBjbGFzcz1cInB0LTIgcGItMCBwbC00IG10LTAgbGc6ZmxleCBzbTpmbGV4LTEgcHktYmFzZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImgtMTBcIj5cbiAgICAgICAgPGRlc3ktY2hlY2tib3hlcyBuYW1lPVwidG9kb3MtZW50cmFkYXMtY2hieFwiPlxuICAgICAgICAgIDxkZXN5LWNoZWNrYm94LWl0ZW1cbiAgICAgICAgICAgICNjaGVja2JveFxuICAgICAgICAgICAgdmFsdWU9XCJpdGVtLWNoZWNrYm94XCJcbiAgICAgICAgICAgIG5hbWU9XCJ0b2Rvcy1lbnRyYWRhc1wiXG4gICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja1VuY2hlY2tBbGwoKVwiXG4gICAgICAgICAgICBbaXNJbmRldGVybWluYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3Nlcz1cImMtY2hlY2tib3hlcy0tc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0wLjUgbGVhZGluZy01XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIC1tdC0xIHRleHQtc20gbmctc3Rhci1pbnNlcnRlZFwiPlxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdEFsbFBhZ2VzID8gJ1NlbGVjY2lvbmFyIHRvZG8nIDogJ1NlbGVjY2lvbmFyIHRvZG9zIGxvcyBpdGVtcyBkZSBlc3RhIHDDoWdpbmEnIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rlc3ktY2hlY2tib3gtaXRlbT5cbiAgICAgICAgPC9kZXN5LWNoZWNrYm94ZXM+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudFxuICAgICAgc2VsZWN0PVwiOm5vdChkZXN5LXRhYmxlLWFkdmFuY2VkLWhlYWRlcik6bm90KGRlc3ktdGFibGUtYWR2YW5jZWQtcm93KTpub3QoZGVzeS10YWJsZS1hZHZhbmNlZC1mb290ZXIpOm5vdChkZXN5LXRhYmxlLWNhcHRpb24pXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbiAgPHRhYmxlXG4gICAgcm9sZT1cImdyaWRcIlxuICAgIFtjbGFzc109XCJbJ2MtdGFibGUtYWR2YW5jZWQgYm9yZGVyLXQtMiBib3JkZXItYi0yIGJvcmRlci1uZXV0cmFsLWJhc2UnLCBjbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgW2F0dHIuaWRdPVwiaWQgPyBpZCA6IG51bGxcIlxuICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJ0aGlzXCI+XG4gICAgPGNhcHRpb25cbiAgICAgICpuZ0lmPVwiY2FwdGlvbiB8fCBjYXB0aW9uQ29tcG9uZW50XCJcbiAgICAgIFtjbGFzc109XCJnZXRDYXB0aW9uQ2xhc3MoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjYXB0aW9uQ29tcG9uZW50LCB0ZXh0OiBjYXB0aW9uID8gY2FwdGlvbiA6IG51bGwgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvY2FwdGlvbj5cbiAgICA8dGhlYWQgKm5nSWY9XCJnZXRIZWFkZXJDZWxscygpXCI+XG4gICAgICA8dHIgY2xhc3M9XCJib3JkZXItdCBib3JkZXItbmV1dHJhbC1iYXNlIGRpdmlkZS14IGRpdmlkZS1uZXV0cmFsLWJhc2VcIj5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nSWY9XCJoYXNDaGVja2JveGVzXCJcbiAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgW2NsYXNzXT1cIlsnYWxpZ24tdG9wIHB4LWJhc2UgcHkteHMnLCAndy0xNicsIGNoZWNrYm94Q2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5TZWxlY2Npb25hciBmaWxhPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGhcbiAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SGVhZGVyQ2VsbHMoKTsgaW5kZXggYXMgaUhlYWRlclwiXG4gICAgICAgICAgW2lkXT1cImdldElkSGVhZGVyKGlIZWFkZXIpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiaXRlbS5vcmRlckJ5ID8gZ2V0U3RyaW5nT3JkZXJCeShpdGVtLm9yZGVyQnkpIDogbnVsbFwiXG4gICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnYWxpZ24tdG9wIHB4LWJhc2UgcHktc20gYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRleHQtbmV1dHJhbC1kYXJrJyxcbiAgICAgICAgICAgICAgaXRlbS5jbGFzc2VzLFxuICAgICAgICAgICAgXSB8IG1ha2VIdG1sTGlzdFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJpdGVtLmNvbHNwYW4gPyBpdGVtLmNvbHNwYW4gOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cIml0ZW0ucm93c3BhbiA/IGl0ZW0ucm93c3BhbiA6IG51bGxcIlxuICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJpdGVtXCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5vcmRlckJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWJsb2NrIHJlbGF0aXZlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTb3J0QnlDb2x1bW4oaUhlYWRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVTb3J0QnlDb2x1bW4oaUhlYWRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJoYW5kbGVTb3J0QnlDb2x1bW4oaUhlYWRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXRlbS5vcmRlckJ5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiaXRlbS5vcmRlckJ5ID8gJ2J1dHRvbicgOiBudWxsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZXh0XCI+e3sgaXRlbS50ZXh0IH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5jb250ZW50Q29tcG9uZW50XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogaXRlbS5jb250ZW50Q29tcG9uZW50IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19vcmRlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5vcmRlckJ5XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlB1bHNhIHBhcmEgb3JkZW5hciBwb3IgZXN0YSBjb2x1bW5hPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYy10YWJsZS1hZHZhbmNlZF9fYXNjZW5kaW5nXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0ub3JkZXJCeSA9PT0gb3JkZXJCeVR5cGUuYXNjXCI+XG4gICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMWVtXCJcbiAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjFlbVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMTIuMDcgMzcuOTNsLTM1LTM1YTEwIDEwIDAgMDAtMTQuMTQgMGwtMzUgMzVhMTAgMTAgMCAwMDE0LjE0IDE0LjE0bDEzLjY2LTEzLjY2QTIuNSAyLjUgMCAwMTYwIDQwLjE4VjEzMGExMCAxMCAwIDAwMjAgMFY0MC4xOGEyLjUgMi41IDAgMDE0LjI3LTEuNzdsMTMuNjYgMTMuNjZhMTAgMTAgMCAwMDE0LjE0LTE0LjE0elwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19kZXNjZW5kaW5nXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0ub3JkZXJCeSA9PT0gb3JkZXJCeVR5cGUuZGVzY1wiPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNDAgMTQwXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICB3aWR0aD1cIjFlbVwiXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMjcuOTMgMTAyLjA3bDM1IDM1YTEwIDEwIDAgMDAxNC4xNCAwbDM1LTM1YTEwIDEwIDAgMDAtMTQuMTQtMTQuMTRsLTEzLjY2IDEzLjY2QTIuNSAyLjUgMCAwMTgwIDk5LjgyVjEwYTEwIDEwIDAgMDAtMjAgMHY4OS44MmEyLjUgMi41IDAgMDEtNC4yNyAxLjc3TDQyLjA3IDg3LjkzYTEwIDEwIDAgMDAtMTQuMTQgMTQuMTR6XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cImMtdGFibGUtYWR2YW5jZWRfX25vbmVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5vcmRlckJ5ID09PSBvcmRlckJ5VHlwZS5ub25lXCI+XG4gICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW5ldXRyYWwtZGFya1wiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxZW1cIlxuICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMWVtXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTk0LjcgOTcuMmwtMTcuMiAxNy4xOVYyNS42MUw5NC43IDQyLjhhNy41IDcuNSAwIDAwMTAuNi0xMC42bC0zMC0zMGE3LjQ5IDcuNDkgMCAwMC0xMC42IDBsLTMwIDMwYTcuNSA3LjUgMCAwMDEwLjYgMTAuNmwxNy4yLTE3LjE5djg4Ljc4TDQ1LjMgOTcuMmE3LjUgNy41IDAgMTAtMTAuNiAxMC42bDMwIDMwYTcuNDggNy40OCAwIDAwMTAuNiAwbDMwLTMwYTcuNSA3LjUgMCAwMC0xMC42LTEwLjZ6XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5vcmRlckJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWJsb2NrIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZXh0XCI+e3sgaXRlbS50ZXh0IH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5jb250ZW50Q29tcG9uZW50XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogaXRlbS5jb250ZW50Q29tcG9uZW50IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cblxuICAgIDx0Ym9keT5cbiAgICAgIDx0clxuICAgICAgICBjbGFzcz1cImRpdmlkZS14IGRpdmlkZS1uZXV0cmFsLWJhc2VcIlxuICAgICAgICAqbmdJZj1cImhhc0ZpbHRlcnMoKVwiPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImNoZWNrYm94Q2xhc3Nlc1wiPjwvdGQ+XG4gICAgICAgIDx0ZFxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEhlYWRlckNlbGxzKCk7IGluZGV4IGFzIGlIZWFkXCJcbiAgICAgICAgICBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJ2FsaWduLXRvcCBweC1iYXNlIHBiLXNtIGJvcmRlci1uZXV0cmFsLWJhc2UgYm9yZGVyLWItMCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW5vcm1hbCB0ZXh0LW5ldXRyYWwtZGFyaycsXG4gICAgICAgICAgICAgIGl0ZW0uY2xhc3NlcyxcbiAgICAgICAgICAgIF0gfCBtYWtlSHRtbExpc3RcbiAgICAgICAgICBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5oYXNTZWxlY3QgJiYgZ2V0U2VsZWN0Rm9ySXRlbShpdGVtKSAhPT0gbnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlU2VsZWN0OyBjb250ZXh0OiB7IHNlbGVjdGFibGU6IGdldFNlbGVjdEZvckl0ZW0oaXRlbSkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICN0YWJsZVNlbGVjdFxuICAgICAgICAgICAgICBsZXQtc2VsZWN0YWJsZT1cInNlbGVjdGFibGVcIj5cbiAgICAgICAgICAgICAgPGRlc3ktc2VsZWN0XG4gICAgICAgICAgICAgICAgW2lkXT1cImdldElkSGVhZGVyU2VsZWN0KGlIZWFkKVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsRGF0YV09XCJ7IHRleHQ6ICdGaWx0cmFyIHBvciBlc3RhIGNvbHVtbmEnLCBjbGFzc2VzOiAnc3Itb25seScgfVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzZXNdPVwic2VsZWN0YWJsZS5jbGFzc2VzID8gc2VsZWN0YWJsZS5jbGFzc2VzIDogJ2Mtc2VsZWN0LS1zbSB3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwQ2xhc3Nlc109XCJzZWxlY3RhYmxlLmZvcm1Hcm91cENsYXNzZXMgPyBzZWxlY3RhYmxlLmZvcm1Hcm91cENsYXNzZXMgOiAnLW10LXNtIG1iLTAnXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJzZWxlY3RhYmxlLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJnZXRJdGVtU2VsZWN0T3B0aW9ucyhzZWxlY3RhYmxlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGFibGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmliZWRCeV09XCJnZXRJZEhlYWRlclNlbGVjdChpSGVhZClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVNlbGVjdFwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXNlUGFnaW5hdGlvbiA/IGhhbmRsZUJ1dHRvblNlYXJjaChpdGVtKSA6IGhhbmRsZUlucHV0U2VhcmNoKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBbcm9sZV09XCJzZWxlY3RhYmxlLnJvbGVcIlxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwic2VsZWN0YWJsZS5hcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFthcmlhRGVzY3JpYmVkQnldPVwic2VsZWN0YWJsZS5hcmlhRGVzY3JpYmVkQnlcIlxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxsZWRCeV09XCJzZWxlY3RhYmxlLmFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICBbYXJpYUhpZGRlbl09XCJzZWxlY3RhYmxlLmFyaWFIaWRkZW5cIlxuICAgICAgICAgICAgICAgIFthcmlhRGlzYWJsZWRdPVwic2VsZWN0YWJsZS5hcmlhRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthcmlhQ29udHJvbHNdPVwic2VsZWN0YWJsZS5hcmlhQ29udHJvbHNcIlxuICAgICAgICAgICAgICAgIFthcmlhQ3VycmVudF09XCJzZWxlY3RhYmxlLmFyaWFDdXJyZW50XCJcbiAgICAgICAgICAgICAgICBbYXJpYUxpdmVdPVwic2VsZWN0YWJsZS5hcmlhTGl2ZVwiXG4gICAgICAgICAgICAgICAgW2FyaWFFeHBhbmRlZF09XCJzZWxlY3RhYmxlLmFyaWFFeHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgW2FyaWFFcnJvck1lc3NhZ2VdPVwic2VsZWN0YWJsZS5hcmlhRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbYXJpYUhhc1BvcHVwXT1cInNlbGVjdGFibGUuYXJpYUhhc1BvcHVwXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwic2VsZWN0YWJsZS50YWJpbmRleFwiPjwvZGVzeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmhhc1NlbGVjdCAmJiBpdGVtLmhhc0ZpbHRlclwiXG4gICAgICAgICAgICBjbGFzcz1cInBiLXNtXCI+PC9kaXY+XG5cbiAgICAgICAgICA8ZGVzeS1zZWFyY2gtYmFyXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0uaGFzRmlsdGVyXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZUZpbHRlclwiXG4gICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwidXNlUGFnaW5hdGlvbiA/IGhhbmRsZUJ1dHRvblNlYXJjaChpdGVtKSA6IG51bGxcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiIXVzZVBhZ2luYXRpb24gPyBoYW5kbGVJbnB1dFNlYXJjaChpdGVtKSA6IG51bGxcIlxuICAgICAgICAgICAgbGFiZWxUZXh0PVwiQnVzY2FyIGVuIGVzdGEgY29sdW1uYVwiXG4gICAgICAgICAgICBbaWRdPVwiZ2V0SWRIZWFkZXJGaWx0ZXIoaUhlYWQpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQnVzY2FyXCJcbiAgICAgICAgICAgIFtjbGFzc2VzXT1cIlsnYy1pbnB1dC0tc20nLCBpdGVtLmZpbHRlckNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgIGJ1dHRvbkNsYXNzZXM9XCJtLXhzIHAtMC41IHRleHQteHNcIlxuICAgICAgICAgICAgW2Rlc2NyaWJlZEJ5XT1cImdldElkSGVhZGVyKGlIZWFkKVwiPjwvZGVzeS1zZWFyY2gtYmFyPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPHRyXG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgZ2V0VmlzaWJsZVJvd3MoKTsgaW5kZXggYXMgaVJvd1wiXG4gICAgICAgIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWIgYm9yZGVyLW5ldXRyYWwtYmFzZSBob3ZlcjpiZy1uZXV0cmFsLWxpZ2h0ZXJcIlxuICAgICAgICBbZGVzeVJvd109XCJyb3dcIj5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nSWY9XCJoYXNDaGVja2JveGVzXCJcbiAgICAgICAgICBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjaGVja2JveENsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImMtY2hlY2tib3hlcyBjLWNoZWNrYm94ZXMtLXNtXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBteC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy02IGgtNiB0cmFuc2l0aW9uIGR1cmF0aW9uLTE1MCBlYXNlLWluLW91dCBib3JkZXItYmxhY2sgZm9jdXM6Ym9yZGVyLWJsYWNrIGZvY3VzOnNoYWRvdy1vdXRsaW5lLWZvY3VzLWlucHV0IGZvY3VzOnJpbmctNCBmb2N1czpyaW5nLW9mZnNldC0wIGZvY3VzOnJpbmctd2FybmluZy1iYXNlIGRpc2FibGVkOmJnLW5ldXRyYWwtbGlnaHQgZGlzYWJsZWQ6Ym9yZGVyLW5ldXRyYWwtYmFzZSB0ZXh0LXByaW1hcnktYmFzZVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVDaGVja2JveENoYW5nZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldElkUm93Q2hlY2tib3goaVJvdylcIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJnZXRJZFJvd0NoZWNrYm94KGlSb3cpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMC41IGxlYWRpbmctNVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Itb25seSBibG9jayB0ZXh0LXNtIC1tdC0xXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCJnZXRJZFJvd0NoZWNrYm94KGlSb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjY2lvbmEgZmlsYSB7eyBpUm93IH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdy5jZWxsc0xpc3Q7IGZpcnN0IGFzIGlzRmlyc3RDZWxsOyBpbmRleCBhcyBjb2x1bW5JbmRleFwiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgKm5nSWY9XCJmaXJzdENlbGxJc0hlYWRlciAmJiBpc0ZpcnN0Q2VsbDsgZWxzZSBlbHNlVGRcIlxuICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3B4LWJhc2UgcHkteHMgYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIGJvcmRlci1yIHRleHQtbGVmdCBmb250LW5vcm1hbCB0ZXh0LXNtIHRleHQtbmV1dHJhbC1kYXJrJyxcbiAgICAgICAgICAgICAgICBjZWxsLmNsYXNzZXMsXG4gICAgICAgICAgICAgIF0gfCBtYWtlSHRtbExpc3RcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBkZXN5Q2VsbFxuICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgW3Jvd0luZGV4XT1cImlSb3dcIlxuICAgICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZCA/IGNlbGwuaWQgOiBudWxsXCJcbiAgICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJjZWxsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRkPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgICBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXNtJywgY2VsbC5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgIGRlc3lDZWxsXG4gICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cImlSb3dcIlxuICAgICAgICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhbiA/IGNlbGwuY29sc3BhbiA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgICBbZGVzeUFwcEFjY2Vzc2liaWxpdHldPVwiY2VsbFwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwudGFiaW5kZXggPyBjZWxsLnRhYmluZGV4IDogLTFcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG5cbiAgICA8dGZvb3QgKm5nSWY9XCJnZXRGb290ZXJDZWxscygpXCI+XG4gICAgICA8dHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGZvb3Qgb2YgZ2V0Rm9vdGVyQ2VsbHMoKTsgaW5kZXggYXMgaUZvb3RlclwiXG4gICAgICAgIGNsYXNzPVwiYm9yZGVyLXQtMiBib3JkZXItYiBib3JkZXItbmV1dHJhbC1iYXNlIGhvdmVyOmJnLW5ldXRyYWwtbGlnaHRlclwiPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIlxuICAgICAgICAgIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgW2NsYXNzXT1cIlsncHgtYmFzZSBweS1zbScsIGNoZWNrYm94Q2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYy1jaGVja2JveGVzIGMtY2hlY2tib3hlcy0tc21cIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG14LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTYgaC02IHRyYW5zaXRpb24gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0IGJvcmRlci1ibGFjayBmb2N1czpib3JkZXItYmxhY2sgZm9jdXM6c2hhZG93LW91dGxpbmUtZm9jdXMtaW5wdXQgZm9jdXM6cmluZy00IGZvY3VzOnJpbmctb2Zmc2V0LTAgZm9jdXM6cmluZy13YXJuaW5nLWJhc2UgZGlzYWJsZWQ6YmctbmV1dHJhbC1saWdodCBkaXNhYmxlZDpib3JkZXItbmV1dHJhbC1iYXNlIHRleHQtcHJpbWFyeS1iYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb290LmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVDaGVja2JveENoYW5nZShmb290KVwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRJZFJvd0NoZWNrYm94KGlGb290ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0SWRSb3dDaGVja2JveChpRm9vdGVyKVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTAuNSBsZWFkaW5nLTVcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyLW9ubHkgYmxvY2sgdGV4dC1zbSAtbXQtMVwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiZ2V0SWRSb3dDaGVja2JveChpRm9vdGVyKVwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY2Npb25hIGZpbGEge3sgaUZvb3RlciB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiBmb290LmNlbGxzTGlzdDsgZmlyc3QgYXMgaXNGaXJzdENlbGw7IGluZGV4IGFzIGNvbHVtbkluZGV4XCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAqbmdJZj1cImZpcnN0Q2VsbElzSGVhZGVyICYmIGlzRmlyc3RDZWxsOyBlbHNlIGVsc2VUZFwiXG4gICAgICAgICAgICBzY29wZT1cInJvd1wiXG4gICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncHgtYmFzZSBweS14cyBib3JkZXItbmV1dHJhbC1iYXNlIGJvcmRlci1iLTAgYm9yZGVyLXIgdGV4dC1sZWZ0IGZvbnQtbm9ybWFsIHRleHQtc20gdGV4dC1uZXV0cmFsLWRhcmsnLFxuICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NlcyxcbiAgICAgICAgICAgICAgXSB8IG1ha2VIdG1sTGlzdFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGRlc3lDZWxsXG4gICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICBbcm93SW5kZXhdPVwiaUZvb3RlclwiXG4gICAgICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4gPyBjZWxsLmNvbHNwYW4gOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cImNlbGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlVGQ+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjZWxsLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgZGVzeUNlbGxcbiAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICBbcm93SW5kZXhdPVwiaUZvb3RlclwiXG4gICAgICAgICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWQgPyBjZWxsLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJjZWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC50YWJpbmRleCA/IGNlbGwudGFiaW5kZXggOiAtMVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC90Zm9vdD5cbiAgPC90YWJsZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXZcbiAgKm5nSWY9XCJ3cmFwcGVyOyBlbHNlIHRhYmxlQ29udGVudFwiXG4gIFtjbGFzc109XCJ3cmFwcGVyLmNsYXNzZXNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=