@ascentgl/ads-ui 0.0.38 → 0.0.40

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 (387) hide show
  1. package/fesm2022/ascentgl-ads-ui-src-lib-components-avatar.mjs +8 -8
  2. package/fesm2022/ascentgl-ads-ui-src-lib-components-avatar.mjs.map +1 -1
  3. package/fesm2022/ascentgl-ads-ui-src-lib-components-buttons-button-container.mjs +8 -8
  4. package/fesm2022/ascentgl-ads-ui-src-lib-components-buttons-button-container.mjs.map +1 -1
  5. package/fesm2022/ascentgl-ads-ui-src-lib-components-drag-and-drop-list.mjs +8 -8
  6. package/fesm2022/ascentgl-ads-ui-src-lib-components-drag-and-drop-list.mjs.map +1 -1
  7. package/fesm2022/ascentgl-ads-ui-src-lib-components-error-page-error-page-code.mjs +8 -7
  8. package/fesm2022/ascentgl-ads-ui-src-lib-components-error-page-error-page-code.mjs.map +1 -1
  9. package/fesm2022/ascentgl-ads-ui-src-lib-components-footer-container.mjs +8 -8
  10. package/fesm2022/ascentgl-ads-ui-src-lib-components-footer-container.mjs.map +1 -1
  11. package/fesm2022/ascentgl-ads-ui-src-lib-components-footer.mjs +8 -8
  12. package/fesm2022/ascentgl-ads-ui-src-lib-components-footer.mjs.map +1 -1
  13. package/fesm2022/ascentgl-ads-ui-src-lib-components-header-container.mjs +8 -8
  14. package/fesm2022/ascentgl-ads-ui-src-lib-components-header-container.mjs.map +1 -1
  15. package/fesm2022/ascentgl-ads-ui-src-lib-components-header.mjs +8 -8
  16. package/fesm2022/ascentgl-ads-ui-src-lib-components-header.mjs.map +1 -1
  17. package/fesm2022/ascentgl-ads-ui-src-lib-components-logo-primary-logo.mjs +11 -11
  18. package/fesm2022/ascentgl-ads-ui-src-lib-components-logo-primary-logo.mjs.map +1 -1
  19. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-bar.mjs +8 -8
  20. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-bar.mjs.map +1 -1
  21. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-indicator-spinner.mjs +8 -8
  22. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-indicator-spinner.mjs.map +1 -1
  23. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-spinner.mjs +8 -8
  24. package/fesm2022/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-spinner.mjs.map +1 -1
  25. package/fesm2022/ascentgl-ads-ui-src-lib-components-shell-layout.mjs +8 -8
  26. package/fesm2022/ascentgl-ads-ui-src-lib-components-shell-layout.mjs.map +1 -1
  27. package/fesm2022/ascentgl-ads-ui-src-lib-components-splash-page.mjs +8 -8
  28. package/fesm2022/ascentgl-ads-ui-src-lib-components-splash-page.mjs.map +1 -1
  29. package/fesm2022/ascentgl-ads-ui-src-lib-components-tags-tag-container.mjs +8 -8
  30. package/fesm2022/ascentgl-ads-ui-src-lib-components-tags-tag-container.mjs.map +1 -1
  31. package/fesm2022/ascentgl-ads-ui.mjs +514 -501
  32. package/fesm2022/ascentgl-ads-ui.mjs.map +1 -1
  33. package/lib/components/buttons/button/button.component.d.ts +1 -1
  34. package/lib/components/form-fields/abstracts/abstract.base.component.d.ts +1 -1
  35. package/lib/components/form-fields/abstracts/abstract.dropdown.component.d.ts +1 -1
  36. package/lib/components/form-fields/abstracts/abstract.input.component.d.ts +1 -1
  37. package/lib/components/logo/primary-logo/abstract-logo-component.d.ts +1 -1
  38. package/lib/components/nav-bar/side-nav-bar/abstract-side-nav-bar.component.d.ts +1 -1
  39. package/lib/components/table/table.component.d.ts +194 -0
  40. package/package.json +8 -40
  41. package/src/assets/sass/ads-ui/abstracts/_functions.scss +6 -3
  42. package/src/assets/sass/ads-ui/abstracts/_mixins.scss +2 -0
  43. package/src/assets/sass/ads-ui/base/_reset.scss +1 -2
  44. package/src/assets/sass/ads-ui/base/_typography.scss +1 -8
  45. package/src/assets/sass/ads-ui/base/_utilities.scss +1 -2
  46. package/src/assets/sass/ads-ui/main.scss +8 -9
  47. package/src/assets/sass/ads-ui/overrides/_angular-material.scss +7 -7
  48. package/src/assets/sass/ads-ui/overrides/angular-material/_bottom-sheet.scss +2 -0
  49. package/src/assets/sass/ads-ui/overrides/angular-material/_datetimepicker.scss +1 -3
  50. package/src/assets/sass/ads-ui/overrides/angular-material/_dropdown.scss +1 -2
  51. package/src/assets/sass/ads-ui/overrides/angular-material/_html.scss +1 -2
  52. package/src/assets/sass/ads-ui/overrides/angular-material/_mat-list.scss +2 -0
  53. package/src/assets/sass/ads-ui/overrides/angular-material/_search-dropdown-modal.scss +2 -0
  54. package/src/assets/sass/ads-ui/overrides/angular-material/_snackbar.scss +1 -2
  55. package/src/assets/sass/ads-ui/overrides/angular-material/_tooltip.scss +1 -2
  56. package/src/lib/components/logo/primary-logo/abstract-logo-component.d.ts +1 -1
  57. package/esm2022/ascentgl-ads-ui.mjs +0 -5
  58. package/esm2022/index.mjs +0 -61
  59. package/esm2022/lib/components/avatar/avatar.component.mjs +0 -50
  60. package/esm2022/lib/components/avatar/avatar.module.mjs +0 -19
  61. package/esm2022/lib/components/avatar/avatar.types.mjs +0 -2
  62. package/esm2022/lib/components/avatar/index.mjs +0 -2
  63. package/esm2022/lib/components/avatar/public-api.mjs +0 -3
  64. package/esm2022/lib/components/badge/index.mjs +0 -2
  65. package/esm2022/lib/components/badge/numeric-badge.component.mjs +0 -35
  66. package/esm2022/lib/components/badge/numeric-badge.module.mjs +0 -19
  67. package/esm2022/lib/components/badge/public-api.mjs +0 -3
  68. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +0 -57
  69. package/esm2022/lib/components/breadcrumb/breadcrumb.module.mjs +0 -21
  70. package/esm2022/lib/components/breadcrumb/breadcrumb.type.mjs +0 -2
  71. package/esm2022/lib/components/breadcrumb/breadcrumb.visual-processor.mjs +0 -151
  72. package/esm2022/lib/components/breadcrumb/index.mjs +0 -2
  73. package/esm2022/lib/components/breadcrumb/public-api.mjs +0 -4
  74. package/esm2022/lib/components/buttons/button/button.component.mjs +0 -29
  75. package/esm2022/lib/components/buttons/button/button.module.mjs +0 -19
  76. package/esm2022/lib/components/buttons/button/index.mjs +0 -2
  77. package/esm2022/lib/components/buttons/button/public-api.mjs +0 -3
  78. package/esm2022/lib/components/buttons/button-container/button-container.component.mjs +0 -17
  79. package/esm2022/lib/components/buttons/button-container/button-container.module.mjs +0 -18
  80. package/esm2022/lib/components/buttons/button-container/index.mjs +0 -2
  81. package/esm2022/lib/components/buttons/button-container/public-api.mjs +0 -3
  82. package/esm2022/lib/components/buttons/icon-button/icon-button.component.mjs +0 -36
  83. package/esm2022/lib/components/buttons/icon-button/icon-button.module.mjs +0 -20
  84. package/esm2022/lib/components/buttons/icon-button/index.mjs +0 -2
  85. package/esm2022/lib/components/buttons/icon-button/public-api.mjs +0 -3
  86. package/esm2022/lib/components/buttons/link-button/index.mjs +0 -2
  87. package/esm2022/lib/components/buttons/link-button/link-button.component.mjs +0 -18
  88. package/esm2022/lib/components/buttons/link-button/link-button.module.mjs +0 -20
  89. package/esm2022/lib/components/buttons/link-button/public-api.mjs +0 -3
  90. package/esm2022/lib/components/card/card.component.mjs +0 -37
  91. package/esm2022/lib/components/card/card.module.mjs +0 -18
  92. package/esm2022/lib/components/card/index.mjs +0 -2
  93. package/esm2022/lib/components/card/public-api.mjs +0 -3
  94. package/esm2022/lib/components/chip/chip.component.mjs +0 -45
  95. package/esm2022/lib/components/chip/chip.module.mjs +0 -19
  96. package/esm2022/lib/components/chip/chip.types.mjs +0 -2
  97. package/esm2022/lib/components/chip/index.mjs +0 -2
  98. package/esm2022/lib/components/chip/public-api.mjs +0 -3
  99. package/esm2022/lib/components/divider/divider.component.mjs +0 -38
  100. package/esm2022/lib/components/divider/divider.module.mjs +0 -18
  101. package/esm2022/lib/components/divider/index.mjs +0 -2
  102. package/esm2022/lib/components/divider/public-api.mjs +0 -3
  103. package/esm2022/lib/components/drag-and-drop-list/dom.element.mjs +0 -62
  104. package/esm2022/lib/components/drag-and-drop-list/drag-and-drop-list.component.mjs +0 -349
  105. package/esm2022/lib/components/drag-and-drop-list/drag-and-drop-list.enums.mjs +0 -2
  106. package/esm2022/lib/components/drag-and-drop-list/drag-and-drop-list.module.mjs +0 -18
  107. package/esm2022/lib/components/drag-and-drop-list/dragged.placeholder.mjs +0 -63
  108. package/esm2022/lib/components/drag-and-drop-list/index.mjs +0 -2
  109. package/esm2022/lib/components/drag-and-drop-list/public-api.mjs +0 -3
  110. package/esm2022/lib/components/error-page/error-page-code/error-page-code.component.mjs +0 -14
  111. package/esm2022/lib/components/error-page/error-page-code/error-page-code.module.mjs +0 -18
  112. package/esm2022/lib/components/error-page/error-page-code/index.mjs +0 -2
  113. package/esm2022/lib/components/error-page/error-page-code/public-api.mjs +0 -3
  114. package/esm2022/lib/components/error-page/error-page.component.mjs +0 -110
  115. package/esm2022/lib/components/error-page/error-page.module.mjs +0 -25
  116. package/esm2022/lib/components/error-page/error-page.types.mjs +0 -7
  117. package/esm2022/lib/components/error-page/index.mjs +0 -2
  118. package/esm2022/lib/components/error-page/public-api.mjs +0 -4
  119. package/esm2022/lib/components/expansion-panel/expansion-panel.component.mjs +0 -36
  120. package/esm2022/lib/components/expansion-panel/expansion-panel.module.mjs +0 -38
  121. package/esm2022/lib/components/expansion-panel/index.mjs +0 -2
  122. package/esm2022/lib/components/expansion-panel/public-api.mjs +0 -3
  123. package/esm2022/lib/components/footer/container/footer-container.component.mjs +0 -11
  124. package/esm2022/lib/components/footer/container/footer-container.module.mjs +0 -16
  125. package/esm2022/lib/components/footer/container/index.mjs +0 -2
  126. package/esm2022/lib/components/footer/container/public-api.mjs +0 -3
  127. package/esm2022/lib/components/footer/footer.component.mjs +0 -35
  128. package/esm2022/lib/components/footer/footer.component.types.mjs +0 -2
  129. package/esm2022/lib/components/footer/footer.module.mjs +0 -18
  130. package/esm2022/lib/components/footer/index.mjs +0 -2
  131. package/esm2022/lib/components/footer/public-api.mjs +0 -4
  132. package/esm2022/lib/components/form-fields/abstracts/abstract.base.component.mjs +0 -155
  133. package/esm2022/lib/components/form-fields/abstracts/abstract.dropdown.component.mjs +0 -108
  134. package/esm2022/lib/components/form-fields/abstracts/abstract.input.component.mjs +0 -52
  135. package/esm2022/lib/components/form-fields/area/index.mjs +0 -2
  136. package/esm2022/lib/components/form-fields/area/public-api.mjs +0 -3
  137. package/esm2022/lib/components/form-fields/area/textarea.component.mjs +0 -37
  138. package/esm2022/lib/components/form-fields/area/textarea.module.mjs +0 -55
  139. package/esm2022/lib/components/form-fields/common/dropdown-option-template.directive.mjs +0 -17
  140. package/esm2022/lib/components/form-fields/common/error/error.component.mjs +0 -29
  141. package/esm2022/lib/components/form-fields/common/hint/hint.component.mjs +0 -36
  142. package/esm2022/lib/components/form-fields/common/input.tooltip.component.mjs +0 -38
  143. package/esm2022/lib/components/form-fields/common/success/success.component.mjs +0 -29
  144. package/esm2022/lib/components/form-fields/datepickers/date-picker/datepicker.component.mjs +0 -61
  145. package/esm2022/lib/components/form-fields/datepickers/date-picker/datepicker.module.mjs +0 -87
  146. package/esm2022/lib/components/form-fields/datepickers/date-picker/index.mjs +0 -2
  147. package/esm2022/lib/components/form-fields/datepickers/date-picker/public-api.mjs +0 -3
  148. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/custom-datetime-format.mjs +0 -36
  149. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/custom-datetime.adapter.mjs +0 -49
  150. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/datetime-picker-format-directive.mjs +0 -66
  151. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/datetime-template.formatter.mjs +0 -171
  152. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/datetimepicker.component.mjs +0 -398
  153. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/datetimepicker.module.mjs +0 -87
  154. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/index.mjs +0 -2
  155. package/esm2022/lib/components/form-fields/datepickers/datetime-picker/public-api.mjs +0 -3
  156. package/esm2022/lib/components/form-fields/datepickers/time-picker/index.mjs +0 -2
  157. package/esm2022/lib/components/form-fields/datepickers/time-picker/public-api.mjs +0 -3
  158. package/esm2022/lib/components/form-fields/datepickers/time-picker/timepicker.component.mjs +0 -77
  159. package/esm2022/lib/components/form-fields/datepickers/time-picker/timepicker.module.mjs +0 -90
  160. package/esm2022/lib/components/form-fields/dropdowns/dropdown/dropdown.component.mjs +0 -194
  161. package/esm2022/lib/components/form-fields/dropdowns/dropdown/dropdown.module.mjs +0 -71
  162. package/esm2022/lib/components/form-fields/dropdowns/dropdown/index.mjs +0 -2
  163. package/esm2022/lib/components/form-fields/dropdowns/dropdown/public-api.mjs +0 -3
  164. package/esm2022/lib/components/form-fields/dropdowns/input-dropdown/index.mjs +0 -2
  165. package/esm2022/lib/components/form-fields/dropdowns/input-dropdown/input-dropdown.component.mjs +0 -103
  166. package/esm2022/lib/components/form-fields/dropdowns/input-dropdown/input-dropdown.module.mjs +0 -67
  167. package/esm2022/lib/components/form-fields/dropdowns/input-dropdown/public-api.mjs +0 -3
  168. package/esm2022/lib/components/form-fields/dropdowns/multi-select-dropdown/index.mjs +0 -2
  169. package/esm2022/lib/components/form-fields/dropdowns/multi-select-dropdown/multi-select-dropdown.component.mjs +0 -67
  170. package/esm2022/lib/components/form-fields/dropdowns/multi-select-dropdown/multi-select-dropdown.module.mjs +0 -71
  171. package/esm2022/lib/components/form-fields/dropdowns/multi-select-dropdown/public-api.mjs +0 -3
  172. package/esm2022/lib/components/form-fields/input/index.mjs +0 -2
  173. package/esm2022/lib/components/form-fields/input/input.component.mjs +0 -72
  174. package/esm2022/lib/components/form-fields/input/input.module.mjs +0 -55
  175. package/esm2022/lib/components/form-fields/input/public-api.mjs +0 -3
  176. package/esm2022/lib/components/form-fields/phone-field/index.mjs +0 -2
  177. package/esm2022/lib/components/form-fields/phone-field/phone-field.component.mjs +0 -61
  178. package/esm2022/lib/components/form-fields/phone-field/phone-field.module.mjs +0 -62
  179. package/esm2022/lib/components/form-fields/phone-field/public-api.mjs +0 -3
  180. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/index.mjs +0 -2
  181. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/public-api.mjs +0 -3
  182. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/search-dropdown-highlighter.pipe.mjs +0 -33
  183. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/search-dropdown.component.mjs +0 -683
  184. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/search-dropdown.component.types.mjs +0 -2
  185. package/esm2022/lib/components/form-fields/search-fields/search-dropdown/search-dropdown.module.mjs +0 -75
  186. package/esm2022/lib/components/form-fields/search-fields/search-input/index.mjs +0 -2
  187. package/esm2022/lib/components/form-fields/search-fields/search-input/public-api.mjs +0 -3
  188. package/esm2022/lib/components/form-fields/search-fields/search-input/search-input.component.mjs +0 -43
  189. package/esm2022/lib/components/form-fields/search-fields/search-input/search-input.module.mjs +0 -67
  190. package/esm2022/lib/components/form-fields/selection-fields/checkbox/checkbox.component.mjs +0 -47
  191. package/esm2022/lib/components/form-fields/selection-fields/checkbox/checkbox.module.mjs +0 -39
  192. package/esm2022/lib/components/form-fields/selection-fields/checkbox/index.mjs +0 -2
  193. package/esm2022/lib/components/form-fields/selection-fields/checkbox/public-api.mjs +0 -3
  194. package/esm2022/lib/components/form-fields/selection-fields/radio-button/index.mjs +0 -2
  195. package/esm2022/lib/components/form-fields/selection-fields/radio-button/public-api.mjs +0 -3
  196. package/esm2022/lib/components/form-fields/selection-fields/radio-button/radio-button.component.mjs +0 -53
  197. package/esm2022/lib/components/form-fields/selection-fields/radio-button/radio-button.module.mjs +0 -55
  198. package/esm2022/lib/components/form-fields/selection-fields/slide-toggle/index.mjs +0 -2
  199. package/esm2022/lib/components/form-fields/selection-fields/slide-toggle/public-api.mjs +0 -3
  200. package/esm2022/lib/components/form-fields/selection-fields/slide-toggle/slide-toggle.component.mjs +0 -56
  201. package/esm2022/lib/components/form-fields/selection-fields/slide-toggle/slide-toggle.module.mjs +0 -39
  202. package/esm2022/lib/components/form-fields/selection-fields/slider/index.mjs +0 -2
  203. package/esm2022/lib/components/form-fields/selection-fields/slider/public-api.mjs +0 -3
  204. package/esm2022/lib/components/form-fields/selection-fields/slider/slider.component.mjs +0 -44
  205. package/esm2022/lib/components/form-fields/selection-fields/slider/slider.module.mjs +0 -43
  206. package/esm2022/lib/components/general/color-palette/colors.enums.mjs +0 -40
  207. package/esm2022/lib/components/general/color-palette/index.mjs +0 -2
  208. package/esm2022/lib/components/general/color-palette/public-api.mjs +0 -2
  209. package/esm2022/lib/components/header/container/header-container.component.mjs +0 -19
  210. package/esm2022/lib/components/header/container/header-container.module.mjs +0 -16
  211. package/esm2022/lib/components/header/container/index.mjs +0 -2
  212. package/esm2022/lib/components/header/container/public-api.mjs +0 -3
  213. package/esm2022/lib/components/header/header.component.mjs +0 -11
  214. package/esm2022/lib/components/header/header.module.mjs +0 -16
  215. package/esm2022/lib/components/header/index.mjs +0 -2
  216. package/esm2022/lib/components/header/public-api.mjs +0 -3
  217. package/esm2022/lib/components/icon-hover/icon-hover.component.mjs +0 -33
  218. package/esm2022/lib/components/icon-hover/icon-hover.module.mjs +0 -16
  219. package/esm2022/lib/components/icon-hover/index.mjs +0 -2
  220. package/esm2022/lib/components/icon-hover/public-api.mjs +0 -3
  221. package/esm2022/lib/components/logo/ascent-logo/ascent-logo.component.mjs +0 -53
  222. package/esm2022/lib/components/logo/ascent-logo/ascent-logo.module.mjs +0 -18
  223. package/esm2022/lib/components/logo/ascent-logo/index.mjs +0 -2
  224. package/esm2022/lib/components/logo/ascent-logo/public-api.mjs +0 -3
  225. package/esm2022/lib/components/logo/primary-logo/abstract-logo-component.mjs +0 -37
  226. package/esm2022/lib/components/logo/primary-logo/index.mjs +0 -2
  227. package/esm2022/lib/components/logo/primary-logo/primary-logo.component.mjs +0 -16
  228. package/esm2022/lib/components/logo/primary-logo/primary-logo.module.mjs +0 -18
  229. package/esm2022/lib/components/logo/primary-logo/public-api.mjs +0 -3
  230. package/esm2022/lib/components/modal/index.mjs +0 -2
  231. package/esm2022/lib/components/modal/modal.component.mjs +0 -40
  232. package/esm2022/lib/components/modal/modal.module.mjs +0 -21
  233. package/esm2022/lib/components/modal/public-api.mjs +0 -3
  234. package/esm2022/lib/components/nav-bar/horizontal-nav-bar/horizontal-nav-bar.component.mjs +0 -32
  235. package/esm2022/lib/components/nav-bar/horizontal-nav-bar/horizontal-nav-bar.module.mjs +0 -19
  236. package/esm2022/lib/components/nav-bar/horizontal-nav-bar/index.mjs +0 -2
  237. package/esm2022/lib/components/nav-bar/horizontal-nav-bar/public-api.mjs +0 -3
  238. package/esm2022/lib/components/nav-bar/nav-menu/index.mjs +0 -2
  239. package/esm2022/lib/components/nav-bar/nav-menu/nav-menu.component.mjs +0 -29
  240. package/esm2022/lib/components/nav-bar/nav-menu/nav-menu.module.mjs +0 -40
  241. package/esm2022/lib/components/nav-bar/nav-menu/nav-menu.types.mjs +0 -2
  242. package/esm2022/lib/components/nav-bar/nav-menu/public-api.mjs +0 -4
  243. package/esm2022/lib/components/nav-bar/scms-side-nav-bar/index.mjs +0 -2
  244. package/esm2022/lib/components/nav-bar/scms-side-nav-bar/public-api.mjs +0 -3
  245. package/esm2022/lib/components/nav-bar/scms-side-nav-bar/scms-nav-item.types.mjs +0 -2
  246. package/esm2022/lib/components/nav-bar/scms-side-nav-bar/scms-side-nav-bar.component.mjs +0 -73
  247. package/esm2022/lib/components/nav-bar/scms-side-nav-bar/scms-side-nav-bar.module.mjs +0 -66
  248. package/esm2022/lib/components/nav-bar/side-nav-bar/abstract-side-nav-bar.component.mjs +0 -57
  249. package/esm2022/lib/components/nav-bar/side-nav-bar/index.mjs +0 -2
  250. package/esm2022/lib/components/nav-bar/side-nav-bar/nav-item.types.mjs +0 -2
  251. package/esm2022/lib/components/nav-bar/side-nav-bar/public-api.mjs +0 -4
  252. package/esm2022/lib/components/nav-bar/side-nav-bar/side-nav-bar.component.mjs +0 -42
  253. package/esm2022/lib/components/nav-bar/side-nav-bar/side-nav-bar.module.mjs +0 -42
  254. package/esm2022/lib/components/progress-indicators/progress-bar/index.mjs +0 -2
  255. package/esm2022/lib/components/progress-indicators/progress-bar/progress-bar.component.mjs +0 -78
  256. package/esm2022/lib/components/progress-indicators/progress-bar/progress-bar.module.mjs +0 -19
  257. package/esm2022/lib/components/progress-indicators/progress-bar/public-api.mjs +0 -3
  258. package/esm2022/lib/components/progress-indicators/progress-indicator-spinner/index.mjs +0 -2
  259. package/esm2022/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.component.mjs +0 -79
  260. package/esm2022/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.module.mjs +0 -19
  261. package/esm2022/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.types.mjs +0 -8
  262. package/esm2022/lib/components/progress-indicators/progress-indicator-spinner/public-api.mjs +0 -3
  263. package/esm2022/lib/components/progress-indicators/progress-spinner/index.mjs +0 -2
  264. package/esm2022/lib/components/progress-indicators/progress-spinner/progress-spinner.component.mjs +0 -95
  265. package/esm2022/lib/components/progress-indicators/progress-spinner/progress-spinner.module.mjs +0 -22
  266. package/esm2022/lib/components/progress-indicators/progress-spinner/public-api.mjs +0 -3
  267. package/esm2022/lib/components/shell-layout/index.mjs +0 -2
  268. package/esm2022/lib/components/shell-layout/public-api.mjs +0 -3
  269. package/esm2022/lib/components/shell-layout/shell-layout.component.mjs +0 -25
  270. package/esm2022/lib/components/shell-layout/shell-layout.module.mjs +0 -18
  271. package/esm2022/lib/components/snackbars/inline-snackbar/index.mjs +0 -2
  272. package/esm2022/lib/components/snackbars/inline-snackbar/inline-snackbar.component.mjs +0 -63
  273. package/esm2022/lib/components/snackbars/inline-snackbar/inline-snackbar.module.mjs +0 -19
  274. package/esm2022/lib/components/snackbars/inline-snackbar/public-api.mjs +0 -3
  275. package/esm2022/lib/components/snackbars/snackbar/index.mjs +0 -2
  276. package/esm2022/lib/components/snackbars/snackbar/public-api.mjs +0 -3
  277. package/esm2022/lib/components/snackbars/snackbar/snackbar.component.mjs +0 -38
  278. package/esm2022/lib/components/snackbars/snackbar/snackbar.module.mjs +0 -20
  279. package/esm2022/lib/components/splash-page/index.mjs +0 -2
  280. package/esm2022/lib/components/splash-page/public-api.mjs +0 -3
  281. package/esm2022/lib/components/splash-page/splash-page.component.mjs +0 -20
  282. package/esm2022/lib/components/splash-page/splash-page.module.mjs +0 -18
  283. package/esm2022/lib/components/steppers/numeric-stepper/components/numeric-step.component.mjs +0 -22
  284. package/esm2022/lib/components/steppers/numeric-stepper/index.mjs +0 -2
  285. package/esm2022/lib/components/steppers/numeric-stepper/numeric-step.type.mjs +0 -2
  286. package/esm2022/lib/components/steppers/numeric-stepper/numeric-stepper.component.mjs +0 -18
  287. package/esm2022/lib/components/steppers/numeric-stepper/numeric-stepper.module.mjs +0 -20
  288. package/esm2022/lib/components/steppers/numeric-stepper/public-api.mjs +0 -4
  289. package/esm2022/lib/components/steppers/stepper/index.mjs +0 -2
  290. package/esm2022/lib/components/steppers/stepper/public-api.mjs +0 -4
  291. package/esm2022/lib/components/steppers/stepper/step.type.mjs +0 -2
  292. package/esm2022/lib/components/steppers/stepper/stepper.component.mjs +0 -33
  293. package/esm2022/lib/components/steppers/stepper/stepper.module.mjs +0 -20
  294. package/esm2022/lib/components/steppers/vertical-stepper/index.mjs +0 -2
  295. package/esm2022/lib/components/steppers/vertical-stepper/public-api.mjs +0 -4
  296. package/esm2022/lib/components/steppers/vertical-stepper/vertical-step.type.mjs +0 -2
  297. package/esm2022/lib/components/steppers/vertical-stepper/vertical-stepper.component.mjs +0 -34
  298. package/esm2022/lib/components/steppers/vertical-stepper/vertical-stepper.module.mjs +0 -20
  299. package/esm2022/lib/components/table/index.mjs +0 -2
  300. package/esm2022/lib/components/table/public-api.mjs +0 -3
  301. package/esm2022/lib/components/table/table.component.mjs +0 -94
  302. package/esm2022/lib/components/table/table.module.mjs +0 -20
  303. package/esm2022/lib/components/tags/create-tag/create-tag.component.mjs +0 -259
  304. package/esm2022/lib/components/tags/create-tag/create-tag.module.mjs +0 -48
  305. package/esm2022/lib/components/tags/create-tag/index.mjs +0 -2
  306. package/esm2022/lib/components/tags/create-tag/public-api.mjs +0 -3
  307. package/esm2022/lib/components/tags/tag/index.mjs +0 -2
  308. package/esm2022/lib/components/tags/tag/public-api.mjs +0 -4
  309. package/esm2022/lib/components/tags/tag/tag.component.mjs +0 -68
  310. package/esm2022/lib/components/tags/tag/tag.module.mjs +0 -19
  311. package/esm2022/lib/components/tags/tag/tag.types.mjs +0 -2
  312. package/esm2022/lib/components/tags/tag-container/index.mjs +0 -2
  313. package/esm2022/lib/components/tags/tag-container/public-api.mjs +0 -3
  314. package/esm2022/lib/components/tags/tag-container/tag-container.component.mjs +0 -11
  315. package/esm2022/lib/components/tags/tag-container/tag-container.module.mjs +0 -18
  316. package/esm2022/lib/services/viewport/viewport.service.interface.mjs +0 -2
  317. package/esm2022/lib/services/viewport/viewport.service.mjs +0 -32
  318. package/esm2022/lib/services/window/window.service.interface.mjs +0 -2
  319. package/esm2022/lib/services/window/window.service.mjs +0 -29
  320. package/esm2022/src/lib/components/avatar/ascentgl-ads-ui-src-lib-components-avatar.mjs +0 -5
  321. package/esm2022/src/lib/components/avatar/avatar.component.mjs +0 -50
  322. package/esm2022/src/lib/components/avatar/avatar.module.mjs +0 -19
  323. package/esm2022/src/lib/components/avatar/avatar.types.mjs +0 -2
  324. package/esm2022/src/lib/components/avatar/public-api.mjs +0 -3
  325. package/esm2022/src/lib/components/buttons/button-container/ascentgl-ads-ui-src-lib-components-buttons-button-container.mjs +0 -5
  326. package/esm2022/src/lib/components/buttons/button-container/button-container.component.mjs +0 -17
  327. package/esm2022/src/lib/components/buttons/button-container/button-container.module.mjs +0 -18
  328. package/esm2022/src/lib/components/buttons/button-container/public-api.mjs +0 -3
  329. package/esm2022/src/lib/components/drag-and-drop-list/ascentgl-ads-ui-src-lib-components-drag-and-drop-list.mjs +0 -5
  330. package/esm2022/src/lib/components/drag-and-drop-list/dom.element.mjs +0 -62
  331. package/esm2022/src/lib/components/drag-and-drop-list/drag-and-drop-list.component.mjs +0 -349
  332. package/esm2022/src/lib/components/drag-and-drop-list/drag-and-drop-list.enums.mjs +0 -2
  333. package/esm2022/src/lib/components/drag-and-drop-list/drag-and-drop-list.module.mjs +0 -18
  334. package/esm2022/src/lib/components/drag-and-drop-list/dragged.placeholder.mjs +0 -63
  335. package/esm2022/src/lib/components/drag-and-drop-list/public-api.mjs +0 -3
  336. package/esm2022/src/lib/components/error-page/error-page-code/ascentgl-ads-ui-src-lib-components-error-page-error-page-code.mjs +0 -5
  337. package/esm2022/src/lib/components/error-page/error-page-code/error-page-code.component.mjs +0 -14
  338. package/esm2022/src/lib/components/error-page/error-page-code/error-page-code.module.mjs +0 -18
  339. package/esm2022/src/lib/components/error-page/error-page-code/public-api.mjs +0 -3
  340. package/esm2022/src/lib/components/footer/ascentgl-ads-ui-src-lib-components-footer.mjs +0 -5
  341. package/esm2022/src/lib/components/footer/container/ascentgl-ads-ui-src-lib-components-footer-container.mjs +0 -5
  342. package/esm2022/src/lib/components/footer/container/footer-container.component.mjs +0 -11
  343. package/esm2022/src/lib/components/footer/container/footer-container.module.mjs +0 -16
  344. package/esm2022/src/lib/components/footer/container/public-api.mjs +0 -3
  345. package/esm2022/src/lib/components/footer/footer.component.mjs +0 -35
  346. package/esm2022/src/lib/components/footer/footer.component.types.mjs +0 -2
  347. package/esm2022/src/lib/components/footer/footer.module.mjs +0 -18
  348. package/esm2022/src/lib/components/footer/public-api.mjs +0 -4
  349. package/esm2022/src/lib/components/header/ascentgl-ads-ui-src-lib-components-header.mjs +0 -5
  350. package/esm2022/src/lib/components/header/container/ascentgl-ads-ui-src-lib-components-header-container.mjs +0 -5
  351. package/esm2022/src/lib/components/header/container/header-container.component.mjs +0 -19
  352. package/esm2022/src/lib/components/header/container/header-container.module.mjs +0 -16
  353. package/esm2022/src/lib/components/header/container/public-api.mjs +0 -3
  354. package/esm2022/src/lib/components/header/header.component.mjs +0 -11
  355. package/esm2022/src/lib/components/header/header.module.mjs +0 -16
  356. package/esm2022/src/lib/components/header/public-api.mjs +0 -3
  357. package/esm2022/src/lib/components/logo/primary-logo/abstract-logo-component.mjs +0 -37
  358. package/esm2022/src/lib/components/logo/primary-logo/ascentgl-ads-ui-src-lib-components-logo-primary-logo.mjs +0 -5
  359. package/esm2022/src/lib/components/logo/primary-logo/primary-logo.component.mjs +0 -16
  360. package/esm2022/src/lib/components/logo/primary-logo/primary-logo.module.mjs +0 -18
  361. package/esm2022/src/lib/components/logo/primary-logo/public-api.mjs +0 -3
  362. package/esm2022/src/lib/components/progress-indicators/progress-bar/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-bar.mjs +0 -5
  363. package/esm2022/src/lib/components/progress-indicators/progress-bar/progress-bar.component.mjs +0 -78
  364. package/esm2022/src/lib/components/progress-indicators/progress-bar/progress-bar.module.mjs +0 -19
  365. package/esm2022/src/lib/components/progress-indicators/progress-bar/public-api.mjs +0 -3
  366. package/esm2022/src/lib/components/progress-indicators/progress-indicator-spinner/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-indicator-spinner.mjs +0 -5
  367. package/esm2022/src/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.component.mjs +0 -79
  368. package/esm2022/src/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.module.mjs +0 -19
  369. package/esm2022/src/lib/components/progress-indicators/progress-indicator-spinner/progress-indicator-spinner.types.mjs +0 -8
  370. package/esm2022/src/lib/components/progress-indicators/progress-indicator-spinner/public-api.mjs +0 -3
  371. package/esm2022/src/lib/components/progress-indicators/progress-spinner/ascentgl-ads-ui-src-lib-components-progress-indicators-progress-spinner.mjs +0 -5
  372. package/esm2022/src/lib/components/progress-indicators/progress-spinner/progress-spinner.component.mjs +0 -95
  373. package/esm2022/src/lib/components/progress-indicators/progress-spinner/progress-spinner.module.mjs +0 -22
  374. package/esm2022/src/lib/components/progress-indicators/progress-spinner/public-api.mjs +0 -3
  375. package/esm2022/src/lib/components/shell-layout/ascentgl-ads-ui-src-lib-components-shell-layout.mjs +0 -5
  376. package/esm2022/src/lib/components/shell-layout/public-api.mjs +0 -3
  377. package/esm2022/src/lib/components/shell-layout/shell-layout.component.mjs +0 -25
  378. package/esm2022/src/lib/components/shell-layout/shell-layout.module.mjs +0 -18
  379. package/esm2022/src/lib/components/splash-page/ascentgl-ads-ui-src-lib-components-splash-page.mjs +0 -5
  380. package/esm2022/src/lib/components/splash-page/public-api.mjs +0 -3
  381. package/esm2022/src/lib/components/splash-page/splash-page.component.mjs +0 -20
  382. package/esm2022/src/lib/components/splash-page/splash-page.module.mjs +0 -18
  383. package/esm2022/src/lib/components/tags/tag-container/ascentgl-ads-ui-src-lib-components-tags-tag-container.mjs +0 -5
  384. package/esm2022/src/lib/components/tags/tag-container/public-api.mjs +0 -3
  385. package/esm2022/src/lib/components/tags/tag-container/tag-container.component.mjs +0 -11
  386. package/esm2022/src/lib/components/tags/tag-container/tag-container.module.mjs +0 -18
  387. package/src/assets/sass/ads-ui/overrides/_ag-grid.scss +0 -2
@@ -1,683 +0,0 @@
1
- import { ChangeDetectorRef, Component, contentChild, ElementRef, EventEmitter, Input, Output, Renderer2, signal, TemplateRef, ViewChild, } from '@angular/core';
2
- import { debounce, map, tap } from 'rxjs/operators';
3
- import { Validators } from '@angular/forms';
4
- import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
5
- import { AbstractDropdownComponent, } from '../../abstracts/abstract.dropdown.component';
6
- import { Observable, of, timer } from 'rxjs';
7
- import { adsIconChevronDown, adsIconSearch } from '@ascentgl/ads-icons/icons';
8
- import { DomHelper } from '@ascentgl/ads-utils';
9
- import { MatOption } from '@angular/material/core';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/material/form-field";
13
- import * as i3 from "@ascentgl/ads-icons";
14
- import * as i4 from "@angular/material/input";
15
- import * as i5 from "@angular/material/progress-spinner";
16
- import * as i6 from "@angular/material/autocomplete";
17
- import * as i7 from "@angular/material/core";
18
- import * as i8 from "@angular/material/button";
19
- import * as i9 from "../../common/input.tooltip.component";
20
- import * as i10 from "../../common/error/error.component";
21
- import * as i11 from "../../common/hint/hint.component";
22
- import * as i12 from "../../common/success/success.component";
23
- import * as i13 from "./search-dropdown-highlighter.pipe";
24
- export class AdsSearchDropdownComponent extends AbstractDropdownComponent {
25
- /**
26
- * NOTE: INPUT PARAMS BELOW ARE OVERRIDDEN BECAUSE FOR SOME UNKNOWN REASON STORYBOOK WON'T SHOW THEM FROM PARENT CLASS
27
- */
28
- /** Form control, associated with input field */
29
- set control(control) {
30
- super.control = control;
31
- }
32
- constructor(cdr, renderer, ref) {
33
- super();
34
- this.cdr = cdr;
35
- this.renderer = renderer;
36
- this.ref = ref;
37
- /** @ignore */
38
- this.optionRef = contentChild.required((TemplateRef));
39
- /** Maximum amount of characters in the input field */
40
- this.maxlength = 255;
41
- /** Set to additional paneClass if required*/
42
- this.panelClass = '';
43
- /** If "true", component will not try to load additional options */
44
- this.staticOptions = false;
45
- /** If "true" and "staticOptions" is also true additional filter will be applied to remove options that do not match input value */
46
- this.filterOptions = true;
47
- /** If "true", emitSearchValueInput will emit empty values too */
48
- this.emitEmptyValues = false;
49
- /** If "true", first time focusing on input will start loading suggestions if input has a value */
50
- this.loadSuggestionOnInit = false;
51
- /** If "true", will read option template provided via "ng-template dropdown-option" selector */
52
- this.useOptionTemplate = false;
53
- /** set minimum amount of characters to start search */
54
- this.minValueLength = 1;
55
- /** Set to "true" to prevent click even propagation */
56
- this.preventClick = false;
57
- /** @ignore */
58
- this.closePanelEnabled = true;
59
- /** Object, containing key=>value pairs for errors and their translated messages */
60
- this.errorMessages = {};
61
- /** Optional "id" attribute for input field */
62
- this.id = '';
63
- /** Empty input field placeholder */
64
- this.placeholder = '';
65
- /**
66
- * END OF OVERRIDDEN PARAMETERS
67
- */
68
- /** Emits currently input search value. Use it to react and generate fresh options list, based on the value */
69
- this.emitSearchValueInput = new EventEmitter();
70
- /** @ignore */
71
- this.loading = signal(false);
72
- /** @ignore */
73
- this.isInternalValueSet = false;
74
- /** @ignore */
75
- this.ignoreOnBlur = false;
76
- /** @ignore */
77
- this.initialSuggestionsChecked = false;
78
- /** @ignore */
79
- this.allOptions = new Map();
80
- /** @ignore */
81
- this.displayFn = (option) => {
82
- return option ? option.value : '';
83
- };
84
- this.registry.register([adsIconSearch, adsIconChevronDown]);
85
- }
86
- /** @ignore */
87
- ngOnChanges(changes) {
88
- if (changes.options) {
89
- this.processOptions();
90
- }
91
- super.ngOnChanges(changes);
92
- }
93
- /** @ignore */
94
- ngOnInit() {
95
- this.setValidators();
96
- this.setupSubscriptions();
97
- this.cdr.detectChanges();
98
- }
99
- ngAfterViewInit() {
100
- super.ngAfterViewInit();
101
- this.overrideKeydownHandler();
102
- }
103
- /** @ignore */
104
- ngOnDestroy() {
105
- if (this.unsubscribeFromScroll)
106
- this.unsubscribeFromScroll();
107
- this.unsubscribeFromOptions();
108
- this.unsubscribeFromDisplayedControl();
109
- this.valueControlSubscription?.unsubscribe();
110
- this.valueControlStatusSubscription?.unsubscribe();
111
- }
112
- /** @ignore */
113
- get canSearch() {
114
- return !this.loading() && !this.displayControl.disabled && !!this.searchIconClickCallback;
115
- }
116
- /** @ignore */
117
- get canUseMoreDataOption() {
118
- return !!this.moreDataOption && !!this.displayedOptions.size && !this.loading();
119
- }
120
- /** @ignore */
121
- get canUseNoDataOption() {
122
- return (!!this.noDataOption &&
123
- !this.displayedOptions.size &&
124
- !this.loading() &&
125
- !!this.displayControl.value &&
126
- this.displayControl.dirty);
127
- }
128
- /** @ignore */
129
- get canUseStaticOption() {
130
- return !!this.staticDataOption && !this.loading();
131
- }
132
- /** @ignore */
133
- get showDropdownIcon() {
134
- return this.staticOptions && (!!this.displayedOptions.size || !!this.allOptions.size);
135
- }
136
- /** @ignore */
137
- onSearchIconClick(event) {
138
- event.stopPropagation();
139
- if (this.searchIconClickCallback) {
140
- this.searchIconClickCallback(this.input?.nativeElement.value);
141
- }
142
- }
143
- /** @ignore */
144
- onKeyDown(eventTarget) {
145
- if (this.preventClick) {
146
- return;
147
- }
148
- if (!(eventTarget instanceof HTMLInputElement))
149
- return;
150
- /**
151
- * if one of static options was selected when "Enter"
152
- * key was clicked - execute return displayedValue back
153
- * and execute static option onClick events
154
- */
155
- if (this.moreDataMatOption?.selected) {
156
- eventTarget.value = this.getDisplayedValueAsString();
157
- this.activateStaticOption(this.moreDataOption);
158
- }
159
- else if (this.noDataMatOption?.selected) {
160
- eventTarget.value = this.getDisplayedValueAsString();
161
- this.activateStaticOption(this.noDataOption);
162
- }
163
- else if (this.staticDataMatOption?.selected) {
164
- eventTarget.value = this.getDisplayedValueAsString();
165
- this.activateStaticOption(this.staticDataOption);
166
- }
167
- else {
168
- /**
169
- * otherwise if displayed value is different from input value - sync them
170
- * NOTE: this happens when option is selected in dropdown and "Enter" key is pressed
171
- * because "onInput" event does not fire in that case
172
- * if displayed value is the same as input value, and we have onEnterKeyDown callback - execute it
173
- * NOTE: this happens when value is input directly into input field
174
- */
175
- if (this.getDisplayedValueAsString() != eventTarget.value) {
176
- this.displayControl.setValue(eventTarget.value, { emitEvent: false });
177
- }
178
- else if (this.onEnterKeyDown) {
179
- this.onEnterKeyDown(eventTarget.value);
180
- }
181
- this.unselectComponent();
182
- }
183
- }
184
- /** @ignore */
185
- onBlur() {
186
- this.displayControl.markAsTouched();
187
- this.valueControl.markAsTouched();
188
- if (!this.preventClick) {
189
- /**
190
- * if action onBlur is allowed and value is a string - apply it to form control before blurring
191
- * NOTE: this may happen if value was input into control but
192
- * no existing options were explicitly selected
193
- */
194
- if (!this.ignoreOnBlur && typeof this.displayControl.value == 'string') {
195
- this.setControlValueFromString(this.displayControl.value);
196
- }
197
- this.ignoreOnBlur = false;
198
- }
199
- /**
200
- * if we are still loading - stop it
201
- */
202
- if (this.loading()) {
203
- this.loading.set(false);
204
- /**
205
- * unsubscribe from options to prevent their further processing
206
- */
207
- this.unsubscribeFromOptions();
208
- /**
209
- * unsubscribe from display control change to prevent it from sending the data
210
- */
211
- this.unsubscribeFromDisplayedControl();
212
- /**
213
- * resubscribe it again to return to normal workflow
214
- */
215
- this.subscribeToDisplayedControlValueChanged();
216
- /**
217
- * set loadSuggestionOnInit to resume loading when control is focused again
218
- */
219
- this.resetInitialState();
220
- }
221
- if (this.closePanelEnabled && !this.preventClick)
222
- this.trigger?.closePanel();
223
- }
224
- /** @ignore */
225
- onFocus() {
226
- /**
227
- * if we have no displayed options,
228
- * we can load data on initial value,
229
- * we are not dealing with static options,
230
- * initial suggestions are not yet loaded,
231
- * and we have input value or can emit empty values - we can start loading suggestions
232
- */
233
- if (!this.displayedOptions.size &&
234
- this.loadSuggestionOnInit &&
235
- !this.staticOptions &&
236
- !this.initialSuggestionsChecked &&
237
- (this.input?.nativeElement.value || this.emitEmptyValues)) {
238
- this.loading.set(true);
239
- this.unsubscribeFromOptions();
240
- /**
241
- * if we are loading on init and display control has value - mark it as dirty for consistency
242
- */
243
- if (this.loadSuggestionOnInit && this.displayControl.value && this.displayControl.pristine) {
244
- this.displayControl.markAsDirty();
245
- }
246
- this.emitSearchValueInput.emit(this.input?.nativeElement.value);
247
- }
248
- this.initialSuggestionsChecked = true;
249
- }
250
- /** @ignore */
251
- onInput(eventTarget) {
252
- if (eventTarget instanceof HTMLInputElement) {
253
- const value = eventTarget.value.trim();
254
- /**
255
- * if new trimmed value is different from current trimmed value and new trimmed value is either empty or
256
- * fits min length - use it
257
- * NOTE: this allows to avoid reacting on empty strings being input
258
- * also spaces in the end of the string will be ignored until they are followed by a different character
259
- */
260
- if (value !== this.getDisplayedValueAsString(false).trim() && (!value || value.length >= this.minValueLength)) {
261
- this.displayControl.setValue(eventTarget.value);
262
- }
263
- }
264
- }
265
- /** @ignore */
266
- getDisplayedValueAsString(checkAdditionalFormatting = true) {
267
- let value = '';
268
- if (this.displayControl.value) {
269
- value =
270
- typeof this.displayControl.value == 'string'
271
- ? this.displayControl.value
272
- : (this.displayControl.value.value ?? '');
273
- }
274
- if (checkAdditionalFormatting && this.mustApplyAdditionalFiltering() && this.previousControlValue !== value) {
275
- this.previousControlValue = value;
276
- this.displayedOptions = new Map();
277
- this.allOptions.forEach((optionValue, option) => {
278
- if (optionValue.toLowerCase().includes(value.toLowerCase())) {
279
- this.displayedOptions.set(option, optionValue);
280
- }
281
- });
282
- }
283
- return value;
284
- }
285
- /** @ignore */
286
- reset() {
287
- this.displayedOptions = new Map(this.allOptions);
288
- }
289
- /** @ignore */
290
- onStaticOptionMouseDown(event, option) {
291
- /**
292
- * only proceed if left mouse button was clicked
293
- */
294
- if (event.button !== 0)
295
- return;
296
- this.activateStaticOption(option);
297
- }
298
- /** @ignore */
299
- onOptionMouseDown(event, option) {
300
- /**
301
- * only proceed if left mouse button was clicked
302
- */
303
- if (event.button !== 0)
304
- return;
305
- this.modifyOptionClickEvent(option);
306
- if (this.preventClick)
307
- return;
308
- /**
309
- * NOTE: we set displayControl value in mousedown event to override value setting in onClick
310
- * and avoid UI artifacts connected with it
311
- */
312
- this.displayControl.setValue(option?.value);
313
- }
314
- /** @ignore */
315
- resetInitialState() {
316
- this.loadSuggestionOnInit = true;
317
- this.initialSuggestionsChecked = false;
318
- }
319
- /** @ignore */
320
- canShowError() {
321
- return !!this.displayControl.errors && (this.displayControl.touched || this.immediateValidation);
322
- }
323
- /** @ignore */
324
- touchInvalid(control) {
325
- super.touchInvalid(control);
326
- super.touchInvalid(this.displayControl);
327
- }
328
- /** @ignore */
329
- processOptions() {
330
- this.allOptions = new Map();
331
- /**
332
- * if options are not provided - reset
333
- */
334
- if (!this.options) {
335
- this.loading.set(false);
336
- this.displayedOptions = new Map();
337
- return;
338
- }
339
- /**
340
- * "processOptions" is fired any time options change - thus we need to set loading to true when it happens
341
- */
342
- this.loading.set(true);
343
- /**
344
- * subscribe to options to extract displayedOptions from them
345
- * NOTE: we do not use displayedOptions as Observable because
346
- * we may need displayedOptions directly on onKeyDown event
347
- */
348
- this.optionsSubscription = this.options.subscribe((options) => {
349
- this.loading.set(false);
350
- /**
351
- * turn DropdownComponentOptions into DropdownComponentDisplayedOptions
352
- */
353
- super.processOptions(options);
354
- this.allOptions = new Map(this.displayedOptions);
355
- });
356
- }
357
- /** @ignore */
358
- setupSubscriptions() {
359
- this.controlValueToDisplayedControlValue();
360
- /**
361
- * subscribe to control value change to synchronize the value when changed externally
362
- */
363
- this.valueControlSubscription = this.valueControl.valueChanges.subscribe(() => {
364
- if (!this.isInternalValueSet) {
365
- this.controlValueToDisplayedControlValue();
366
- }
367
- });
368
- /**
369
- * sync display control statuses with value control status for proper error display
370
- */
371
- this.valueControlStatusSubscription = this.valueControl.statusChanges.subscribe(() => this.syncState());
372
- this.subscribeToDisplayedControlValueChanged();
373
- /**
374
- * listen to scroll to reposition the dropdown
375
- */
376
- this.unsubscribeFromScroll = this.renderer.listen(DomHelper.getScrollableParent(this.ref.nativeElement), 'scroll', () => {
377
- if (this.trigger?.panelOpen)
378
- this.trigger.updatePosition();
379
- });
380
- this.syncState();
381
- }
382
- /** @ignore */
383
- subscribeToDisplayedControlValueChanged() {
384
- this.displayedControlSubscription = this.displayControl.valueChanges
385
- .pipe(map((value) => {
386
- if (!value)
387
- value = '';
388
- return value;
389
- }), tap((value) => {
390
- /**
391
- * mark displayControl as dirty
392
- * because MatAutocomplete does not do it automatically
393
- */
394
- this.displayControl.markAsDirty();
395
- /**
396
- * unsubscribe from previous options to stop loading them
397
- */
398
- this.unsubscribeFromOptions();
399
- /**
400
- * stop processing if value is not provided
401
- */
402
- if (!value) {
403
- /**
404
- * clear displayed options if value is not provided
405
- */
406
- if (!this.staticOptions) {
407
- this.displayedOptions = new Map();
408
- }
409
- this.setControlValue(null);
410
- if (this.loading()) {
411
- /**
412
- * set loadSuggestionOnInit to resume loading when control is focused again
413
- * NOTE: this is required because by the time onBlur happens - loading is false and
414
- * this method will not be fired from onBlur
415
- */
416
- this.resetInitialState();
417
- }
418
- }
419
- else if (typeof value != 'string') {
420
- this.setControlValueFromOption(value.key, false);
421
- }
422
- this.loading.set(this.canEmitValue(value));
423
- }), debounce((value) => {
424
- return this.canEmitValue(value) && value ? timer(500) : of({});
425
- }))
426
- .subscribe((value) => {
427
- if (this.canEmitValue(value)) {
428
- this.emitSearchValueInput.emit(value);
429
- }
430
- });
431
- }
432
- /** @ignore */
433
- unsubscribeFromOptions() {
434
- this.optionsSubscription?.unsubscribe();
435
- }
436
- unsubscribeFromDisplayedControl() {
437
- this.displayedControlSubscription?.unsubscribe();
438
- }
439
- /** @ignore */
440
- displayFirstError(control = this.displayControl) {
441
- return super.displayFirstError(control);
442
- }
443
- /** @ignore */
444
- clear(event) {
445
- event?.stopPropagation();
446
- if (event && event.button !== 0) {
447
- return;
448
- }
449
- this.displayControl.setValue(null);
450
- this.displayControl.markAsTouched();
451
- if (this.closePanelEnabled)
452
- this.trigger?.closePanel();
453
- }
454
- /** @ignore */
455
- togglePanel(event) {
456
- event?.stopPropagation();
457
- if (this.trigger?.panelOpen) {
458
- if (this.closePanelEnabled)
459
- this.trigger?.closePanel();
460
- }
461
- else {
462
- this.trigger?.openPanel();
463
- this.input?.nativeElement.focus();
464
- }
465
- }
466
- /** @ignore */
467
- controlValueToDisplayedControlValue() {
468
- /**
469
- * extract displayable value as string from valueControl, if it is not empty
470
- */
471
- const displayedValue = this.valueControl.value
472
- ? this.getDisplayedValue(this.valueControl.value)
473
- : this.valueControl.value;
474
- /**
475
- * use it to build displayedControl value
476
- */
477
- this.displayControl.setValue(displayedValue ? { key: this.valueControl.value, value: displayedValue } : this.valueControl.value, { emitEvent: false });
478
- }
479
- mustApplyAdditionalFiltering() {
480
- return !this.staticOptions || (this.staticOptions && this.filterOptions);
481
- }
482
- /** @ignore */
483
- unselectComponent() {
484
- if (this.input?.nativeElement instanceof HTMLInputElement) {
485
- this.input.nativeElement.blur();
486
- }
487
- }
488
- /** @ignore */
489
- activateStaticOption(option) {
490
- if (!option)
491
- return;
492
- /**
493
- * ignoreOnBlur to "true" to disable
494
- * component's input onBlur event
495
- * NOTE: this is needed when we click on static options
496
- */
497
- this.ignoreOnBlur = true;
498
- this.moreDataMatOption?.deselect();
499
- this.noDataMatOption?.deselect();
500
- if (option.onClick) {
501
- option.onClick(this.input?.nativeElement.value);
502
- }
503
- this.unselectComponent();
504
- }
505
- /** @ignore */
506
- setValidators() {
507
- /**
508
- * make sure displayControl has the same validators as control
509
- */
510
- this.displayControl.addValidators(this.valueControl.validator ?? []);
511
- /**
512
- * required validator must be set manually in this component
513
- * because controls are disconnected from input field
514
- */
515
- if (this.required) {
516
- this.valueControl.addValidators(Validators.required);
517
- this.displayControl.addValidators(Validators.required);
518
- }
519
- this.valueControl.updateValueAndValidity({ emitEvent: false });
520
- this.displayControl.updateValueAndValidity({ emitEvent: false });
521
- }
522
- /** @ignore */
523
- canEmitValue(value) {
524
- /**
525
- * only emit event if value is a string, and we can emit empty values, or it is not empty
526
- * NOTE: it disallows to emit explicitly selected "REAL" values
527
- */
528
- return !this.staticOptions && typeof value == 'string' && (this.emitEmptyValues || !!value);
529
- }
530
- /** @ignore */
531
- setControlValueFromString(displayedValue) {
532
- let isValueApplied = false;
533
- /**
534
- * loop through displayedOptions;
535
- * if matching displayedOption value found - use displayedOptions option as control value
536
- */
537
- for (const [option, value] of this.displayedOptions) {
538
- if (value.toLowerCase() === displayedValue.toLowerCase()) {
539
- this.setControlValueFromOption(option);
540
- isValueApplied = true;
541
- break;
542
- }
543
- }
544
- if (!isValueApplied) {
545
- this.clear();
546
- }
547
- }
548
- /** @ignore */
549
- setControlValueFromOption(option, skipSame = true) {
550
- this.unselectComponent();
551
- this.setControlValue(option, skipSame);
552
- }
553
- setControlValue(option, skipSame = true) {
554
- /**
555
- * only update control value if it differs from provided one
556
- * NOTE: we need this check to avoid emitting control value change
557
- * when the same dropdown option is selected in dropdown several times
558
- */
559
- if (skipSame && this.valueControl.value === option) {
560
- return;
561
- }
562
- this.valueControl.markAsTouched();
563
- this.valueControl.markAsDirty();
564
- /**
565
- * toggle isInternalValueSet to make
566
- * sure internal subscription to control value will
567
- * ignore this setValue event
568
- */
569
- this.isInternalValueSet = true;
570
- this.valueControl.setValue(option);
571
- this.isInternalValueSet = false;
572
- }
573
- overrideKeydownHandler() {
574
- if (this.trigger) {
575
- const handler = this.trigger._handleKeydown;
576
- /**
577
- * this allows to block default keydown handler if needed
578
- */
579
- this.trigger._handleKeydown = (event) => {
580
- const option = this.trigger?.activeOption;
581
- this.modifyOptionClickEvent(option);
582
- handler.call(this.trigger, event);
583
- /**
584
- * make sure option does not lose "selected" state if click is prevented
585
- * NOTE: this is d one for "nicety"
586
- */
587
- if (this.preventClick && option && event.key === 'Enter') {
588
- this.auto?._keyManager.setActiveItem(option);
589
- }
590
- };
591
- }
592
- }
593
- modifyOptionClickEvent(option) {
594
- /**
595
- * modify "_selectViaInteraction" method of the option
596
- * so that we can block its selection if needed
597
- */
598
- if (option && !option.modified) {
599
- option.modified = true;
600
- const handler = option._selectViaInteraction;
601
- option._selectViaInteraction = () => {
602
- if (this.preventClick) {
603
- this.auto?._keyManager.setActiveItem(-1);
604
- return;
605
- }
606
- handler.call(option);
607
- };
608
- }
609
- }
610
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: AdsSearchDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
611
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: AdsSearchDropdownComponent, selector: "ads-search-dropdown", inputs: { maxlength: "maxlength", panelClass: "panelClass", options: "options", staticOptions: "staticOptions", filterOptions: "filterOptions", emitEmptyValues: "emitEmptyValues", loadSuggestionOnInit: "loadSuggestionOnInit", noDataOption: "noDataOption", moreDataOption: "moreDataOption", staticDataOption: "staticDataOption", onEnterKeyDown: "onEnterKeyDown", searchIconClickCallback: "searchIconClickCallback", displayValueFormatter: "displayValueFormatter", useOptionTemplate: "useOptionTemplate", minValueLength: "minValueLength", preventClick: "preventClick", closePanelEnabled: "closePanelEnabled", control: "control", errorMessages: "errorMessages", hint: "hint", id: "id", label: "label", placeholder: "placeholder" }, outputs: { emitSearchValueInput: "emitSearchValueInput" }, queries: [{ propertyName: "optionRef", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "moreDataMatOption", first: true, predicate: ["moreDataMatOption"], descendants: true }, { propertyName: "noDataMatOption", first: true, predicate: ["noDataMatOption"], descendants: true }, { propertyName: "staticDataMatOption", first: true, predicate: ["staticDataMatOption"], descendants: true }, { propertyName: "auto", first: true, predicate: ["auto"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div [ngStyle]=\"{ minWidth: width }\" class=\"ads-field-container\">\n <div [ngStyle]=\"{ width: width }\">\n <mat-form-field\n [ngClass]=\"{\n 'immediate-validation': immediateValidation,\n 'is-open': trigger?.panelOpen,\n invalid: canShowError(),\n 'success-label': canShowSuccess(),\n 'x-small': smallSize,\n }\"\n [ngStyle]=\"{ width: width }\"\n >\n @if ((label || required) && !smallSize) {\n <mat-label>{{ label }}</mat-label>\n }\n <input\n #input\n [disabled]=\"displayControl.disabled\"\n (keydown.enter)=\"onKeyDown($event.target)\"\n (blur)=\"onBlur()\"\n (input)=\"onInput($event.target)\"\n (focus)=\"onFocus()\"\n type=\"text\"\n [autocomplete]=\"'none'\"\n [id]=\"id\"\n matInput\n [value]=\"getDisplayedValueAsString()\"\n [attr.maxlength]=\"maxlength\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [disableRipple]=\"true\"\n [class]=\"\n 'ads-dropdown-panel' +\n (fitContent ? ' fit-content' : '') +\n (loading() ? ' loading' : '') +\n (preventClick ? '' : ' clickable') +\n ' ' +\n panelClass\n \"\n >\n @for (option of displayedOptions | keyvalue: applySorting; track $index) {\n <mat-option #opt [value]=\"option\" (mousedown)=\"onOptionMouseDown($event, opt)\">\n @if (useOptionTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"optionRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option.key, value: option.value }\"\n ></ng-template>\n } @else {\n <span\n [innerHtml]=\"\n displayValueFormatter\n ? displayValueFormatter(\n option!.value! | adsSearchDropdownHighlighter: displayControl.value,\n option.key\n )\n : (option!.value! | adsSearchDropdownHighlighter: displayControl.value)\n \"\n ></span>\n }\n </mat-option>\n }\n\n @if (canUseMoreDataOption) {\n <hr class=\"no-results-hr\" />\n <mat-option #moreDataMatOption class=\"extra\" [disabled]=\"!moreDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: moreDataOption }\"\n />\n </mat-option>\n }\n\n @if (canUseNoDataOption) {\n <mat-option #noDataMatOption class=\"extra\" [disabled]=\"!noDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: noDataOption }\"\n />\n </mat-option>\n }\n\n @if (canUseStaticOption) {\n @if (displayedOptions.size) {\n <hr class=\"no-results-hr\" />\n }\n <mat-option #staticDataMatOption class=\"extra\" [disabled]=\"!staticDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: staticDataOption }\"\n />\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (canClear) {\n <button matTextSuffix type=\"button\" mat-icon-button (click)=\"clear($event)\" class=\"action-icon\">\n <ads-icon name=\"cross\" [size]=\"smallSize ? 'xxs' : 'xs'\" [theme]=\"'iconPrimary'\" class=\"cross-icon\" />\n </button>\n }\n @if (showDropdownIcon) {\n <button matTextSuffix type=\"button\" mat-icon-button (click)=\"togglePanel($event)\" class=\"action-icon\">\n <ads-icon\n name=\"chevron_down\"\n [size]=\"smallSize ? 'xxs' : 'xs'\"\n [theme]=\"'iconPrimary'\"\n class=\"chevron-down\"\n />\n </button>\n }\n @if (!staticOptions && loading()) {\n <mat-spinner matTextSuffix diameter=\"22\" />\n }\n @if (!staticOptions && !loading()) {\n <button\n matTextSuffix\n type=\"button\"\n mat-icon-button\n [disabled]=\"!canSearch\"\n (click)=\"canSearch ? onSearchIconClick($event) : null\"\n class=\"action-icon\"\n >\n <ads-icon name=\"search\" size=\"xs\" [theme]=\"'iconPrimary'\" class=\"search-icon\" />\n </button>\n }\n </mat-form-field>\n <div class=\"footer-container\">\n @if (canShowError()) {\n <ads-error [error]=\"displayFirstError()\" [ngStyle]=\"{ width: width }\" />\n } @else if (canShowSuccess()) {\n <ads-success [success]=\"successMessage!\" [ngStyle]=\"{ width: width }\" />\n } @else if (hint) {\n <ads-hint [hint]=\"hint\" [control]=\"valueControl\" [ngStyle]=\"{ width: width }\" />\n }\n </div>\n </div>\n @if (tooltip) {\n <ads-input-tooltip [tooltip]=\"tooltip\" [smallSize]=\"smallSize\" />\n }\n\n <ng-template #extraOptionValue let-option>\n <span\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"onStaticOptionMouseDown($event, option!)\"\n [innerHTML]=\"option!.label\"\n ></span>\n </ng-template>\n</div>\n", styles: [".ads-field-container{display:flex;gap:12px;align-items:flex-start}:host::ng-deep mat-form-field{--mdc-filled-text-field-container-color: var(--color-white);--mdc-filled-text-field-input-text-color: var(--color-medium);--mdc-filled-text-field-error-label-text-color: var(--color-error);--mdc-filled-text-field-label-text-color: var(--color-medium);--mdc-filled-text-field-focus-label-text-color: var(--color-medium);--mdc-filled-text-field-hover-label-text-color: var(--color-medium);--mdc-filled-text-field-label-text-size: 16px}:host::ng-deep mat-form-field .mdc-floating-label--float-above{--mdc-filled-text-field-label-text-size: 12px}:host::ng-deep mat-form-field .mdc-text-field{box-sizing:border-box;border-radius:5px;outline:1px solid var(--color-light);outline-offset:-1px;align-items:center;padding:0 12px;cursor:text;height:48px}:host::ng-deep mat-form-field .mdc-text-field .cross-icon{stroke:var(--color-medium)!important}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--no-label .mat-mdc-form-field-flex{height:100%}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--no-label .mat-mdc-form-field-flex .mat-mdc-form-field-infix{align-items:center}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input{height:24px}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input::-webkit-outer-spin-button,:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input[type=number]{-moz-appearance:textfield}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid{outline:2px solid var(--color-error);outline-offset:-2px}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .cross-icon,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .visibility-eye,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .picker{stroke:var(--color-error)!important}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .chevron-down,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .search-icon{color:var(--color-error)!important}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex{align-items:center}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix{display:flex;align-items:flex-end;width:120px}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix label{width:100%}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix label .mat-mdc-form-field-required-marker{color:var(--mdc-filled-text-field-error-label-text-color)}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-text-suffix{display:flex;align-items:center}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-text-suffix .mat-mdc-icon-button{display:flex;align-items:center;justify-content:center}:host::ng-deep mat-form-field .action-icon{padding:0;--mdc-icon-button-state-layer-size: 35px}:host::ng-deep mat-form-field .action-icon .mat-mdc-button-touch-target{height:unset;width:unset}:host::ng-deep mat-form-field.x-small .mdc-text-field{height:24px;padding:0 8px}:host::ng-deep mat-form-field.x-small .mdc-text-field .mat-mdc-form-field-input-control{font-size:12px;line-height:16px}:host::ng-deep mat-form-field.x-small .action-icon{--mdc-icon-button-state-layer-size: 22px}:host::ng-deep mat-form-field.readonly .mdc-text-field{background-color:var(--mdc-filled-text-field-disabled-container-color);border:none}:host::ng-deep mat-form-field:not(.readonly) .mdc-text-field:hover{background-color:var(--color-light-30);outline:2px solid var(--color-secondary-hover);outline-offset:-2px}:host::ng-deep mat-form-field:not(.readonly) .mdc-text-field:hover .visibility-eye{fill:var(--color-light-30)!important}:host::ng-deep mat-form-field:not(.readonly).mat-focused .mdc-text-field{outline:2px solid var(--color-medium);outline-offset:-2px;background-color:var(--color-muted)}:host::ng-deep mat-form-field:not(.readonly).mat-focused .mdc-text-field .visibility-eye{fill:var(--color-muted)!important}:host::ng-deep mat-form-field.immediate-validation .mdc-text-field{outline:2px solid var(--color-medium);outline-offset:-2px}:host::ng-deep mat-form-field.immediate-validation .mdc-text-field.mdc-text-field--invalid{outline:2px solid var(--color-error);outline-offset:-2px}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{color:var(--mdc-filled-text-field-label-text-color)}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper:before{content:none}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper .mat-mdc-form-field-error-wrapper,:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper .mat-mdc-form-field-hint-wrapper{position:relative;padding:0}:host::ng-deep mat-form-field .mdc-line-ripple{display:none}:host::ng-deep mat-form-field.success-label .mat-mdc-form-field-required-marker,:host::ng-deep mat-form-field.success-label mat-label{color:var(--color-success)!important}:host::ng-deep mat-form-field.success-label .mdc-text-field{outline:2px solid var(--color-success);outline-offset:-2px}:host::ng-deep mat-form-field.success-label .cross-icon,:host::ng-deep mat-form-field.success-label .visibility-eye,:host::ng-deep mat-form-field.success-label .picker{stroke:var(--color-success)!important}:host::ng-deep mat-form-field.success-label .chevron-down,:host::ng-deep mat-form-field.success-label .search-icon{color:var(--color-success)!important}:host::ng-deep mat-form-field.error-label mat-label{color:var(--color-error)}:host::ng-deep mat-hint{display:inline-block}:host::ng-deep .mat-mdc-form-field-hint-spacer{display:none}.info-tooltip{position:relative;top:12px}mat-error{display:flex;padding-top:2px}mat-error .error{display:flex;align-items:flex-start;gap:2px}mat-error .error ads-icon{position:relative;top:2px}\n", "mat-select{--mat-select-trigger-text-line-height: 24px;--mat-select-enabled-trigger-text-color: var(--color-medium);--mat-select-disabled-trigger-text-color: var(--color-medium);--mat-select-placeholder-text-color: var(--color-medium)}mat-option{--mat-option-selected-state-layer-color: var(--color-secondary);--mat-option-selected-state-label-text-color: var(--color-white);--mat-option-hover-state-layer-color: var(--color-secondary-hover);padding:0 12px}mat-option.checkbox{padding:0 12px 0 6px}mat-option:active{background-color:var(--color-secondary-pressed)!important}mat-form-field.pill ::ng-deep .mdc-text-field{border-radius:24px;padding-left:16px;background-color:var(--color-light-30)}mat-form-field.pill ::ng-deep .mdc-text-field:not(.mdc-text-field--invalid){border-color:transparent}mat-form-field ::ng-deep .mdc-text-field .mat-mdc-select-arrow-wrapper{display:none}mat-form-field.x-small mat-select{font-size:12px;line-height:16px}mat-option:hover:not(.mdc-list-item--disabled){color:var(--color-white);background-color:var(--mat-option-hover-state-layer-color)}mat-option:hover:not(.mdc-list-item--disabled).mdc-list-item--selected{background-color:var(--mat-option-hover-state-layer-color)}mat-option:hover:not(.mdc-list-item--disabled) ::ng-deep .mdc-list-item__primary-text{color:var(--color-white)!important}mat-option.mdc-list-item--disabled{opacity:.5}mat-option ::ng-deep .mat-pseudo-checkbox{display:none}mat-option ::ng-deep .mdc-list-item__primary-text{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n", "mat-form-field{width:100%}mat-form-field.invalid ::ng-deep{--mdc-filled-text-field-label-text-color: var(--color-error);--mdc-filled-text-field-hover-label-text-color: var(--color-error);--mdc-filled-text-field-focus-label-text-color: var(--color-error)}mat-form-field.invalid ::ng-deep .mdc-text-field{border-color:var(--color-error)}mat-form-field.invalid ::ng-deep .mdc-text-field ads-icon{stroke:var(--mdc-filled-text-field-error-label-text-color)!important;color:var(--mdc-filled-text-field-error-label-text-color)!important}mat-option.extra{opacity:1;font-size:.75rem;min-height:32px;display:flex}mat-option.extra ::ng-deep .mdc-list-item__primary-text{opacity:1}mat-option ::ng-deep .highlighted-text{font-weight:700}mat-spinner{margin:13px}\n", ".footer-container{min-height:20px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i3.AdsIconComponent, selector: "ads-icon", inputs: ["size", "name", "color", "theme", "stroke"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.AdsInputTooltipComponent, selector: "ads-input-tooltip", inputs: ["tooltip", "smallSize"] }, { kind: "component", type: i10.AdsErrorComponent, selector: "ads-error", inputs: ["error"] }, { kind: "component", type: i11.AdsHintComponent, selector: "ads-hint", inputs: ["control", "hint"] }, { kind: "component", type: i12.AdsSuccessComponent, selector: "ads-success", inputs: ["success"] }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i13.AdsSearchDropdownHighlighterPipe, name: "adsSearchDropdownHighlighter" }] }); }
612
- }
613
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: AdsSearchDropdownComponent, decorators: [{
614
- type: Component,
615
- args: [{ selector: 'ads-search-dropdown', template: "<div [ngStyle]=\"{ minWidth: width }\" class=\"ads-field-container\">\n <div [ngStyle]=\"{ width: width }\">\n <mat-form-field\n [ngClass]=\"{\n 'immediate-validation': immediateValidation,\n 'is-open': trigger?.panelOpen,\n invalid: canShowError(),\n 'success-label': canShowSuccess(),\n 'x-small': smallSize,\n }\"\n [ngStyle]=\"{ width: width }\"\n >\n @if ((label || required) && !smallSize) {\n <mat-label>{{ label }}</mat-label>\n }\n <input\n #input\n [disabled]=\"displayControl.disabled\"\n (keydown.enter)=\"onKeyDown($event.target)\"\n (blur)=\"onBlur()\"\n (input)=\"onInput($event.target)\"\n (focus)=\"onFocus()\"\n type=\"text\"\n [autocomplete]=\"'none'\"\n [id]=\"id\"\n matInput\n [value]=\"getDisplayedValueAsString()\"\n [attr.maxlength]=\"maxlength\"\n [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [disableRipple]=\"true\"\n [class]=\"\n 'ads-dropdown-panel' +\n (fitContent ? ' fit-content' : '') +\n (loading() ? ' loading' : '') +\n (preventClick ? '' : ' clickable') +\n ' ' +\n panelClass\n \"\n >\n @for (option of displayedOptions | keyvalue: applySorting; track $index) {\n <mat-option #opt [value]=\"option\" (mousedown)=\"onOptionMouseDown($event, opt)\">\n @if (useOptionTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"optionRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option.key, value: option.value }\"\n ></ng-template>\n } @else {\n <span\n [innerHtml]=\"\n displayValueFormatter\n ? displayValueFormatter(\n option!.value! | adsSearchDropdownHighlighter: displayControl.value,\n option.key\n )\n : (option!.value! | adsSearchDropdownHighlighter: displayControl.value)\n \"\n ></span>\n }\n </mat-option>\n }\n\n @if (canUseMoreDataOption) {\n <hr class=\"no-results-hr\" />\n <mat-option #moreDataMatOption class=\"extra\" [disabled]=\"!moreDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: moreDataOption }\"\n />\n </mat-option>\n }\n\n @if (canUseNoDataOption) {\n <mat-option #noDataMatOption class=\"extra\" [disabled]=\"!noDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: noDataOption }\"\n />\n </mat-option>\n }\n\n @if (canUseStaticOption) {\n @if (displayedOptions.size) {\n <hr class=\"no-results-hr\" />\n }\n <mat-option #staticDataMatOption class=\"extra\" [disabled]=\"!staticDataOption!.onClick\">\n <ng-container\n [ngTemplateOutlet]=\"extraOptionValue\"\n [ngTemplateOutletContext]=\"{ $implicit: staticDataOption }\"\n />\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (canClear) {\n <button matTextSuffix type=\"button\" mat-icon-button (click)=\"clear($event)\" class=\"action-icon\">\n <ads-icon name=\"cross\" [size]=\"smallSize ? 'xxs' : 'xs'\" [theme]=\"'iconPrimary'\" class=\"cross-icon\" />\n </button>\n }\n @if (showDropdownIcon) {\n <button matTextSuffix type=\"button\" mat-icon-button (click)=\"togglePanel($event)\" class=\"action-icon\">\n <ads-icon\n name=\"chevron_down\"\n [size]=\"smallSize ? 'xxs' : 'xs'\"\n [theme]=\"'iconPrimary'\"\n class=\"chevron-down\"\n />\n </button>\n }\n @if (!staticOptions && loading()) {\n <mat-spinner matTextSuffix diameter=\"22\" />\n }\n @if (!staticOptions && !loading()) {\n <button\n matTextSuffix\n type=\"button\"\n mat-icon-button\n [disabled]=\"!canSearch\"\n (click)=\"canSearch ? onSearchIconClick($event) : null\"\n class=\"action-icon\"\n >\n <ads-icon name=\"search\" size=\"xs\" [theme]=\"'iconPrimary'\" class=\"search-icon\" />\n </button>\n }\n </mat-form-field>\n <div class=\"footer-container\">\n @if (canShowError()) {\n <ads-error [error]=\"displayFirstError()\" [ngStyle]=\"{ width: width }\" />\n } @else if (canShowSuccess()) {\n <ads-success [success]=\"successMessage!\" [ngStyle]=\"{ width: width }\" />\n } @else if (hint) {\n <ads-hint [hint]=\"hint\" [control]=\"valueControl\" [ngStyle]=\"{ width: width }\" />\n }\n </div>\n </div>\n @if (tooltip) {\n <ads-input-tooltip [tooltip]=\"tooltip\" [smallSize]=\"smallSize\" />\n }\n\n <ng-template #extraOptionValue let-option>\n <span\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"onStaticOptionMouseDown($event, option!)\"\n [innerHTML]=\"option!.label\"\n ></span>\n </ng-template>\n</div>\n", styles: [".ads-field-container{display:flex;gap:12px;align-items:flex-start}:host::ng-deep mat-form-field{--mdc-filled-text-field-container-color: var(--color-white);--mdc-filled-text-field-input-text-color: var(--color-medium);--mdc-filled-text-field-error-label-text-color: var(--color-error);--mdc-filled-text-field-label-text-color: var(--color-medium);--mdc-filled-text-field-focus-label-text-color: var(--color-medium);--mdc-filled-text-field-hover-label-text-color: var(--color-medium);--mdc-filled-text-field-label-text-size: 16px}:host::ng-deep mat-form-field .mdc-floating-label--float-above{--mdc-filled-text-field-label-text-size: 12px}:host::ng-deep mat-form-field .mdc-text-field{box-sizing:border-box;border-radius:5px;outline:1px solid var(--color-light);outline-offset:-1px;align-items:center;padding:0 12px;cursor:text;height:48px}:host::ng-deep mat-form-field .mdc-text-field .cross-icon{stroke:var(--color-medium)!important}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--no-label .mat-mdc-form-field-flex{height:100%}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--no-label .mat-mdc-form-field-flex .mat-mdc-form-field-infix{align-items:center}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input{height:24px}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input::-webkit-outer-spin-button,:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host::ng-deep mat-form-field .mdc-text-field:not(.mdc-text-field--no-label) .mat-mdc-form-field-infix input[type=number]{-moz-appearance:textfield}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid{outline:2px solid var(--color-error);outline-offset:-2px}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .cross-icon,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .visibility-eye,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .picker{stroke:var(--color-error)!important}:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .chevron-down,:host::ng-deep mat-form-field .mdc-text-field.mdc-text-field--invalid .search-icon{color:var(--color-error)!important}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex{align-items:center}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix{display:flex;align-items:flex-end;width:120px}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix label{width:100%}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix label .mat-mdc-form-field-required-marker{color:var(--mdc-filled-text-field-error-label-text-color)}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-text-suffix{display:flex;align-items:center}:host::ng-deep mat-form-field .mdc-text-field .mat-mdc-form-field-text-suffix .mat-mdc-icon-button{display:flex;align-items:center;justify-content:center}:host::ng-deep mat-form-field .action-icon{padding:0;--mdc-icon-button-state-layer-size: 35px}:host::ng-deep mat-form-field .action-icon .mat-mdc-button-touch-target{height:unset;width:unset}:host::ng-deep mat-form-field.x-small .mdc-text-field{height:24px;padding:0 8px}:host::ng-deep mat-form-field.x-small .mdc-text-field .mat-mdc-form-field-input-control{font-size:12px;line-height:16px}:host::ng-deep mat-form-field.x-small .action-icon{--mdc-icon-button-state-layer-size: 22px}:host::ng-deep mat-form-field.readonly .mdc-text-field{background-color:var(--mdc-filled-text-field-disabled-container-color);border:none}:host::ng-deep mat-form-field:not(.readonly) .mdc-text-field:hover{background-color:var(--color-light-30);outline:2px solid var(--color-secondary-hover);outline-offset:-2px}:host::ng-deep mat-form-field:not(.readonly) .mdc-text-field:hover .visibility-eye{fill:var(--color-light-30)!important}:host::ng-deep mat-form-field:not(.readonly).mat-focused .mdc-text-field{outline:2px solid var(--color-medium);outline-offset:-2px;background-color:var(--color-muted)}:host::ng-deep mat-form-field:not(.readonly).mat-focused .mdc-text-field .visibility-eye{fill:var(--color-muted)!important}:host::ng-deep mat-form-field.immediate-validation .mdc-text-field{outline:2px solid var(--color-medium);outline-offset:-2px}:host::ng-deep mat-form-field.immediate-validation .mdc-text-field.mdc-text-field--invalid{outline:2px solid var(--color-error);outline-offset:-2px}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{color:var(--mdc-filled-text-field-label-text-color)}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper:before{content:none}:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper .mat-mdc-form-field-error-wrapper,:host::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper .mat-mdc-form-field-hint-wrapper{position:relative;padding:0}:host::ng-deep mat-form-field .mdc-line-ripple{display:none}:host::ng-deep mat-form-field.success-label .mat-mdc-form-field-required-marker,:host::ng-deep mat-form-field.success-label mat-label{color:var(--color-success)!important}:host::ng-deep mat-form-field.success-label .mdc-text-field{outline:2px solid var(--color-success);outline-offset:-2px}:host::ng-deep mat-form-field.success-label .cross-icon,:host::ng-deep mat-form-field.success-label .visibility-eye,:host::ng-deep mat-form-field.success-label .picker{stroke:var(--color-success)!important}:host::ng-deep mat-form-field.success-label .chevron-down,:host::ng-deep mat-form-field.success-label .search-icon{color:var(--color-success)!important}:host::ng-deep mat-form-field.error-label mat-label{color:var(--color-error)}:host::ng-deep mat-hint{display:inline-block}:host::ng-deep .mat-mdc-form-field-hint-spacer{display:none}.info-tooltip{position:relative;top:12px}mat-error{display:flex;padding-top:2px}mat-error .error{display:flex;align-items:flex-start;gap:2px}mat-error .error ads-icon{position:relative;top:2px}\n", "mat-select{--mat-select-trigger-text-line-height: 24px;--mat-select-enabled-trigger-text-color: var(--color-medium);--mat-select-disabled-trigger-text-color: var(--color-medium);--mat-select-placeholder-text-color: var(--color-medium)}mat-option{--mat-option-selected-state-layer-color: var(--color-secondary);--mat-option-selected-state-label-text-color: var(--color-white);--mat-option-hover-state-layer-color: var(--color-secondary-hover);padding:0 12px}mat-option.checkbox{padding:0 12px 0 6px}mat-option:active{background-color:var(--color-secondary-pressed)!important}mat-form-field.pill ::ng-deep .mdc-text-field{border-radius:24px;padding-left:16px;background-color:var(--color-light-30)}mat-form-field.pill ::ng-deep .mdc-text-field:not(.mdc-text-field--invalid){border-color:transparent}mat-form-field ::ng-deep .mdc-text-field .mat-mdc-select-arrow-wrapper{display:none}mat-form-field.x-small mat-select{font-size:12px;line-height:16px}mat-option:hover:not(.mdc-list-item--disabled){color:var(--color-white);background-color:var(--mat-option-hover-state-layer-color)}mat-option:hover:not(.mdc-list-item--disabled).mdc-list-item--selected{background-color:var(--mat-option-hover-state-layer-color)}mat-option:hover:not(.mdc-list-item--disabled) ::ng-deep .mdc-list-item__primary-text{color:var(--color-white)!important}mat-option.mdc-list-item--disabled{opacity:.5}mat-option ::ng-deep .mat-pseudo-checkbox{display:none}mat-option ::ng-deep .mdc-list-item__primary-text{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n", "mat-form-field{width:100%}mat-form-field.invalid ::ng-deep{--mdc-filled-text-field-label-text-color: var(--color-error);--mdc-filled-text-field-hover-label-text-color: var(--color-error);--mdc-filled-text-field-focus-label-text-color: var(--color-error)}mat-form-field.invalid ::ng-deep .mdc-text-field{border-color:var(--color-error)}mat-form-field.invalid ::ng-deep .mdc-text-field ads-icon{stroke:var(--mdc-filled-text-field-error-label-text-color)!important;color:var(--mdc-filled-text-field-error-label-text-color)!important}mat-option.extra{opacity:1;font-size:.75rem;min-height:32px;display:flex}mat-option.extra ::ng-deep .mdc-list-item__primary-text{opacity:1}mat-option ::ng-deep .highlighted-text{font-weight:700}mat-spinner{margin:13px}\n", ".footer-container{min-height:20px}\n"] }]
616
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { maxlength: [{
617
- type: Input
618
- }], panelClass: [{
619
- type: Input
620
- }], options: [{
621
- type: Input
622
- }], staticOptions: [{
623
- type: Input
624
- }], filterOptions: [{
625
- type: Input
626
- }], emitEmptyValues: [{
627
- type: Input
628
- }], loadSuggestionOnInit: [{
629
- type: Input
630
- }], noDataOption: [{
631
- type: Input
632
- }], moreDataOption: [{
633
- type: Input
634
- }], staticDataOption: [{
635
- type: Input
636
- }], onEnterKeyDown: [{
637
- type: Input
638
- }], searchIconClickCallback: [{
639
- type: Input
640
- }], displayValueFormatter: [{
641
- type: Input
642
- }], useOptionTemplate: [{
643
- type: Input
644
- }], minValueLength: [{
645
- type: Input
646
- }], preventClick: [{
647
- type: Input
648
- }], closePanelEnabled: [{
649
- type: Input
650
- }], control: [{
651
- type: Input
652
- }], errorMessages: [{
653
- type: Input
654
- }], hint: [{
655
- type: Input
656
- }], id: [{
657
- type: Input
658
- }], label: [{
659
- type: Input
660
- }], placeholder: [{
661
- type: Input
662
- }], emitSearchValueInput: [{
663
- type: Output
664
- }], trigger: [{
665
- type: ViewChild,
666
- args: [MatAutocompleteTrigger]
667
- }], input: [{
668
- type: ViewChild,
669
- args: ['input']
670
- }], moreDataMatOption: [{
671
- type: ViewChild,
672
- args: ['moreDataMatOption']
673
- }], noDataMatOption: [{
674
- type: ViewChild,
675
- args: ['noDataMatOption']
676
- }], staticDataMatOption: [{
677
- type: ViewChild,
678
- args: ['staticDataMatOption']
679
- }], auto: [{
680
- type: ViewChild,
681
- args: ['auto']
682
- }] } });
683
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRzLXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWZpZWxkcy9zZWFyY2gtZmllbGRzL3NlYXJjaC1kcm9wZG93bi9zZWFyY2gtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hZHMtdWkvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tZmllbGRzL3NlYXJjaC1maWVsZHMvc2VhcmNoLWRyb3Bkb3duL3NlYXJjaC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RixPQUFPLEVBQ0wseUJBQXlCLEdBSTFCLE1BQU0sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBTSxxQkFBcUIsQ0FBQztBQU1wRSxPQUFPLEVBQUUsU0FBUyxF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K0JBQ0UscUJBQXFCO3VJQWlCdEIsU0FBUztzQkFBakIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBT08sT0FBTztzQkFBbkIsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdXLElBQUk7c0JBQXBCLEtBQUs7Z0JBR0csRUFBRTtzQkFBVixLQUFLO2dCQUdXLEtBQUs7c0JBQXJCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFPSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRzRCLE9BQU87c0JBQXpDLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUdiLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFHYyxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUdBLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUdNLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBR2IsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgY29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgc2lnbmFsLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2UsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdERyb3Bkb3duQ29tcG9uZW50LFxuICBEcm9wZG93bkNvbXBvbmVudERpc3BsYXllZE9wdGlvbnMsXG4gIERyb3Bkb3duQ29tcG9uZW50T3B0aW9uLFxuICBEcm9wZG93bkNvbXBvbmVudE9wdGlvbnMsXG59IGZyb20gJy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC5kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFkc0ljb25DaGV2cm9uRG93biwgYWRzSWNvblNlYXJjaCB9IGZyb20gJ0Bhc2NlbnRnbC9hZHMtaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgRG9tSGVscGVyLCBHRU5FUklDX0NPTExFQ1RJT04gfSBmcm9tICdAYXNjZW50Z2wvYWRzLXV0aWxzJztcbmltcG9ydCB7XG4gIFNlYXJjaERyb3Bkb3duQ29tcG9uZW50T3B0aW9ucyxcbiAgU2VhcmNoRHJvcGRvd25EaXNwbGF5Q29udHJvbFZhbHVlLFxuICBTZWFyY2hEcm9wZG93blN0YXRpY09wdGlvbixcbn0gZnJvbSAnLi9zZWFyY2gtZHJvcGRvd24uY29tcG9uZW50LnR5cGVzJztcbmltcG9ydCB7IE1hdE9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgVEVNUExBVEVfVFlQRSB9IGZyb20gJy4uLy4uL2NvbW1vbi9kcm9wZG93bi1vcHRpb24tdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbnR5cGUgQ3VzdG9tTWF0T3B0aW9uID0gKE1hdE9wdGlvbiAmIHsgbW9kaWZpZWQ/OiBib29sZWFuIH0pIHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWRzLXNlYXJjaC1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi4vLi4vaW5wdXQvaW5wdXQuY29tcG9uZW50LnNjc3MnLFxuICAgICcuLi8uLi9kcm9wZG93bnMvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICAgICcuL3NlYXJjaC1kcm9wZG93bi5jb21wb25lbnQuc2NzcycsXG4gICAgJy4uLy4uL2NvbW1vbi9jb21tb24uaW5wdXQuY29tcG9uZW50LnNjc3MnLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBZHNTZWFyY2hEcm9wZG93bkNvbXBvbmVudFxuICBleHRlbmRzIEFic3RyYWN0RHJvcGRvd25Db21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKiBAaWdub3JlICovXG4gIG9wdGlvblJlZiA9IGNvbnRlbnRDaGlsZC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjxURU1QTEFURV9UWVBFPj4oVGVtcGxhdGVSZWY8VEVNUExBVEVfVFlQRT4pO1xuXG4gIC8qKiBNYXhpbXVtIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCBmaWVsZCAqL1xuICBASW5wdXQoKSBtYXhsZW5ndGggPSAyNTU7XG5cbiAgLyoqIFNldCB0byBhZGRpdGlvbmFsIHBhbmVDbGFzcyBpZiByZXF1aXJlZCovXG4gIEBJbnB1dCgpIHBhbmVsQ2xhc3MgPSAnJztcblxuICAvKiogQ29udGFpbnMgZHJvcGRvd24gb3B0aW9ucyAqL1xuICBASW5wdXQoKSBvcHRpb25zPzogT2JzZXJ2YWJsZTxTZWFyY2hEcm9wZG93bkNvbXBvbmVudE9wdGlvbnM+O1xuXG4gIC8qKiBJZiBcInRydWVcIiwgY29tcG9uZW50IHdpbGwgbm90IHRyeSB0byBsb2FkIGFkZGl0aW9uYWwgb3B0aW9ucyAqL1xuICBASW5wdXQoKSBzdGF0aWNPcHRpb25zID0gZmFsc2U7XG5cbiAgLyoqIElmIFwidHJ1ZVwiIGFuZCBcInN0YXRpY09wdGlvbnNcIiBpcyBhbHNvIHRydWUgYWRkaXRpb25hbCBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIHJlbW92ZSBvcHRpb25zIHRoYXQgZG8gbm90IG1hdGNoIGlucHV0IHZhbHVlICovXG4gIEBJbnB1dCgpIGZpbHRlck9wdGlvbnMgPSB0cnVlO1xuXG4gIC8qKiBJZiBcInRydWVcIiwgZW1pdFNlYXJjaFZhbHVlSW5wdXQgd2lsbCBlbWl0IGVtcHR5IHZhbHVlcyB0b28gKi9cbiAgQElucHV0KCkgZW1pdEVtcHR5VmFsdWVzID0gZmFsc2U7XG5cbiAgLyoqIElmIFwidHJ1ZVwiLCBmaXJzdCB0aW1lIGZvY3VzaW5nIG9uIGlucHV0IHdpbGwgc3RhcnQgbG9hZGluZyBzdWdnZXN0aW9ucyBpZiBpbnB1dCBoYXMgYSB2YWx1ZSAqL1xuICBASW5wdXQoKSBsb2FkU3VnZ2VzdGlvbk9uSW5pdCA9IGZhbHNlO1xuXG4gIC8qKiBQcm92aWRlIGNvbmZpZ3VyYXRpb24gZm9yIGRlZmF1bHQgb3B0aW9uIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpZiBubyByZXN1bHRzIHdlcmUgZm91bmQgKi9cbiAgQElucHV0KCkgbm9EYXRhT3B0aW9uOiBTZWFyY2hEcm9wZG93blN0YXRpY09wdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKiogUHJvdmlkZSBjb25maWd1cmF0aW9uIGZvciBkZWZhdWx0IG9wdGlvbiB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgaWYgbm8gaW50ZW5kZWQgcmVzdWx0cyB3ZXJlIGZvdW5kICovXG4gIEBJbnB1dCgpIG1vcmVEYXRhT3B0aW9uOiBTZWFyY2hEcm9wZG93blN0YXRpY09wdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKiogUHJvdmlkZSBjb25maWd1cmF0aW9uIGZvciBkZWZhdWx0IG9wdGlvbiB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgaWYgbmVlZGVkICovXG4gIEBJbnB1dCgpIHN0YXRpY0RhdGFPcHRpb246IFNlYXJjaERyb3Bkb3duU3RhdGljT3B0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBQcm92aWRlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiBlbnRlciBrZXkgaXMgZG93biB3aGlsZSBpbnB1dCB2YWx1ZSBpcyBiZWluZyBzZXQgKi9cbiAgQElucHV0KCkgb25FbnRlcktleURvd246ICgoY3VycmVudElucHV0VmFsdWU6IHN0cmluZykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFByb3ZpZGUgY2FsbGJhY2sgdGhhdCB3aWxsIHZiZSBleGVjdXRlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIG1hZ25pZnlpbmcgZ2xhc3MgaWNvbiAqL1xuICBASW5wdXQoKSBzZWFyY2hJY29uQ2xpY2tDYWxsYmFjazogKChjdXJyZW50SW5wdXRWYWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAvKiogUHJvdmlkZSBjYWxsYmFjayB0aGF0IHdpbGwgdmJlIGV4ZWN1dGVkIHdoZW4gdXNlciBjbGlja3Mgb24gbWFnbmlmeWluZyBnbGFzcyBpY29uICovXG4gIEBJbnB1dCgpIGRpc3BsYXlWYWx1ZUZvcm1hdHRlcjogKCh2YWx1ZTogc3RyaW5nLCBvcHRpb246IERyb3Bkb3duQ29tcG9uZW50T3B0aW9uKSA9PiBzdHJpbmcgfCBTYWZlSHRtbCkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIElmIFwidHJ1ZVwiLCB3aWxsIHJlYWQgb3B0aW9uIHRlbXBsYXRlIHByb3ZpZGVkIHZpYSBcIm5nLXRlbXBsYXRlIGRyb3Bkb3duLW9wdGlvblwiIHNlbGVjdG9yICovXG4gIEBJbnB1dCgpIHVzZU9wdGlvblRlbXBsYXRlID0gZmFsc2U7XG5cbiAgLyoqIHNldCBtaW5pbXVtIGFtb3VudCBvZiBjaGFyYWN0ZXJzIHRvIHN0YXJ0IHNlYXJjaCAqL1xuICBASW5wdXQoKSBtaW5WYWx1ZUxlbmd0aCA9IDE7XG5cbiAgLyoqIFNldCB0byBcInRydWVcIiB0byBwcmV2ZW50IGNsaWNrIGV2ZW4gcHJvcGFnYXRpb24gKi9cbiAgQElucHV0KCkgcHJldmVudENsaWNrID0gZmFsc2U7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQElucHV0KCkgY2xvc2VQYW5lbEVuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBOT1RFOiBJTlBVVCBQQVJBTVMgQkVMT1cgQVJFIE9WRVJSSURERU4gQkVDQVVTRSBGT1IgU09NRSBVTktOT1dOIFJFQVNPTiBTVE9SWUJPT0sgV09OJ1QgU0hPVyBUSEVNIEZST00gUEFSRU5UIENMQVNTXG4gICAqL1xuXG4gIC8qKiBGb3JtIGNvbnRyb2wsIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBmaWVsZCAqL1xuICBASW5wdXQoKSBzZXQgY29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsKSB7XG4gICAgc3VwZXIuY29udHJvbCA9IGNvbnRyb2w7XG4gIH1cblxuICAvKiogT2JqZWN0LCBjb250YWluaW5nIGtleT0+dmFsdWUgcGFpcnMgZm9yIGVycm9ycyBhbmQgdGhlaXIgdHJhbnNsYXRlZCBtZXNzYWdlcyAqL1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2VzOiBHRU5FUklDX0NPTExFQ1RJT048c3RyaW5nPiA9IHt9O1xuXG4gIC8qKiBIaW50IG1lc3NhZ2UsIGRpc3BsYXllZCB1bmRlciB0aGUgY29udHJvbCAqL1xuICBASW5wdXQoKSBkZWNsYXJlIGhpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIFwiaWRcIiBhdHRyaWJ1dGUgZm9yIGlucHV0IGZpZWxkICovXG4gIEBJbnB1dCgpIGlkID0gJyc7XG5cbiAgLyoqIE9wdGlvbmFsIGNvbnRyb2wgZmllbGQgbGFiZWwgKi9cbiAgQElucHV0KCkgZGVjbGFyZSBsYWJlbD86IHN0cmluZztcblxuICAvKiogRW1wdHkgaW5wdXQgZmllbGQgcGxhY2Vob2xkZXIgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKipcbiAgICogRU5EIE9GIE9WRVJSSURERU4gUEFSQU1FVEVSU1xuICAgKi9cblxuICAvKiogRW1pdHMgY3VycmVudGx5IGlucHV0IHNlYXJjaCB2YWx1ZS4gVXNlIGl0IHRvIHJlYWN0IGFuZCBnZW5lcmF0ZSBmcmVzaCBvcHRpb25zIGxpc3QsIGJhc2VkIG9uIHRoZSB2YWx1ZSAqL1xuICBAT3V0cHV0KCkgZW1pdFNlYXJjaFZhbHVlSW5wdXQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikgdHJpZ2dlcj86IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dD86IEVsZW1lbnRSZWY7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQFZpZXdDaGlsZCgnbW9yZURhdGFNYXRPcHRpb24nKSBtb3JlRGF0YU1hdE9wdGlvbj86IE1hdE9wdGlvbjtcblxuICAvKiogQGlnbm9yZSAqL1xuICBAVmlld0NoaWxkKCdub0RhdGFNYXRPcHRpb24nKSBub0RhdGFNYXRPcHRpb24/OiBNYXRPcHRpb247XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQFZpZXdDaGlsZCgnc3RhdGljRGF0YU1hdE9wdGlvbicpIHN0YXRpY0RhdGFNYXRPcHRpb24/OiBNYXRPcHRpb247XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQFZpZXdDaGlsZCgnYXV0bycpIGF1dG8/OiBNYXRBdXRvY29tcGxldGU7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBpc0ludGVybmFsVmFsdWVTZXQgPSBmYWxzZTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGRpc3BsYXllZENvbnRyb2xTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSB2YWx1ZUNvbnRyb2xTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvcHRpb25zU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdmFsdWVDb250cm9sU3RhdHVzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgaWdub3JlT25CbHVyID0gZmFsc2U7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBpbml0aWFsU3VnZ2VzdGlvbnNDaGVja2VkID0gZmFsc2U7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUZyb21TY3JvbGw/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgcHJldmlvdXNDb250cm9sVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBhbGxPcHRpb25zOiBEcm9wZG93bkNvbXBvbmVudERpc3BsYXllZE9wdGlvbnMgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlZjogRWxlbWVudFJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKFthZHNJY29uU2VhcmNoLCBhZHNJY29uQ2hldnJvbkRvd25dKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgb3B0aW9uczogU2ltcGxlQ2hhbmdlOyBpbW1lZGlhdGVWYWxpZGF0aW9uOiBTaW1wbGVDaGFuZ2UgfSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMucHJvY2Vzc09wdGlvbnMoKTtcbiAgICB9XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbGlkYXRvcnMoKTtcbiAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xuXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIHRoaXMub3ZlcnJpZGVLZXlkb3duSGFuZGxlcigpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVGcm9tU2Nyb2xsKSB0aGlzLnVuc3Vic2NyaWJlRnJvbVNjcm9sbCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tT3B0aW9ucygpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tRGlzcGxheWVkQ29udHJvbCgpO1xuICAgIHRoaXMudmFsdWVDb250cm9sU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudmFsdWVDb250cm9sU3RhdHVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0IGNhblNlYXJjaCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZygpICYmICF0aGlzLmRpc3BsYXlDb250cm9sLmRpc2FibGVkICYmICEhdGhpcy5zZWFyY2hJY29uQ2xpY2tDYWxsYmFjaztcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIGdldCBjYW5Vc2VNb3JlRGF0YU9wdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm1vcmVEYXRhT3B0aW9uICYmICEhdGhpcy5kaXNwbGF5ZWRPcHRpb25zLnNpemUgJiYgIXRoaXMubG9hZGluZygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0IGNhblVzZU5vRGF0YU9wdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLm5vRGF0YU9wdGlvbiAmJlxuICAgICAgIXRoaXMuZGlzcGxheWVkT3B0aW9ucy5zaXplICYmXG4gICAgICAhdGhpcy5sb2FkaW5nKCkgJiZcbiAgICAgICEhdGhpcy5kaXNwbGF5Q29udHJvbC52YWx1ZSAmJlxuICAgICAgdGhpcy5kaXNwbGF5Q29udHJvbC5kaXJ0eVxuICAgICk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXQgY2FuVXNlU3RhdGljT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3RhdGljRGF0YU9wdGlvbiAmJiAhdGhpcy5sb2FkaW5nKCk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXQgc2hvd0Ryb3Bkb3duSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0aWNPcHRpb25zICYmICghIXRoaXMuZGlzcGxheWVkT3B0aW9ucy5zaXplIHx8ICEhdGhpcy5hbGxPcHRpb25zLnNpemUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgb25TZWFyY2hJY29uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICh0aGlzLnNlYXJjaEljb25DbGlja0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLnNlYXJjaEljb25DbGlja0NhbGxiYWNrKHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG9uS2V5RG93bihldmVudFRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmVudENsaWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZXZlbnRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkgcmV0dXJuO1xuXG4gICAgLyoqXG4gICAgICogaWYgb25lIG9mIHN0YXRpYyBvcHRpb25zIHdhcyBzZWxlY3RlZCB3aGVuIFwiRW50ZXJcIlxuICAgICAqIGtleSB3YXMgY2xpY2tlZCAtIGV4ZWN1dGUgcmV0dXJuIGRpc3BsYXllZFZhbHVlIGJhY2tcbiAgICAgKiBhbmQgZXhlY3V0ZSBzdGF0aWMgb3B0aW9uIG9uQ2xpY2sgZXZlbnRzXG4gICAgICovXG4gICAgaWYgKHRoaXMubW9yZURhdGFNYXRPcHRpb24/LnNlbGVjdGVkKSB7XG4gICAgICBldmVudFRhcmdldC52YWx1ZSA9IHRoaXMuZ2V0RGlzcGxheWVkVmFsdWVBc1N0cmluZygpO1xuXG4gICAgICB0aGlzLmFjdGl2YXRlU3RhdGljT3B0aW9uKHRoaXMubW9yZURhdGFPcHRpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub0RhdGFNYXRPcHRpb24/LnNlbGVjdGVkKSB7XG4gICAgICBldmVudFRhcmdldC52YWx1ZSA9IHRoaXMuZ2V0RGlzcGxheWVkVmFsdWVBc1N0cmluZygpO1xuXG4gICAgICB0aGlzLmFjdGl2YXRlU3RhdGljT3B0aW9uKHRoaXMubm9EYXRhT3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGljRGF0YU1hdE9wdGlvbj8uc2VsZWN0ZWQpIHtcbiAgICAgIGV2ZW50VGFyZ2V0LnZhbHVlID0gdGhpcy5nZXREaXNwbGF5ZWRWYWx1ZUFzU3RyaW5nKCk7XG5cbiAgICAgIHRoaXMuYWN0aXZhdGVTdGF0aWNPcHRpb24odGhpcy5zdGF0aWNEYXRhT3B0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBvdGhlcndpc2UgaWYgZGlzcGxheWVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIGlucHV0IHZhbHVlIC0gc3luYyB0aGVtXG4gICAgICAgKiBOT1RFOiB0aGlzIGhhcHBlbnMgd2hlbiBvcHRpb24gaXMgc2VsZWN0ZWQgaW4gZHJvcGRvd24gYW5kIFwiRW50ZXJcIiBrZXkgaXMgcHJlc3NlZFxuICAgICAgICogYmVjYXVzZSBcIm9uSW5wdXRcIiBldmVudCBkb2VzIG5vdCBmaXJlIGluIHRoYXQgY2FzZVxuICAgICAgICogaWYgZGlzcGxheWVkIHZhbHVlIGlzIHRoZSBzYW1lIGFzIGlucHV0IHZhbHVlLCBhbmQgd2UgaGF2ZSBvbkVudGVyS2V5RG93biBjYWxsYmFjayAtIGV4ZWN1dGUgaXRcbiAgICAgICAqIE5PVEU6IHRoaXMgaGFwcGVucyB3aGVuIHZhbHVlIGlzIGlucHV0IGRpcmVjdGx5IGludG8gaW5wdXQgZmllbGRcbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuZ2V0RGlzcGxheWVkVmFsdWVBc1N0cmluZygpICE9IGV2ZW50VGFyZ2V0LnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUNvbnRyb2wuc2V0VmFsdWUoZXZlbnRUYXJnZXQudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbkVudGVyS2V5RG93bikge1xuICAgICAgICB0aGlzLm9uRW50ZXJLZXlEb3duKGV2ZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51bnNlbGVjdENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG9uQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnZhbHVlQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICBpZiAoIXRoaXMucHJldmVudENsaWNrKSB7XG4gICAgICAvKipcbiAgICAgICAqIGlmIGFjdGlvbiBvbkJsdXIgaXMgYWxsb3dlZCBhbmQgdmFsdWUgaXMgYSBzdHJpbmcgLSBhcHBseSBpdCB0byBmb3JtIGNvbnRyb2wgYmVmb3JlIGJsdXJyaW5nXG4gICAgICAgKiBOT1RFOiB0aGlzIG1heSBoYXBwZW4gaWYgdmFsdWUgd2FzIGlucHV0IGludG8gY29udHJvbCBidXRcbiAgICAgICAqIG5vIGV4aXN0aW5nIG9wdGlvbnMgd2VyZSBleHBsaWNpdGx5IHNlbGVjdGVkXG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5pZ25vcmVPbkJsdXIgJiYgdHlwZW9mIHRoaXMuZGlzcGxheUNvbnRyb2wudmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWVGcm9tU3RyaW5nKHRoaXMuZGlzcGxheUNvbnRyb2wudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlnbm9yZU9uQmx1ciA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlmIHdlIGFyZSBzdGlsbCBsb2FkaW5nIC0gc3RvcCBpdFxuICAgICAqL1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogdW5zdWJzY3JpYmUgZnJvbSBvcHRpb25zIHRvIHByZXZlbnQgdGhlaXIgZnVydGhlciBwcm9jZXNzaW5nXG4gICAgICAgKi9cbiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tT3B0aW9ucygpO1xuXG4gICAgICAvKipcbiAgICAgICAqIHVuc3Vic2NyaWJlIGZyb20gZGlzcGxheSBjb250cm9sIGNoYW5nZSB0byBwcmV2ZW50IGl0IGZyb20gc2VuZGluZyB0aGUgZGF0YVxuICAgICAgICovXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbURpc3BsYXllZENvbnRyb2woKTtcblxuICAgICAgLyoqXG4gICAgICAgKiByZXN1YnNjcmliZSBpdCBhZ2FpbiB0byByZXR1cm4gdG8gbm9ybWFsIHdvcmtmbG93XG4gICAgICAgKi9cbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9EaXNwbGF5ZWRDb250cm9sVmFsdWVDaGFuZ2VkKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogc2V0IGxvYWRTdWdnZXN0aW9uT25Jbml0IHRvIHJlc3VtZSBsb2FkaW5nIHdoZW4gY29udHJvbCBpcyBmb2N1c2VkIGFnYWluXG4gICAgICAgKi9cbiAgICAgIHRoaXMucmVzZXRJbml0aWFsU3RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zZVBhbmVsRW5hYmxlZCAmJiAhdGhpcy5wcmV2ZW50Q2xpY2spIHRoaXMudHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBpZiB3ZSBoYXZlIG5vIGRpc3BsYXllZCBvcHRpb25zLFxuICAgICAqIHdlIGNhbiBsb2FkIGRhdGEgb24gaW5pdGlhbCB2YWx1ZSxcbiAgICAgKiB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCBzdGF0aWMgb3B0aW9ucyxcbiAgICAgKiBpbml0aWFsIHN1Z2dlc3Rpb25zIGFyZSBub3QgeWV0IGxvYWRlZCxcbiAgICAgKiBhbmQgd2UgaGF2ZSBpbnB1dCB2YWx1ZSBvciBjYW4gZW1pdCBlbXB0eSB2YWx1ZXMgLSB3ZSBjYW4gc3RhcnQgbG9hZGluZyBzdWdnZXN0aW9uc1xuICAgICAqL1xuICAgIGlmIChcbiAgICAgICF0aGlzLmRpc3BsYXllZE9wdGlvbnMuc2l6ZSAmJlxuICAgICAgdGhpcy5sb2FkU3VnZ2VzdGlvbk9uSW5pdCAmJlxuICAgICAgIXRoaXMuc3RhdGljT3B0aW9ucyAmJlxuICAgICAgIXRoaXMuaW5pdGlhbFN1Z2dlc3Rpb25zQ2hlY2tlZCAmJlxuICAgICAgKHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQudmFsdWUgfHwgdGhpcy5lbWl0RW1wdHlWYWx1ZXMpXG4gICAgKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbU9wdGlvbnMoKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBpZiB3ZSBhcmUgbG9hZGluZyBvbiBpbml0IGFuZCBkaXNwbGF5IGNvbnRyb2wgaGFzIHZhbHVlIC0gbWFyayBpdCBhcyBkaXJ0eSBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMubG9hZFN1Z2dlc3Rpb25PbkluaXQgJiYgdGhpcy5kaXNwbGF5Q29udHJvbC52YWx1ZSAmJiB0aGlzLmRpc3BsYXlDb250cm9sLnByaXN0aW5lKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0U2VhcmNoVmFsdWVJbnB1dC5lbWl0KHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbFN1Z2dlc3Rpb25zQ2hlY2tlZCA9IHRydWU7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBvbklucHV0KGV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50VGFyZ2V0LnZhbHVlLnRyaW0oKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBpZiBuZXcgdHJpbW1lZCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSBjdXJyZW50IHRyaW1tZWQgdmFsdWUgYW5kIG5ldyB0cmltbWVkIHZhbHVlIGlzIGVpdGhlciBlbXB0eSBvclxuICAgICAgICogZml0cyBtaW4gbGVuZ3RoIC0gdXNlIGl0XG4gICAgICAgKiBOT1RFOiB0aGlzIGFsbG93cyB0byBhdm9pZCByZWFjdGluZyBvbiBlbXB0eSBzdHJpbmdzIGJlaW5nIGlucHV0XG4gICAgICAgKiBhbHNvIHNwYWNlcyBpbiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgd2lsbCBiZSBpZ25vcmVkIHVudGlsIHRoZXkgYXJlIGZvbGxvd2VkIGJ5IGEgZGlmZmVyZW50IGNoYXJhY3RlclxuICAgICAgICovXG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuZ2V0RGlzcGxheWVkVmFsdWVBc1N0cmluZyhmYWxzZSkudHJpbSgpICYmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID49IHRoaXMubWluVmFsdWVMZW5ndGgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUNvbnRyb2wuc2V0VmFsdWUoZXZlbnRUYXJnZXQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIGdldERpc3BsYXllZFZhbHVlQXNTdHJpbmcoY2hlY2tBZGRpdGlvbmFsRm9ybWF0dGluZyA9IHRydWUpOiBzdHJpbmcge1xuICAgIGxldCB2YWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuZGlzcGxheUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHZhbHVlID1cbiAgICAgICAgdHlwZW9mIHRoaXMuZGlzcGxheUNvbnRyb2wudmFsdWUgPT0gJ3N0cmluZydcbiAgICAgICAgICA/IHRoaXMuZGlzcGxheUNvbnRyb2wudmFsdWVcbiAgICAgICAgICA6ICh0aGlzLmRpc3BsYXlDb250cm9sLnZhbHVlLnZhbHVlID8/ICcnKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBZGRpdGlvbmFsRm9ybWF0dGluZyAmJiB0aGlzLm11c3RBcHBseUFkZGl0aW9uYWxGaWx0ZXJpbmcoKSAmJiB0aGlzLnByZXZpb3VzQ29udHJvbFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5wcmV2aW91c0NvbnRyb2xWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgIHRoaXMuYWxsT3B0aW9ucy5mb3JFYWNoKChvcHRpb25WYWx1ZSwgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25WYWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zLnNldChvcHRpb24sIG9wdGlvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zID0gbmV3IE1hcCh0aGlzLmFsbE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgb25TdGF0aWNPcHRpb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIG9wdGlvbjogU2VhcmNoRHJvcGRvd25TdGF0aWNPcHRpb24pOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBvbmx5IHByb2NlZWQgaWYgbGVmdCBtb3VzZSBidXR0b24gd2FzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2YXRlU3RhdGljT3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBvbk9wdGlvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgb3B0aW9uOiBDdXN0b21NYXRPcHRpb24pOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBvbmx5IHByb2NlZWQgaWYgbGVmdCBtb3VzZSBidXR0b24gd2FzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICB0aGlzLm1vZGlmeU9wdGlvbkNsaWNrRXZlbnQob3B0aW9uKTtcblxuICAgIGlmICh0aGlzLnByZXZlbnRDbGljaykgcmV0dXJuO1xuXG4gICAgLyoqXG4gICAgICogTk9URTogd2Ugc2V0IGRpc3BsYXlDb250cm9sIHZhbHVlIGluIG1vdXNlZG93biBldmVudCB0byBvdmVycmlkZSB2YWx1ZSBzZXR0aW5nIGluIG9uQ2xpY2tcbiAgICAgKiBhbmQgYXZvaWQgVUkgYXJ0aWZhY3RzIGNvbm5lY3RlZCB3aXRoIGl0XG4gICAgICovXG4gICAgdGhpcy5kaXNwbGF5Q29udHJvbC5zZXRWYWx1ZShvcHRpb24/LnZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIGRpc3BsYXlGbiA9IChvcHRpb24/OiB7IGtleTogRHJvcGRvd25Db21wb25lbnRPcHRpb247IHZhbHVlOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi52YWx1ZSA6ICcnO1xuICB9O1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHJlc2V0SW5pdGlhbFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFN1Z2dlc3Rpb25PbkluaXQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbFN1Z2dlc3Rpb25zQ2hlY2tlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY2FuU2hvd0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGlzcGxheUNvbnRyb2wuZXJyb3JzICYmICh0aGlzLmRpc3BsYXlDb250cm9sLnRvdWNoZWQgfHwgdGhpcy5pbW1lZGlhdGVWYWxpZGF0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByb3RlY3RlZCB0b3VjaEludmFsaWQoY29udHJvbDogRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICBzdXBlci50b3VjaEludmFsaWQoY29udHJvbCk7XG4gICAgc3VwZXIudG91Y2hJbnZhbGlkKHRoaXMuZGlzcGxheUNvbnRyb2wpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvdGVjdGVkIHByb2Nlc3NPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuYWxsT3B0aW9ucyA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICAgICAqIGlmIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCAtIHJlc2V0XG4gICAgICovXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFwicHJvY2Vzc09wdGlvbnNcIiBpcyBmaXJlZCBhbnkgdGltZSBvcHRpb25zIGNoYW5nZSAtIHRodXMgd2UgbmVlZCB0byBzZXQgbG9hZGluZyB0byB0cnVlIHdoZW4gaXQgaGFwcGVuc1xuICAgICAqL1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBzdWJzY3JpYmUgdG8gb3B0aW9ucyB0byBleHRyYWN0IGRpc3BsYXllZE9wdGlvbnMgZnJvbSB0aGVtXG4gICAgICogTk9URTogd2UgZG8gbm90IHVzZSBkaXNwbGF5ZWRPcHRpb25zIGFzIE9ic2VydmFibGUgYmVjYXVzZVxuICAgICAqIHdlIG1heSBuZWVkIGRpc3BsYXllZE9wdGlvbnMgZGlyZWN0bHkgb24gb25LZXlEb3duIGV2ZW50XG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnN1YnNjcmliZSgob3B0aW9uczogRHJvcGRvd25Db21wb25lbnRPcHRpb25zKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcblxuICAgICAgLyoqXG4gICAgICAgKiB0dXJuIERyb3Bkb3duQ29tcG9uZW50T3B0aW9ucyBpbnRvIERyb3Bkb3duQ29tcG9uZW50RGlzcGxheWVkT3B0aW9uc1xuICAgICAgICovXG4gICAgICBzdXBlci5wcm9jZXNzT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgdGhpcy5hbGxPcHRpb25zID0gbmV3IE1hcCh0aGlzLmRpc3BsYXllZE9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvdGVjdGVkIHNldHVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZVRvRGlzcGxheWVkQ29udHJvbFZhbHVlKCk7XG5cbiAgICAvKipcbiAgICAgKiBzdWJzY3JpYmUgdG8gY29udHJvbCB2YWx1ZSBjaGFuZ2UgdG8gc3luY2hyb25pemUgdGhlIHZhbHVlIHdoZW4gY2hhbmdlZCBleHRlcm5hbGx5XG4gICAgICovXG4gICAgdGhpcy52YWx1ZUNvbnRyb2xTdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0ludGVybmFsVmFsdWVTZXQpIHtcbiAgICAgICAgdGhpcy5jb250cm9sVmFsdWVUb0Rpc3BsYXllZENvbnRyb2xWYWx1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogc3luYyBkaXNwbGF5IGNvbnRyb2wgc3RhdHVzZXMgd2l0aCB2YWx1ZSBjb250cm9sIHN0YXR1cyBmb3IgcHJvcGVyIGVycm9yIGRpc3BsYXlcbiAgICAgKi9cbiAgICB0aGlzLnZhbHVlQ29udHJvbFN0YXR1c1N1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVDb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1N0YXRlKCkpO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVUb0Rpc3BsYXllZENvbnRyb2xWYWx1ZUNoYW5nZWQoKTtcblxuICAgIC8qKlxuICAgICAqIGxpc3RlbiB0byBzY3JvbGwgdG8gcmVwb3NpdGlvbiB0aGUgZHJvcGRvd25cbiAgICAgKi9cbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbVNjcm9sbCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgRG9tSGVscGVyLmdldFNjcm9sbGFibGVQYXJlbnQodGhpcy5yZWYubmF0aXZlRWxlbWVudCksXG4gICAgICAnc2Nyb2xsJyxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlcj8ucGFuZWxPcGVuKSB0aGlzLnRyaWdnZXIudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuc3luY1N0YXRlKCk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvRGlzcGxheWVkQ29udHJvbFZhbHVlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXllZENvbnRyb2xTdWJzY3JpcHRpb24gPSB0aGlzLmRpc3BsYXlDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgodmFsdWU/OiBTZWFyY2hEcm9wZG93bkRpc3BsYXlDb250cm9sVmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9ICcnO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBtYXJrIGRpc3BsYXlDb250cm9sIGFzIGRpcnR5XG4gICAgICAgICAgICogYmVjYXVzZSBNYXRBdXRvY29tcGxldGUgZG9lcyBub3QgZG8gaXQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuZGlzcGxheUNvbnRyb2wubWFya0FzRGlydHkoKTtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgb3B0aW9ucyB0byBzdG9wIGxvYWRpbmcgdGhlbVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tT3B0aW9ucygpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogc3RvcCBwcm9jZXNzaW5nIGlmIHZhbHVlIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2xlYXIgZGlzcGxheWVkIG9wdGlvbnMgaWYgdmFsdWUgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNPcHRpb25zKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWUobnVsbCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogc2V0IGxvYWRTdWdnZXN0aW9uT25Jbml0IHRvIHJlc3VtZSBsb2FkaW5nIHdoZW4gY29udHJvbCBpcyBmb2N1c2VkIGFnYWluXG4gICAgICAgICAgICAgICAqIE5PVEU6IHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBieSB0aGUgdGltZSBvbkJsdXIgaGFwcGVucyAtIGxvYWRpbmcgaXMgZmFsc2UgYW5kXG4gICAgICAgICAgICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGZpcmVkIGZyb20gb25CbHVyXG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlRnJvbU9wdGlvbih2YWx1ZS5rZXksIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldCh0aGlzLmNhbkVtaXRWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2FuRW1pdFZhbHVlKHZhbHVlKSAmJiB2YWx1ZSA/IHRpbWVyKDUwMCkgOiBvZih7fSk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWU6IFNlYXJjaERyb3Bkb3duRGlzcGxheUNvbnRyb2xWYWx1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5FbWl0VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0U2VhcmNoVmFsdWVJbnB1dC5lbWl0KDxzdHJpbmc+dmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVGcm9tT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbURpc3BsYXllZENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb250cm9sU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZGlzcGxheUZpcnN0RXJyb3IoY29udHJvbDogRm9ybUNvbnRyb2wgPSB0aGlzLmRpc3BsYXlDb250cm9sKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIuZGlzcGxheUZpcnN0RXJyb3IoY29udHJvbCk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBjbGVhcihldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5kaXNwbGF5Q29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICBpZiAodGhpcy5jbG9zZVBhbmVsRW5hYmxlZCkgdGhpcy50cmlnZ2VyPy5jbG9zZVBhbmVsKCk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICB0b2dnbGVQYW5lbChldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMudHJpZ2dlcj8ucGFuZWxPcGVuKSB7XG4gICAgICBpZiAodGhpcy5jbG9zZVBhbmVsRW5hYmxlZCkgdGhpcy50cmlnZ2VyPy5jbG9zZVBhbmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlcj8ub3BlblBhbmVsKCk7XG4gICAgICB0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjb250cm9sVmFsdWVUb0Rpc3BsYXllZENvbnRyb2xWYWx1ZSgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBleHRyYWN0IGRpc3BsYXlhYmxlIHZhbHVlIGFzIHN0cmluZyBmcm9tIHZhbHVlQ29udHJvbCwgaWYgaXQgaXMgbm90IGVtcHR5XG4gICAgICovXG4gICAgY29uc3QgZGlzcGxheWVkVmFsdWUgPSB0aGlzLnZhbHVlQ29udHJvbC52YWx1ZVxuICAgICAgPyB0aGlzLmdldERpc3BsYXllZFZhbHVlKHRoaXMudmFsdWVDb250cm9sLnZhbHVlKVxuICAgICAgOiB0aGlzLnZhbHVlQ29udHJvbC52YWx1ZTtcblxuICAgIC8qKlxuICAgICAqIHVzZSBpdCB0byBidWlsZCBkaXNwbGF5ZWRDb250cm9sIHZhbHVlXG4gICAgICovXG4gICAgdGhpcy5kaXNwbGF5Q29udHJvbC5zZXRWYWx1ZShcbiAgICAgIGRpc3BsYXllZFZhbHVlID8geyBrZXk6IHRoaXMudmFsdWVDb250cm9sLnZhbHVlLCB2YWx1ZTogZGlzcGxheWVkVmFsdWUgfSA6IHRoaXMudmFsdWVDb250cm9sLnZhbHVlLFxuICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbXVzdEFwcGx5QWRkaXRpb25hbEZpbHRlcmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc3RhdGljT3B0aW9ucyB8fCAodGhpcy5zdGF0aWNPcHRpb25zICYmIHRoaXMuZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHVuc2VsZWN0Q29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGFjdGl2YXRlU3RhdGljT3B0aW9uKG9wdGlvbj86IFNlYXJjaERyb3Bkb3duU3RhdGljT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgIC8qKlxuICAgICAqIGlnbm9yZU9uQmx1ciB0byBcInRydWVcIiB0byBkaXNhYmxlXG4gICAgICogY29tcG9uZW50J3MgaW5wdXQgb25CbHVyIGV2ZW50XG4gICAgICogTk9URTogdGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSBjbGljayBvbiBzdGF0aWMgb3B0aW9uc1xuICAgICAqL1xuICAgIHRoaXMuaWdub3JlT25CbHVyID0gdHJ1ZTtcblxuICAgIHRoaXMubW9yZURhdGFNYXRPcHRpb24/LmRlc2VsZWN0KCk7XG4gICAgdGhpcy5ub0RhdGFNYXRPcHRpb24/LmRlc2VsZWN0KCk7XG5cbiAgICBpZiAob3B0aW9uLm9uQ2xpY2spIHtcbiAgICAgIG9wdGlvbi5vbkNsaWNrKHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudW5zZWxlY3RDb21wb25lbnQoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgc2V0VmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBtYWtlIHN1cmUgZGlzcGxheUNvbnRyb2wgaGFzIHRoZSBzYW1lIHZhbGlkYXRvcnMgYXMgY29udHJvbFxuICAgICAqL1xuICAgIHRoaXMuZGlzcGxheUNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLnZhbHVlQ29udHJvbC52YWxpZGF0b3IgPz8gW10pO1xuICAgIC8qKlxuICAgICAqIHJlcXVpcmVkIHZhbGlkYXRvciBtdXN0IGJlIHNldCBtYW51YWxseSBpbiB0aGlzIGNvbXBvbmVudFxuICAgICAqIGJlY2F1c2UgY29udHJvbHMgYXJlIGRpc2Nvbm5lY3RlZCBmcm9tIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgIHRoaXMudmFsdWVDb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB0aGlzLmRpc3BsYXlDb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuZGlzcGxheUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGNhbkVtaXRWYWx1ZSh2YWx1ZTogU2VhcmNoRHJvcGRvd25EaXNwbGF5Q29udHJvbFZhbHVlKTogYm9vbGVhbiB7XG4gICAgLyoqXG4gICAgICogb25seSBlbWl0IGV2ZW50IGlmIHZhbHVlIGlzIGEgc3RyaW5nLCBhbmQgd2UgY2FuIGVtaXQgZW1wdHkgdmFsdWVzLCBvciBpdCBpcyBub3QgZW1wdHlcbiAgICAgKiBOT1RFOiBpdCBkaXNhbGxvd3MgdG8gZW1pdCBleHBsaWNpdGx5IHNlbGVjdGVkIFwiUkVBTFwiIHZhbHVlc1xuICAgICAqL1xuICAgIHJldHVybiAhdGhpcy5zdGF0aWNPcHRpb25zICYmIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiAodGhpcy5lbWl0RW1wdHlWYWx1ZXMgfHwgISF2YWx1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHNldENvbnRyb2xWYWx1ZUZyb21TdHJpbmcoZGlzcGxheWVkVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBpc1ZhbHVlQXBwbGllZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogbG9vcCB0aHJvdWdoIGRpc3BsYXllZE9wdGlvbnM7XG4gICAgICogaWYgbWF0Y2hpbmcgZGlzcGxheWVkT3B0aW9uIHZhbHVlIGZvdW5kIC0gdXNlIGRpc3BsYXllZE9wdGlvbnMgb3B0aW9uIGFzIGNvbnRyb2wgdmFsdWVcbiAgICAgKi9cbiAgICBmb3IgKGNvbnN0IFtvcHRpb24sIHZhbHVlXSBvZiB0aGlzLmRpc3BsYXllZE9wdGlvbnMpIHtcbiAgICAgIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBkaXNwbGF5ZWRWYWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlRnJvbU9wdGlvbihvcHRpb24pO1xuICAgICAgICBpc1ZhbHVlQXBwbGllZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNWYWx1ZUFwcGxpZWQpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHNldENvbnRyb2xWYWx1ZUZyb21PcHRpb24ob3B0aW9uOiBEcm9wZG93bkNvbXBvbmVudE9wdGlvbiB8IG51bGwsIHNraXBTYW1lID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMudW5zZWxlY3RDb21wb25lbnQoKTtcblxuICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKG9wdGlvbiwgc2tpcFNhbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb250cm9sVmFsdWUob3B0aW9uOiBEcm9wZG93bkNvbXBvbmVudE9wdGlvbiB8IG51bGwsIHNraXBTYW1lID0gdHJ1ZSkge1xuICAgIC8qKlxuICAgICAqIG9ubHkgdXBkYXRlIGNvbnRyb2wgdmFsdWUgaWYgaXQgZGlmZmVycyBmcm9tIHByb3ZpZGVkIG9uZVxuICAgICAqIE5PVEU6IHdlIG5lZWQgdGhpcyBjaGVjayB0byBhdm9pZCBlbWl0dGluZyBjb250cm9sIHZhbHVlIGNoYW5nZVxuICAgICAqIHdoZW4gdGhlIHNhbWUgZHJvcGRvd24gb3B0aW9uIGlzIHNlbGVjdGVkIGluIGRyb3Bkb3duIHNldmVyYWwgdGltZXNcbiAgICAgKi9cbiAgICBpZiAoc2tpcFNhbWUgJiYgdGhpcy52YWx1ZUNvbnRyb2wudmFsdWUgPT09IG9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnZhbHVlQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuXG4gICAgLyoqXG4gICAgICogdG9nZ2xlIGlzSW50ZXJuYWxWYWx1ZVNldCB0byBtYWtlXG4gICAgICogc3VyZSBpbnRlcm5hbCBzdWJzY3JpcHRpb24gdG8gY29udHJvbCB2YWx1ZSB3aWxsXG4gICAgICogaWdub3JlIHRoaXMgc2V0VmFsdWUgZXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLmlzSW50ZXJuYWxWYWx1ZVNldCA9IHRydWU7XG4gICAgdGhpcy52YWx1ZUNvbnRyb2wuc2V0VmFsdWUob3B0aW9uKTtcbiAgICB0aGlzLmlzSW50ZXJuYWxWYWx1ZVNldCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvdmVycmlkZUtleWRvd25IYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnRyaWdnZXIuX2hhbmRsZUtleWRvd247XG5cbiAgICAgIC8qKlxuICAgICAgICogdGhpcyBhbGxvd3MgdG8gYmxvY2sgZGVmYXVsdCBrZXlkb3duIGhhbmRsZXIgaWYgbmVlZGVkXG4gICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlci5faGFuZGxlS2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSA8Q3VzdG9tTWF0T3B0aW9uPnRoaXMudHJpZ2dlcj8uYWN0aXZlT3B0aW9uO1xuXG4gICAgICAgIHRoaXMubW9kaWZ5T3B0aW9uQ2xpY2tFdmVudChvcHRpb24pO1xuXG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLnRyaWdnZXIsIGV2ZW50KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogbWFrZSBzdXJlIG9wdGlvbiBkb2VzIG5vdCBsb3NlIFwic2VsZWN0ZWRcIiBzdGF0ZSBpZiBjbGljayBpcyBwcmV2ZW50ZWRcbiAgICAgICAgICogTk9URTogdGhpcyBpcyBkIG9uZSBmb3IgXCJuaWNldHlcIlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMucHJldmVudENsaWNrICYmIG9wdGlvbiAmJiBldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICB0aGlzLmF1dG8/Ll9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0ob3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vZGlmeU9wdGlvbkNsaWNrRXZlbnQob3B0aW9uOiBDdXN0b21NYXRPcHRpb24pOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBtb2RpZnkgXCJfc2VsZWN0VmlhSW50ZXJhY3Rpb25cIiBtZXRob2Qgb2YgdGhlIG9wdGlvblxuICAgICAqIHNvIHRoYXQgd2UgY2FuIGJsb2NrIGl0cyBzZWxlY3Rpb24gaWYgbmVlZGVkXG4gICAgICovXG4gICAgaWYgKG9wdGlvbiAmJiAhb3B0aW9uLm1vZGlmaWVkKSB7XG4gICAgICBvcHRpb24ubW9kaWZpZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gb3B0aW9uLl9zZWxlY3RWaWFJbnRlcmFjdGlvbjtcblxuICAgICAgb3B0aW9uLl9zZWxlY3RWaWFJbnRlcmFjdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudENsaWNrKSB7XG4gICAgICAgICAgdGhpcy5hdXRvPy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlci5jYWxsKG9wdGlvbik7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBbbmdTdHlsZV09XCJ7IG1pbldpZHRoOiB3aWR0aCB9XCIgY2xhc3M9XCJhZHMtZmllbGQtY29udGFpbmVyXCI+XG4gIDxkaXYgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnaW1tZWRpYXRlLXZhbGlkYXRpb24nOiBpbW1lZGlhdGVWYWxpZGF0aW9uLFxuICAgICAgICAnaXMtb3Blbic6IHRyaWdnZXI/LnBhbmVsT3BlbixcbiAgICAgICAgaW52YWxpZDogY2FuU2hvd0Vycm9yKCksXG4gICAgICAgICdzdWNjZXNzLWxhYmVsJzogY2FuU2hvd1N1Y2Nlc3MoKSxcbiAgICAgICAgJ3gtc21hbGwnOiBzbWFsbFNpemUsXG4gICAgICB9XCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZHRoIH1cIlxuICAgID5cbiAgICAgIEBpZiAoKGxhYmVsIHx8IHJlcXVpcmVkKSAmJiAhc21hbGxTaXplKSB7XG4gICAgICAgIDxtYXQtbGFiZWw+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICAgIH1cbiAgICAgIDxpbnB1dFxuICAgICAgICAjaW5wdXRcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc3BsYXlDb250cm9sLmRpc2FibGVkXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlEb3duKCRldmVudC50YXJnZXQpXCJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQudGFyZ2V0KVwiXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFthdXRvY29tcGxldGVdPVwiJ25vbmUnXCJcbiAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgW3ZhbHVlXT1cImdldERpc3BsYXllZFZhbHVlQXNTdHJpbmcoKVwiXG4gICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxuICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgLz5cbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiXG4gICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgJ2Fkcy1kcm9wZG93bi1wYW5lbCcgK1xuICAgICAgICAgIChmaXRDb250ZW50ID8gJyBmaXQtY29udGVudCcgOiAnJykgK1xuICAgICAgICAgIChsb2FkaW5nKCkgPyAnIGxvYWRpbmcnIDogJycpICtcbiAgICAgICAgICAocHJldmVudENsaWNrID8gJycgOiAnIGNsaWNrYWJsZScpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIHBhbmVsQ2xhc3NcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAob3B0aW9uIG9mIGRpc3BsYXllZE9wdGlvbnMgfCBrZXl2YWx1ZTogYXBwbHlTb3J0aW5nOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8bWF0LW9wdGlvbiAjb3B0IFt2YWx1ZV09XCJvcHRpb25cIiAobW91c2Vkb3duKT1cIm9uT3B0aW9uTW91c2VEb3duKCRldmVudCwgb3B0KVwiPlxuICAgICAgICAgICAgQGlmICh1c2VPcHRpb25UZW1wbGF0ZSkge1xuICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25SZWYoKVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb24ua2V5LCB2YWx1ZTogb3B0aW9uLnZhbHVlIH1cIlxuICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgPyBkaXNwbGF5VmFsdWVGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24hLnZhbHVlISB8IGFkc1NlYXJjaERyb3Bkb3duSGlnaGxpZ2h0ZXI6IGRpc3BsYXlDb250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmtleVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiAob3B0aW9uIS52YWx1ZSEgfCBhZHNTZWFyY2hEcm9wZG93bkhpZ2hsaWdodGVyOiBkaXNwbGF5Q29udHJvbC52YWx1ZSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2FuVXNlTW9yZURhdGFPcHRpb24pIHtcbiAgICAgICAgICA8aHIgY2xhc3M9XCJuby1yZXN1bHRzLWhyXCIgLz5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAjbW9yZURhdGFNYXRPcHRpb24gY2xhc3M9XCJleHRyYVwiIFtkaXNhYmxlZF09XCIhbW9yZURhdGFPcHRpb24hLm9uQ2xpY2tcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZXh0cmFPcHRpb25WYWx1ZVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogbW9yZURhdGFPcHRpb24gfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2FuVXNlTm9EYXRhT3B0aW9uKSB7XG4gICAgICAgICAgPG1hdC1vcHRpb24gI25vRGF0YU1hdE9wdGlvbiBjbGFzcz1cImV4dHJhXCIgW2Rpc2FibGVkXT1cIiFub0RhdGFPcHRpb24hLm9uQ2xpY2tcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZXh0cmFPcHRpb25WYWx1ZVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogbm9EYXRhT3B0aW9uIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNhblVzZVN0YXRpY09wdGlvbikge1xuICAgICAgICAgIEBpZiAoZGlzcGxheWVkT3B0aW9ucy5zaXplKSB7XG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJuby1yZXN1bHRzLWhyXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG1hdC1vcHRpb24gI3N0YXRpY0RhdGFNYXRPcHRpb24gY2xhc3M9XCJleHRyYVwiIFtkaXNhYmxlZF09XCIhc3RhdGljRGF0YU9wdGlvbiEub25DbGlja1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJleHRyYU9wdGlvblZhbHVlXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBzdGF0aWNEYXRhT3B0aW9uIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cblxuICAgICAgQGlmIChjYW5DbGVhcikge1xuICAgICAgICA8YnV0dG9uIG1hdFRleHRTdWZmaXggdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiIGNsYXNzPVwiYWN0aW9uLWljb25cIj5cbiAgICAgICAgICA8YWRzLWljb24gbmFtZT1cImNyb3NzXCIgW3NpemVdPVwic21hbGxTaXplID8gJ3h4cycgOiAneHMnXCIgW3RoZW1lXT1cIidpY29uUHJpbWFyeSdcIiBjbGFzcz1cImNyb3NzLWljb25cIiAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2hvd0Ryb3Bkb3duSWNvbikge1xuICAgICAgICA8YnV0dG9uIG1hdFRleHRTdWZmaXggdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJGV2ZW50KVwiIGNsYXNzPVwiYWN0aW9uLWljb25cIj5cbiAgICAgICAgICA8YWRzLWljb25cbiAgICAgICAgICAgIG5hbWU9XCJjaGV2cm9uX2Rvd25cIlxuICAgICAgICAgICAgW3NpemVdPVwic21hbGxTaXplID8gJ3h4cycgOiAneHMnXCJcbiAgICAgICAgICAgIFt0aGVtZV09XCInaWNvblByaW1hcnknXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2hldnJvbi1kb3duXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoIXN0YXRpY09wdGlvbnMgJiYgbG9hZGluZygpKSB7XG4gICAgICAgIDxtYXQtc3Bpbm5lciBtYXRUZXh0U3VmZml4IGRpYW1ldGVyPVwiMjJcIiAvPlxuICAgICAgfVxuICAgICAgQGlmICghc3RhdGljT3B0aW9ucyAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXRUZXh0U3VmZml4XG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5TZWFyY2hcIlxuICAgICAgICAgIChjbGljayk9XCJjYW5TZWFyY2ggPyBvblNlYXJjaEljb25DbGljaygkZXZlbnQpIDogbnVsbFwiXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24taWNvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8YWRzLWljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9XCJ4c1wiIFt0aGVtZV09XCInaWNvblByaW1hcnknXCIgY2xhc3M9XCJzZWFyY2gtaWNvblwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPGRpdiBjbGFzcz1cImZvb3Rlci1jb250YWluZXJcIj5cbiAgICAgIEBpZiAoY2FuU2hvd0Vycm9yKCkpIHtcbiAgICAgICAgPGFkcy1lcnJvciBbZXJyb3JdPVwiZGlzcGxheUZpcnN0RXJyb3IoKVwiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZHRoIH1cIiAvPlxuICAgICAgfSBAZWxzZSBpZiAoY2FuU2hvd1N1Y2Nlc3MoKSkge1xuICAgICAgICA8YWRzLXN1Y2Nlc3MgW3N1Y2Nlc3NdPVwic3VjY2Vzc01lc3NhZ2UhXCIgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChoaW50KSB7XG4gICAgICAgIDxhZHMtaGludCBbaGludF09XCJoaW50XCIgW2NvbnRyb2xdPVwidmFsdWVDb250cm9sXCIgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBAaWYgKHRvb2x0aXApIHtcbiAgICA8YWRzLWlucHV0LXRvb2x0aXAgW3Rvb2x0aXBdPVwidG9vbHRpcFwiIFtzbWFsbFNpemVdPVwic21hbGxTaXplXCIgLz5cbiAgfVxuXG4gIDxuZy10ZW1wbGF0ZSAjZXh0cmFPcHRpb25WYWx1ZSBsZXQtb3B0aW9uPlxuICAgIDxzcGFuXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25TdGF0aWNPcHRpb25Nb3VzZURvd24oJGV2ZW50LCBvcHRpb24hKVwiXG4gICAgICBbaW5uZXJIVE1MXT1cIm9wdGlvbiEubGFiZWxcIlxuICAgID48L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==