@festo-ui/angular 4.0.3-pre-20221213.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +13 -53
  2. package/css/bundle.css +1 -1
  3. package/css/image-gallery.css +1 -1
  4. package/css/popover.css +1 -1
  5. package/esm2020/festo-ui-angular.mjs +2 -2
  6. package/esm2020/lib/components/accordion/accordion-header/accordion-header.component.mjs +5 -5
  7. package/esm2020/lib/components/accordion/accordion-item/accordion-item-body/accordion-item-body.component.mjs +5 -5
  8. package/esm2020/lib/components/accordion/accordion-item/accordion-item-header/accordion-item-header.component.mjs +5 -5
  9. package/esm2020/lib/components/accordion/accordion-item/accordion-item.component.mjs +30 -25
  10. package/esm2020/lib/components/accordion/accordion.component.mjs +9 -9
  11. package/esm2020/lib/components/accordion/index.mjs +1 -1
  12. package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +8 -5
  13. package/esm2020/lib/components/buttons/button/button.component.mjs +7 -6
  14. package/esm2020/lib/components/buttons/link-button/link-button.component.mjs +7 -6
  15. package/esm2020/lib/components/chips/chip/chip.component.mjs +6 -5
  16. package/esm2020/lib/components/chips/chip-container/chip-container.component.mjs +6 -5
  17. package/esm2020/lib/components/components.module.mjs +148 -151
  18. package/esm2020/lib/components/loading-indicator/loading-indicator.component.mjs +6 -5
  19. package/esm2020/lib/components/mobile-flyout/mobile-flyout-item/mobile-flyout-item.component.mjs +7 -6
  20. package/esm2020/lib/components/mobile-flyout/mobile-flyout-page/mobile-flyout-page.component.mjs +7 -6
  21. package/esm2020/lib/components/mobile-flyout/mobile-flyout.component.mjs +7 -7
  22. package/esm2020/lib/components/pagination/pagination.component.mjs +7 -5
  23. package/esm2020/lib/components/popovers/legend/legend.component.mjs +12 -12
  24. package/esm2020/lib/components/popovers/legend/legend.directive.mjs +7 -7
  25. package/esm2020/lib/components/popovers/popover/popover.component.mjs +6 -6
  26. package/esm2020/lib/components/popovers/popover-content/popover-content.component.mjs +14 -16
  27. package/esm2020/lib/components/popovers/popover-content/popover-content.directive.mjs +6 -6
  28. package/esm2020/lib/components/popovers/popover-menu/popover-menu.component.mjs +16 -17
  29. package/esm2020/lib/components/popovers/popover-ref.mjs +2 -2
  30. package/esm2020/lib/components/popovers/popover.defaults.mjs +17 -18
  31. package/esm2020/lib/components/popovers/popover.models.mjs +1 -17
  32. package/esm2020/lib/components/popovers/popover.service.mjs +28 -29
  33. package/esm2020/lib/components/popovers/tooltip/tooltip.directive.mjs +14 -15
  34. package/esm2020/lib/components/progress/progress.component.mjs +7 -5
  35. package/esm2020/lib/components/scroll/index.mjs +1 -1
  36. package/esm2020/lib/components/scroll/scrollable.directive.mjs +9 -6
  37. package/esm2020/lib/components/search-input/search-input.component.mjs +18 -8
  38. package/esm2020/lib/components/snackbar/snackbar-container.component.mjs +6 -6
  39. package/esm2020/lib/components/snackbar/snackbar-container.directive.mjs +10 -13
  40. package/esm2020/lib/components/snackbar/snackbar.component.mjs +8 -6
  41. package/esm2020/lib/components/snackbar/snackbar.models.mjs +1 -1
  42. package/esm2020/lib/components/snackbar/snackbar.module.mjs +7 -8
  43. package/esm2020/lib/components/snackbar/snackbar.service.mjs +4 -4
  44. package/esm2020/lib/components/stepper-horizontal/step-horizontal/step-horizontal.component.mjs +5 -5
  45. package/esm2020/lib/components/stepper-horizontal/stepper-horizontal.component.mjs +7 -6
  46. package/esm2020/lib/components/stepper-vertical/step-vertical/step-vertical.component.mjs +7 -6
  47. package/esm2020/lib/components/stepper-vertical/stepper-vertical.component.mjs +6 -6
  48. package/esm2020/lib/components/table-header-cell/table-header-cell.directive.mjs +8 -7
  49. package/esm2020/lib/components/tabs/tab-pane/tab-pane.component.mjs +5 -5
  50. package/esm2020/lib/components/tabs/tabs.component.mjs +108 -22
  51. package/esm2020/lib/directives/click-outside.directive.mjs +29 -0
  52. package/esm2020/lib/festo-angular.module.mjs +9 -72
  53. package/esm2020/lib/forms/checkbox/checkbox.component.mjs +26 -21
  54. package/esm2020/lib/forms/color-indicator/color-indicator.component.mjs +28 -8
  55. package/esm2020/lib/forms/color-picker/color-helper.mjs +16 -8
  56. package/esm2020/lib/forms/color-picker/color-picker.component.mjs +35 -16
  57. package/esm2020/lib/forms/date-picker/date-picker.component.mjs +25 -22
  58. package/esm2020/lib/forms/date-range-picker/date-range-picker.component.mjs +29 -25
  59. package/esm2020/lib/forms/flatpickr/flatpickr.component.mjs +55 -0
  60. package/esm2020/lib/forms/forms.module.mjs +106 -79
  61. package/esm2020/lib/forms/radio/radio.component.mjs +43 -39
  62. package/esm2020/lib/forms/segment/segment-control/segment-control.component.mjs +15 -12
  63. package/esm2020/lib/forms/segment/segment.component.mjs +28 -23
  64. package/esm2020/lib/forms/select/chip-text.pipe.mjs +15 -10
  65. package/esm2020/lib/forms/select/select-option/select-option.component.mjs +7 -6
  66. package/esm2020/lib/forms/select/select.component.mjs +49 -41
  67. package/esm2020/lib/forms/slider/slider.component.mjs +24 -21
  68. package/esm2020/lib/forms/switch/switch.component.mjs +18 -17
  69. package/esm2020/lib/forms/text-area/text-area.component.mjs +16 -9
  70. package/esm2020/lib/forms/text-editor/text-editor.component.mjs +69 -61
  71. package/esm2020/lib/forms/text-input/text-input.component.mjs +38 -11
  72. package/esm2020/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.mjs +8 -6
  73. package/esm2020/lib/forms/time-picker/time-picker.component.mjs +18 -15
  74. package/esm2020/lib/forms/unique-selection-dispatcher.mjs +7 -5
  75. package/esm2020/lib/forms/value-accessor-base.mjs +5 -5
  76. package/esm2020/lib/modals/alert/alert.component.mjs +54 -0
  77. package/esm2020/lib/modals/confirm/confirm.component.mjs +55 -0
  78. package/esm2020/lib/modals/custom-modal/custom-modal.component.mjs +70 -0
  79. package/esm2020/lib/modals/image-gallery/image-gallery.component.mjs +62 -0
  80. package/esm2020/lib/modals/index.mjs +2 -0
  81. package/esm2020/lib/{components/modals → modals}/modal.service.mjs +8 -11
  82. package/esm2020/lib/modals/modals.module.mjs +28 -0
  83. package/esm2020/lib/modals/prompt/prompt.component.mjs +106 -0
  84. package/esm2020/lib/pipes/safe-html.pipe.mjs +5 -5
  85. package/esm2020/public-api.mjs +66 -0
  86. package/fesm2015/festo-ui-angular.mjs +4659 -4507
  87. package/fesm2015/festo-ui-angular.mjs.map +1 -1
  88. package/fesm2020/festo-ui-angular.mjs +4590 -4478
  89. package/fesm2020/festo-ui-angular.mjs.map +1 -1
  90. package/index.d.ts +5 -13
  91. package/lib/components/accordion/accordion-header/accordion-header.component.d.ts +1 -1
  92. package/lib/components/accordion/accordion-item/accordion-item-body/accordion-item-body.component.d.ts +1 -1
  93. package/lib/components/accordion/accordion-item/accordion-item-header/accordion-item-header.component.d.ts +1 -1
  94. package/lib/components/accordion/accordion-item/accordion-item.component.d.ts +6 -5
  95. package/lib/components/accordion/accordion.component.d.ts +2 -2
  96. package/lib/components/breadcrumb/breadcrumb.component.d.ts +1 -1
  97. package/lib/components/buttons/button/button.component.d.ts +4 -4
  98. package/lib/components/buttons/link-button/link-button.component.d.ts +4 -4
  99. package/lib/components/chips/chip/chip.component.d.ts +2 -2
  100. package/lib/components/chips/chip-container/chip-container.component.d.ts +1 -1
  101. package/lib/components/components.module.d.ts +35 -68
  102. package/lib/components/loading-indicator/loading-indicator.component.d.ts +1 -1
  103. package/lib/components/mobile-flyout/mobile-flyout-item/mobile-flyout-item.component.d.ts +1 -1
  104. package/lib/components/mobile-flyout/mobile-flyout-page/mobile-flyout-page.component.d.ts +1 -1
  105. package/lib/components/mobile-flyout/mobile-flyout.component.d.ts +1 -1
  106. package/lib/components/pagination/pagination.component.d.ts +1 -1
  107. package/lib/components/popovers/legend/legend.component.d.ts +2 -2
  108. package/lib/components/popovers/legend/legend.directive.d.ts +2 -2
  109. package/lib/components/popovers/popover/popover.component.d.ts +4 -4
  110. package/lib/components/popovers/popover-content/popover-content.component.d.ts +2 -2
  111. package/lib/components/popovers/popover-content/popover-content.directive.d.ts +2 -2
  112. package/lib/components/popovers/popover-menu/popover-menu.component.d.ts +6 -6
  113. package/lib/components/popovers/popover-ref.d.ts +2 -2
  114. package/lib/components/popovers/popover.defaults.d.ts +4 -4
  115. package/lib/components/popovers/popover.models.d.ts +8 -20
  116. package/lib/components/popovers/tooltip/tooltip.directive.d.ts +1 -1
  117. package/lib/components/progress/progress.component.d.ts +1 -1
  118. package/lib/components/scroll/scrollable.directive.d.ts +1 -1
  119. package/lib/components/search-input/search-input.component.d.ts +1 -1
  120. package/lib/components/snackbar/snackbar-container.component.d.ts +1 -1
  121. package/lib/components/snackbar/snackbar-container.directive.d.ts +4 -7
  122. package/lib/components/snackbar/snackbar.component.d.ts +1 -1
  123. package/lib/components/snackbar/snackbar.module.d.ts +5 -5
  124. package/lib/components/snackbar/snackbar.service.d.ts +1 -1
  125. package/lib/components/stepper-horizontal/step-horizontal/step-horizontal.component.d.ts +1 -1
  126. package/lib/components/stepper-horizontal/stepper-horizontal.component.d.ts +1 -1
  127. package/lib/components/stepper-vertical/step-vertical/step-vertical.component.d.ts +2 -2
  128. package/lib/components/stepper-vertical/stepper-vertical.component.d.ts +1 -1
  129. package/lib/components/table-header-cell/table-header-cell.directive.d.ts +8 -8
  130. package/lib/components/tabs/tab-pane/tab-pane.component.d.ts +7 -7
  131. package/lib/components/tabs/tabs.component.d.ts +11 -11
  132. package/lib/{components → directives}/click-outside.directive.d.ts +1 -1
  133. package/lib/festo-angular.module.d.ts +6 -11
  134. package/lib/forms/checkbox/checkbox.component.d.ts +1 -1
  135. package/lib/forms/color-indicator/color-indicator.component.d.ts +1 -1
  136. package/lib/forms/color-picker/color-helper.d.ts +4 -4
  137. package/lib/forms/color-picker/color-picker.component.d.ts +6 -6
  138. package/lib/forms/date-picker/date-picker.component.d.ts +11 -11
  139. package/lib/forms/date-range-picker/date-range-picker.component.d.ts +12 -12
  140. package/lib/{wrappers → forms}/flatpickr/flatpickr.component.d.ts +5 -5
  141. package/lib/forms/forms.module.d.ts +24 -39
  142. package/lib/forms/radio/radio.component.d.ts +12 -12
  143. package/lib/forms/segment/segment-control/segment-control.component.d.ts +11 -13
  144. package/lib/forms/segment/segment.component.d.ts +3 -3
  145. package/lib/forms/select/chip-text.pipe.d.ts +1 -1
  146. package/lib/forms/select/select-option/select-option.component.d.ts +3 -3
  147. package/lib/forms/select/select.component.d.ts +11 -11
  148. package/lib/forms/slider/slider.component.d.ts +6 -6
  149. package/lib/forms/switch/switch.component.d.ts +5 -5
  150. package/lib/forms/text-area/text-area.component.d.ts +12 -12
  151. package/lib/forms/text-editor/text-editor.component.d.ts +16 -16
  152. package/lib/forms/text-input/text-input.component.d.ts +4 -4
  153. package/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.d.ts +6 -6
  154. package/lib/forms/time-picker/time-picker.component.d.ts +8 -8
  155. package/lib/forms/unique-selection-dispatcher.d.ts +2 -2
  156. package/lib/forms/value-accessor-base.d.ts +4 -4
  157. package/lib/{components/modals → modals}/alert/alert.component.d.ts +2 -2
  158. package/lib/{components/modals → modals}/confirm/confirm.component.d.ts +2 -2
  159. package/lib/{components/modals → modals}/custom-modal/custom-modal.component.d.ts +1 -1
  160. package/lib/{components → modals}/image-gallery/image-gallery.component.d.ts +2 -2
  161. package/lib/{components/modals → modals}/index.d.ts +1 -1
  162. package/lib/{components/modals → modals}/modal.service.d.ts +1 -1
  163. package/lib/modals/modals.module.d.ts +18 -0
  164. package/lib/{components/modals → modals}/prompt/prompt.component.d.ts +2 -2
  165. package/lib/pipes/safe-html.pipe.d.ts +1 -1
  166. package/package.json +13 -16
  167. package/public-api.d.ts +62 -0
  168. package/scss/base/image-gallery.scss +3 -0
  169. package/scss/base/popover.scss +9 -0
  170. package/scss/base/styles.scss +5 -0
  171. package/esm2020/index.mjs +0 -26
  172. package/esm2020/lib/components/click-outside.directive.mjs +0 -28
  173. package/esm2020/lib/components/image-gallery/image-gallery.component.mjs +0 -60
  174. package/esm2020/lib/components/image-gallery/image-gallery.module.mjs +0 -22
  175. package/esm2020/lib/components/modals/alert/alert.component.mjs +0 -52
  176. package/esm2020/lib/components/modals/confirm/confirm.component.mjs +0 -53
  177. package/esm2020/lib/components/modals/custom-modal/custom-modal.component.mjs +0 -70
  178. package/esm2020/lib/components/modals/index.mjs +0 -2
  179. package/esm2020/lib/components/modals/modals.module.mjs +0 -31
  180. package/esm2020/lib/components/modals/prompt/prompt.component.mjs +0 -102
  181. package/esm2020/lib/content/content.module.mjs +0 -20
  182. package/esm2020/lib/content/icon/icon.component.mjs +0 -17
  183. package/esm2020/lib/forms/container-host.mjs +0 -27
  184. package/esm2020/lib/forms/date-picker.module.mjs +0 -28
  185. package/esm2020/lib/forms/text-editor/text-editor.module.mjs +0 -25
  186. package/esm2020/lib/layout/layout.module.mjs +0 -18
  187. package/esm2020/lib/pipes/pipes.module.mjs +0 -20
  188. package/esm2020/lib/wrappers/flatpickr/flatpickr.component.mjs +0 -59
  189. package/lib/components/image-gallery/image-gallery.module.d.ts +0 -11
  190. package/lib/components/modals/modals.module.d.ts +0 -20
  191. package/lib/content/content.module.d.ts +0 -9
  192. package/lib/content/icon/icon.component.d.ts +0 -45
  193. package/lib/forms/container-host.d.ts +0 -11
  194. package/lib/forms/date-picker.module.d.ts +0 -17
  195. package/lib/forms/text-editor/text-editor.module.d.ts +0 -14
  196. package/lib/layout/layout.module.d.ts +0 -7
  197. package/lib/pipes/pipes.module.d.ts +0 -9
  198. package/scss/base/components/accordion/accordion-header/accordion-header.component.scss +0 -12
  199. package/scss/base/components/accordion/accordion-item/accordion-item-body/accordion-item-body.component.scss +0 -109
  200. package/scss/base/components/accordion/accordion-item/accordion-item-header/accordion-item-header.component.scss +0 -9
  201. package/scss/base/components/accordion/accordion-item/accordion-item.component.scss +0 -71
  202. package/scss/base/components/accordion/accordion.component.scss +0 -6
  203. package/scss/base/components/breadcrumb/breadcrumb.component.scss +0 -0
  204. package/scss/base/components/buttons/button/button.component.scss +0 -7
  205. package/scss/base/components/buttons/link-button/link-button.component.scss +0 -0
  206. package/scss/base/components/chips/chip/chip.component.scss +0 -0
  207. package/scss/base/components/chips/chip-container/chip-container.component.scss +0 -0
  208. package/scss/base/components/image-gallery/image-gallery.component.scss +0 -0
  209. package/scss/base/components/image-gallery/styles.scss +0 -5
  210. package/scss/base/components/loading-indicator/loading-indicator.component.scss +0 -0
  211. package/scss/base/components/modals/alert/alert.component.scss +0 -0
  212. package/scss/base/components/modals/confirm/confirm.component.scss +0 -0
  213. package/scss/base/components/modals/prompt/prompt.component.scss +0 -0
  214. package/scss/base/components/pagination/pagination.component.scss +0 -0
  215. package/scss/base/components/popovers/legend/legend.component.scss +0 -9
  216. package/scss/base/components/popovers/popover/popover.component.scss +0 -0
  217. package/scss/base/components/popovers/popover/styles.scss +0 -84
  218. package/scss/base/components/popovers/popover-content/popover-content.component.scss +0 -12
  219. package/scss/base/components/popovers/popover-menu/popover-menu.component.scss +0 -0
  220. package/scss/base/components/scroll/scroll-story-helper.scss +0 -12
  221. package/scss/base/components/search-input/search-input.component.scss +0 -7
  222. package/scss/base/components/snackbar/snackbar-container.component.scss +0 -3
  223. package/scss/base/components/snackbar/snackbar.component.scss +0 -3
  224. package/scss/base/components/stepper-horizontal/step-horizontal/step-horizontal.component.scss +0 -23
  225. package/scss/base/components/stepper-vertical/step-vertical/step-vertical.component.scss +0 -6
  226. package/scss/base/components/tabs/tab-pane/tab-pane.component.scss +0 -7
  227. package/scss/base/components/tabs/tabs.component.scss +0 -326
  228. package/scss/base/content/icon/icon.component.scss +0 -0
  229. package/scss/base/forms/checkbox/checkbox.component.scss +0 -160
  230. package/scss/base/forms/color-indicator/color-indicator.component.scss +0 -59
  231. package/scss/base/forms/color-picker/color-picker.component.scss +0 -207
  232. package/scss/base/forms/date-picker/date-picker.component.scss +0 -5
  233. package/scss/base/forms/date-range-picker/date-range-picker.component.scss +0 -34
  234. package/scss/base/forms/radio/radio.component.scss +0 -9
  235. package/scss/base/forms/segment/segment-control/segment-control.component.scss +0 -0
  236. package/scss/base/forms/segment/segment.component.scss +0 -0
  237. package/scss/base/forms/select/select-option/select-option.component.scss +0 -0
  238. package/scss/base/forms/select/select.component.scss +0 -251
  239. package/scss/base/forms/slider/slider.component.scss +0 -20
  240. package/scss/base/forms/switch/switch.component.scss +0 -145
  241. package/scss/base/forms/text-area/text-area.component.scss +0 -43
  242. package/scss/base/forms/text-editor/text-editor.component.scss +0 -294
  243. package/scss/base/forms/text-input/text-input.component.scss +0 -60
  244. package/scss/base/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.scss +0 -10
  245. package/scss/base/forms/time-picker/time-picker.component.scss +0 -5
@@ -1,5 +1,5 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Inject, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core';
1
+ import { CommonModule, DOCUMENT } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
3
3
  import { noop, Subject } from 'rxjs';
4
4
  import { takeUntil } from 'rxjs/operators';
5
5
  import { TabPaneComponent } from './tab-pane/tab-pane.component';
@@ -19,39 +19,55 @@ export class TabsComponent {
19
19
  this.componentId = `tabs-${++TabsComponent.nextId}`;
20
20
  this.tabs = [];
21
21
  this.useCompactDensity = true;
22
- this.activeTab = null;
22
+ this.activeTab = undefined;
23
23
  this.complete = new Subject();
24
24
  this.injectedWindow = this.document.defaultView;
25
25
  }
26
26
  ngAfterContentInit() {
27
27
  this.initTabs();
28
- if (null === this.activeTab) {
29
- this.panes.map((pane, i) => {
28
+ if (null == this.activeTab) {
29
+ this.panes?.map((pane, i) => {
30
30
  if (0 === i) {
31
31
  pane.isVisible = true;
32
32
  }
33
33
  });
34
34
  }
35
35
  else {
36
- this.panes.find(pane => null != this.activeTab.paneId && pane.tabPaneId === this.activeTab.paneId).isVisible = true;
36
+ const pane = this.panes?.find(pane => {
37
+ if (this.activeTab) {
38
+ return this.activeTab.paneId != null && pane.tabPaneId === this.activeTab.paneId;
39
+ }
40
+ else {
41
+ return false;
42
+ }
43
+ });
44
+ if (pane) {
45
+ pane.isVisible = true;
46
+ }
37
47
  }
38
48
  }
39
49
  ngAfterViewInit() {
40
50
  this.elemScroller = this.scroller?.nativeElement;
41
51
  this.elemScrollArea = this.scrollAera?.nativeElement;
42
52
  this.elemScrollContent = this.scrollContent?.nativeElement;
43
- const initialWidth = this.elemScrollArea?.offsetWidth;
44
- if (initialWidth > 768) {
53
+ if (this.elemScroller == null || this.elemScrollArea == null || this.elemScrollContent == null) {
54
+ return;
55
+ }
56
+ const initialWidth = this.elemScrollArea.offsetWidth;
57
+ if (initialWidth != null && initialWidth > 768) {
45
58
  this.useCompactDensity = false;
46
59
  this.cd.detectChanges();
47
60
  }
48
61
  this.resizeObserver = new ResizeObserver(() => {
62
+ if (this.elemScrollArea == null) {
63
+ return;
64
+ }
49
65
  const width = this.elemScrollArea.offsetWidth;
50
- if (width > 768 && this.useCompactDensity === true) {
66
+ if (width != null && width > 768 && this.useCompactDensity === true) {
51
67
  this.useCompactDensity = false;
52
68
  this.cd.detectChanges();
53
69
  }
54
- else if (width <= 768 && this.useCompactDensity === false) {
70
+ else if (width != null && width <= 768 && this.useCompactDensity === false) {
55
71
  this.useCompactDensity = true;
56
72
  this.cd.detectChanges();
57
73
  }
@@ -66,10 +82,13 @@ export class TabsComponent {
66
82
  this.complete.unsubscribe();
67
83
  }
68
84
  showTabPane(id) {
69
- const pane = this.panes.find(p => p.tabPaneId === id);
85
+ if (id == null) {
86
+ return;
87
+ }
88
+ const pane = this.panes?.find(p => p.tabPaneId === id);
70
89
  const handleTabChange = (id) => {
71
90
  if (pane != null && pane.disabled !== true) {
72
- this.panes.map(p => {
91
+ this.panes?.map(p => {
73
92
  p.isVisible = false;
74
93
  });
75
94
  pane.isVisible = true;
@@ -82,14 +101,14 @@ export class TabsComponent {
82
101
  }
83
102
  });
84
103
  this.fngTabChange.emit({
85
- previous: this.activeTab?.paneId,
104
+ previous: this.activeTab?.paneId || '',
86
105
  current: id
87
106
  });
88
107
  this.activeTab = this.tabs.find(tab => !!tab.active);
89
108
  this.cd.detectChanges();
90
109
  }
91
110
  };
92
- if (this.fngBeforeTabChange?.observers?.length > 0 && pane.disabled !== true) {
111
+ if (this.fngBeforeTabChange?.observers?.length > 0 && pane?.disabled !== true) {
93
112
  this.fngBeforeTabChange.emit({
94
113
  ok: () => {
95
114
  handleTabChange(id);
@@ -104,6 +123,9 @@ export class TabsComponent {
104
123
  }
105
124
  }
106
125
  handleTabScroll(event, index) {
126
+ if (this.elemScrollContent == null || this.elemScrollArea == null) {
127
+ return;
128
+ }
107
129
  const scrollContentWidth = this.elemScrollContent.offsetWidth;
108
130
  const scrollAreaWidth = this.elemScrollArea.offsetWidth;
109
131
  // check if no scroll is needed
@@ -129,7 +151,7 @@ export class TabsComponent {
129
151
  }
130
152
  initTabs() {
131
153
  this.tabs = [];
132
- this.panes.map((pane, i) => {
154
+ this.panes?.map((pane, i) => {
133
155
  pane.tabId = this.componentId + '-tab-' + i;
134
156
  const tab = {
135
157
  name: null != pane.name ? pane.name : '',
@@ -155,7 +177,7 @@ export class TabsComponent {
155
177
  }
156
178
  handleTabPaneChanges() {
157
179
  // first subscribe to any changes in tab pane, so that the tabs in this view wiil be updated
158
- this.panes.forEach(pane => {
180
+ this.panes?.forEach(pane => {
159
181
  pane.changes$.pipe(takeUntil(this.complete)).subscribe(() => {
160
182
  // on changes in a tab pane, we init the tabs again
161
183
  this.initTabs();
@@ -163,8 +185,14 @@ export class TabsComponent {
163
185
  });
164
186
  }
165
187
  scrollTo(scrollX) {
188
+ if (scrollX == null) {
189
+ return;
190
+ }
166
191
  const currentScrollX = this.getScrollPosition();
167
192
  const safeScrollX = this.clampScrollValue(scrollX);
193
+ if (safeScrollX == null || currentScrollX == null) {
194
+ return;
195
+ }
168
196
  const scrollDelta = safeScrollX - currentScrollX;
169
197
  this.animate({
170
198
  finalScrollPosition: safeScrollX,
@@ -172,14 +200,26 @@ export class TabsComponent {
172
200
  });
173
201
  }
174
202
  scrollIntoView(index, tab) {
203
+ if (this.elemScrollArea == null) {
204
+ return;
205
+ }
175
206
  const scrollPosition = this.getScrollPosition();
176
207
  const barWidth = this.elemScrollArea.offsetWidth;
208
+ if (barWidth == null || scrollPosition == null) {
209
+ return;
210
+ }
177
211
  const tabDimensions = this.computeDimensions(tab);
212
+ if (tabDimensions == null) {
213
+ return;
214
+ }
178
215
  const nextIndex = this.findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth);
179
216
  if (!this.indexIsInRange(nextIndex)) {
180
217
  return;
181
218
  }
182
219
  const scrollIncrement = this.calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth);
220
+ if (scrollIncrement == null) {
221
+ return;
222
+ }
183
223
  this.incrementScroll(scrollIncrement);
184
224
  }
185
225
  incrementScroll(scrollXIncrement) {
@@ -188,6 +228,9 @@ export class TabsComponent {
188
228
  return;
189
229
  }
190
230
  const scrollOperation = this.getIncrementScrollOperation(scrollXIncrement);
231
+ if (scrollOperation == null) {
232
+ return;
233
+ }
191
234
  this.animate(scrollOperation);
192
235
  }
193
236
  animate(animation) {
@@ -195,6 +238,10 @@ export class TabsComponent {
195
238
  if (animation.scrollDelta === 0) {
196
239
  return;
197
240
  }
241
+ // no animation possible
242
+ if (this.elemScrollArea == null) {
243
+ return;
244
+ }
198
245
  this.stopScrollAnimation();
199
246
  // this animation uses the flip approach
200
247
  // https://aerotwist.com/blog/flip-your-animations/
@@ -209,20 +256,35 @@ export class TabsComponent {
209
256
  });
210
257
  }
211
258
  stopScrollAnimation() {
259
+ if (this.elemScrollArea == null) {
260
+ return;
261
+ }
212
262
  const currentScrollPosition = this.getAnimatingScrollPosition();
263
+ if (currentScrollPosition == null) {
264
+ return;
265
+ }
213
266
  this.renderer.removeClass(this.elemScroller, 'fng-tab-scroller--animating');
214
267
  this.setScrollContentStyleProperty('transform', 'translateX(0px)');
215
268
  this.elemScrollArea.scrollLeft = currentScrollPosition;
216
269
  }
217
270
  getAnimatingScrollPosition() {
271
+ if (this.elemScrollArea == null) {
272
+ return null;
273
+ }
218
274
  const currentTranslateX = this.calculateCurrentTranslateX();
219
275
  const scrollLeft = this.elemScrollArea.scrollLeft;
220
276
  return scrollLeft - currentTranslateX;
221
277
  }
222
278
  getIncrementScrollOperation(scrollX) {
223
279
  const currentScrollX = this.getScrollPosition();
280
+ if (currentScrollX == null) {
281
+ return null;
282
+ }
224
283
  const targetScrollX = scrollX + currentScrollX;
225
284
  const safeScrollX = this.clampScrollValue(targetScrollX);
285
+ if (safeScrollX == null) {
286
+ return null;
287
+ }
226
288
  const scrollDelta = safeScrollX - currentScrollX;
227
289
  return {
228
290
  finalScrollPosition: safeScrollX,
@@ -231,9 +293,15 @@ export class TabsComponent {
231
293
  }
232
294
  clampScrollValue(scrollX) {
233
295
  const edges = this.calculateScrollEdges();
296
+ if (edges == null) {
297
+ return null;
298
+ }
234
299
  return Math.min(Math.max(edges.left, scrollX), edges.right);
235
300
  }
236
301
  calculateScrollEdges() {
302
+ if (this.elemScrollArea == null || this.elemScrollContent == null) {
303
+ return null;
304
+ }
237
305
  const scrollContentWidth = this.elemScrollContent.offsetWidth;
238
306
  const scrollAreaWidth = this.elemScrollArea.offsetWidth;
239
307
  return {
@@ -245,6 +313,9 @@ export class TabsComponent {
245
313
  const rootWidth = tab.offsetWidth;
246
314
  const rootLeft = tab.offsetLeft;
247
315
  const tabContent = tab.querySelector('.fng-tab-content');
316
+ if (tabContent == null) {
317
+ return null;
318
+ }
248
319
  const contentWidth = tabContent.offsetWidth;
249
320
  const contentLeft = tabContent.offsetLeft;
250
321
  return {
@@ -256,7 +327,13 @@ export class TabsComponent {
256
327
  }
257
328
  calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth) {
258
329
  const nextTab = this.elRef.nativeElement.querySelector(`#${this.componentId}-tab-${nextIndex}`);
330
+ if (nextTab == null) {
331
+ return null;
332
+ }
259
333
  const nextTabDimensions = this.computeDimensions(nextTab);
334
+ if (nextTabDimensions == null) {
335
+ return null;
336
+ }
260
337
  const relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;
261
338
  const relativeContentRight = nextTabDimensions.contentRight - scrollPosition;
262
339
  const leftIncrement = relativeContentRight - 48;
@@ -270,12 +347,18 @@ export class TabsComponent {
270
347
  return index >= 0 && index < this.tabs.length;
271
348
  }
272
349
  getScrollPosition() {
350
+ if (this.elemScrollArea == null) {
351
+ return null;
352
+ }
273
353
  const currentTranslateX = this.calculateCurrentTranslateX();
274
354
  const scrollLeft = this.elemScrollArea.scrollLeft;
275
355
  return scrollLeft - currentTranslateX;
276
356
  }
277
357
  calculateCurrentTranslateX() {
278
358
  const transformValue = this.getScrollContentStyleValue('transform');
359
+ if (transformValue == null) {
360
+ return 0;
361
+ }
279
362
  if (transformValue === 'none') {
280
363
  return 0;
281
364
  }
@@ -292,7 +375,10 @@ export class TabsComponent {
292
375
  return parseFloat(tx);
293
376
  }
294
377
  getScrollContentStyleValue(propName) {
295
- return this.injectedWindow.getComputedStyle(this.elemScrollContent).getPropertyValue(propName);
378
+ if (this.elemScrollContent == null) {
379
+ return;
380
+ }
381
+ return this.injectedWindow?.getComputedStyle(this.elemScrollContent).getPropertyValue(propName);
296
382
  }
297
383
  setScrollContentStyleProperty(propName, value) {
298
384
  this.renderer.setStyle(this.elemScrollContent, propName, value);
@@ -337,11 +423,11 @@ export class TabsComponent {
337
423
  }
338
424
  }
339
425
  TabsComponent.nextId = 0;
340
- TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TabsComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
341
- TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: TabsComponent, selector: "fng-tabs", inputs: { viewType: ["fngTabsViewType", "viewType"], showDivider: ["fngTabsUseBottomDivider", "showDivider"], config: "config" }, outputs: { fngBeforeTabChange: "fngBeforeTabChange", fngTabChange: "fngTabChange" }, queries: [{ propertyName: "panes", predicate: TabPaneComponent }], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }, { propertyName: "scrollAera", first: true, predicate: ["scrollAera"], descendants: true }, { propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li\n *ngFor=\"let tab of tabs; let i = index\"\n class=\"fwe-legacy-tab-item\"\n [ngClass]=\"{ 'fwe-active': tab?.active, 'fwe-disabled': tab?.disabled }\"\n >\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n [class.fng-tab--disabled]=\"tab?.disabled\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:var(--fwe-font-size-base)}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item.fwe-disabled{background-color:var(--fwe-control-disabled)}.fwe-legacy-tab-item.fwe-disabled .fwe-legacy-tab-link{color:var(--fwe-text-disabled)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab--disabled .fng-tab-text-label{color:var(--fwe-text-disabled)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TabsComponent, decorators: [{
426
+ TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TabsComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
427
+ TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: TabsComponent, isStandalone: true, selector: "fng-tabs", inputs: { viewType: ["fngTabsViewType", "viewType"], showDivider: ["fngTabsUseBottomDivider", "showDivider"], config: "config" }, outputs: { fngBeforeTabChange: "fngBeforeTabChange", fngTabChange: "fngTabChange" }, queries: [{ propertyName: "panes", predicate: TabPaneComponent }], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }, { propertyName: "scrollAera", first: true, predicate: ["scrollAera"], descendants: true }, { propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\r\n <div class=\"fwe-legacy-tabs\">\r\n <ul\r\n role=\"tablist\"\r\n class=\"fwe-legacy-tab-bar\"\r\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\r\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\r\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\r\n >\r\n <li\r\n *ngFor=\"let tab of tabs; let i = index\"\r\n class=\"fwe-legacy-tab-item\"\r\n [ngClass]=\"{ 'fwe-active': tab?.active, 'fwe-disabled': tab?.disabled }\"\r\n >\r\n <ng-container *ngIf=\"null == tab?.icon\">\r\n <a\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\r\n role=\"tab\"\r\n class=\"fwe-legacy-tab-link\"\r\n (click)=\"showTabPane(tab.paneId)\"\r\n >{{ tab.name }}</a\r\n >\r\n </ng-container>\r\n <ng-container *ngIf=\"null != tab?.icon\">\r\n <a\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\r\n role=\"tab\"\r\n class=\"fwe-legacy-tab-link\"\r\n (click)=\"showTabPane(tab.paneId)\"\r\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\r\n >\r\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\r\n <span>{{ tab.name }}</span>\r\n </a>\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <div class=\"fwe-legacy-tab-panel-content\">\r\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"viewType !== 'legacy'\">\r\n <div class=\"fng-tab-bar\" role=\"tablist\">\r\n <div class=\"fng-tab-scroller\" #scroller>\r\n <div\r\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\r\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\r\n #scrollAera\r\n >\r\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\r\n <button\r\n *ngFor=\"let tab of tabs; let i = index\"\r\n role=\"tab\"\r\n class=\"fng-tab\"\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [tabindex]=\"i === 0 ? 0 : -1\"\r\n [class.fng-tab--active]=\"tab?.active\"\r\n [class.fng-tab--disabled]=\"tab?.disabled\"\r\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\r\n >\r\n <span class=\"fng-tab-content\">\r\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\r\n </span>\r\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\r\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\r\n </span>\r\n </button>\r\n <div class=\"fng-tab-scroller-divider-line\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fng-tab-panel-content\">\r\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #tabPanelContent>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:var(--fwe-font-size-base)}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item.fwe-disabled{background-color:var(--fwe-control-disabled)}.fwe-legacy-tab-item.fwe-disabled .fwe-legacy-tab-link{color:var(--fwe-text-disabled)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;inset:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab--disabled .fng-tab-text-label{color:var(--fwe-text-disabled)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TabsComponent, decorators: [{
343
429
  type: Component,
344
- args: [{ selector: 'fng-tabs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li\n *ngFor=\"let tab of tabs; let i = index\"\n class=\"fwe-legacy-tab-item\"\n [ngClass]=\"{ 'fwe-active': tab?.active, 'fwe-disabled': tab?.disabled }\"\n >\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n [class.fng-tab--disabled]=\"tab?.disabled\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:var(--fwe-font-size-base)}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item.fwe-disabled{background-color:var(--fwe-control-disabled)}.fwe-legacy-tab-item.fwe-disabled .fwe-legacy-tab-link{color:var(--fwe-text-disabled)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab--disabled .fng-tab-text-label{color:var(--fwe-text-disabled)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"] }]
430
+ args: [{ standalone: true, imports: [CommonModule], selector: 'fng-tabs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\r\n <div class=\"fwe-legacy-tabs\">\r\n <ul\r\n role=\"tablist\"\r\n class=\"fwe-legacy-tab-bar\"\r\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\r\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\r\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\r\n >\r\n <li\r\n *ngFor=\"let tab of tabs; let i = index\"\r\n class=\"fwe-legacy-tab-item\"\r\n [ngClass]=\"{ 'fwe-active': tab?.active, 'fwe-disabled': tab?.disabled }\"\r\n >\r\n <ng-container *ngIf=\"null == tab?.icon\">\r\n <a\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\r\n role=\"tab\"\r\n class=\"fwe-legacy-tab-link\"\r\n (click)=\"showTabPane(tab.paneId)\"\r\n >{{ tab.name }}</a\r\n >\r\n </ng-container>\r\n <ng-container *ngIf=\"null != tab?.icon\">\r\n <a\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [attr.aria-disabled]=\"true === tab?.disabled ? true : false\"\r\n role=\"tab\"\r\n class=\"fwe-legacy-tab-link\"\r\n (click)=\"showTabPane(tab.paneId)\"\r\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\r\n >\r\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\r\n <span>{{ tab.name }}</span>\r\n </a>\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <div class=\"fwe-legacy-tab-panel-content\">\r\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"viewType !== 'legacy'\">\r\n <div class=\"fng-tab-bar\" role=\"tablist\">\r\n <div class=\"fng-tab-scroller\" #scroller>\r\n <div\r\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\r\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\r\n #scrollAera\r\n >\r\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\r\n <button\r\n *ngFor=\"let tab of tabs; let i = index\"\r\n role=\"tab\"\r\n class=\"fng-tab\"\r\n [id]=\"componentId + '-tab-' + i\"\r\n [attr.aria-controls]=\"tab.paneId\"\r\n [attr.aria-selected]=\"true === tab?.active ? true : false\"\r\n [tabindex]=\"i === 0 ? 0 : -1\"\r\n [class.fng-tab--active]=\"tab?.active\"\r\n [class.fng-tab--disabled]=\"tab?.disabled\"\r\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\r\n >\r\n <span class=\"fng-tab-content\">\r\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\r\n </span>\r\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\r\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\r\n </span>\r\n </button>\r\n <div class=\"fng-tab-scroller-divider-line\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fng-tab-panel-content\">\r\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #tabPanelContent>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:var(--fwe-font-size-base)}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item.fwe-disabled{background-color:var(--fwe-control-disabled)}.fwe-legacy-tab-item.fwe-disabled .fwe-legacy-tab-link{color:var(--fwe-text-disabled)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;inset:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab--disabled .fng-tab-text-label{color:var(--fwe-text-disabled)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"] }]
345
431
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Document, decorators: [{
346
432
  type: Inject,
347
433
  args: [DOCUMENT]
@@ -370,4 +456,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
370
456
  type: ViewChild,
371
457
  args: ['scrollContent']
372
458
  }] } });
373
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7O0FBMERqRSxNQUFNLE9BQU8sYUFBYTtJQXlCeEIsWUFDVSxLQUFpQixFQUNDLFFBQWtCLEVBQ3BDLFFBQW1CLEVBQ25CLEVBQXFCO1FBSHJCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUEzQkwsYUFBUSxHQUFnQixZQUFZLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFdEQsV0FBTSxHQUFzQixJQUFJLENBQUM7UUFDaEMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFDOUQsaUJBQVks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QUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0saUJBQWlCLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUV6RSxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNsQjtRQUVELElBQUksaUJBQWlCLEVBQUU7WUFDckIsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7O0FBdllNLG9CQUFNLEdBQUcsQ0FBQyxDQUFDOzBHQURQLGFBQWEsNENBMkJkLFFBQVE7OEZBM0JQLGFBQWEsNlJBU1AsZ0JBQWdCLCtUQ3hGbkMsZ29IQTBGQTsyRkRYYSxhQUFhO2tCQU56QixTQUFTOytCQUNFLFVBQVUsbUJBR0gsdUJBQXVCLENBQUMsTUFBTTttRkE2QlQsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRO29HQXpCUSxRQUFRO3NCQUFqQyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDVSxXQUFXO3NCQUE1QyxLQUFLO3VCQUFDLHlCQUF5QjtnQkFFdkIsTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUU0QixLQUFLO3NCQUF2QyxlQUFlO3VCQUFDLGdCQUFnQjtnQkFDVixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0ksVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNLLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBub29wLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFRhYlBhbmVDb21wb25lbnQgfSBmcm9tICcuL3RhYi1wYW5lL3RhYi1wYW5lLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFiIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYW5lSWQ6IHN0cmluZztcbiAgYWN0aXZlPzogYm9vbGVhbjtcbiAgaWNvbj86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vLyBmaWxsOiB1c2UgdGhlIHJlbWFpbmluZyBzcGFjZSBhbmQgYWRkIGluIHNhbWUgcHJvcG9ydGlvbiB0byBldmVyeSB0YWIgaXRlbVxuLy8gZXF1YWw6IG1ha2UgYWxsIHRhYiBpdGVtcyBzYW1lIHdpZHRoIChhcyB0aGUgb25lIHdpdGggbGFyZ2VzdCBjb250ZW50KVxuZXhwb3J0IHR5cGUgVGFiSXRlbUFwcGVhcmFuY2UgPSAnZmlsbCcgfCAnZXF1YWwnIHwgJ2RlZmF1bHQnO1xuXG4vLyBsZWdhY3k6IHJlY29tbWVuZGVkIGZvciBkZXNrdG9wIG9ubHkgYXBwbGljYXRpb25zXG4vLyByZXNwb25zaXZlOiBkZXNrdG9wLCB0YWJsZXQsIG1vYmlsZSB3aXRoIHNjcm9sbGFibGUgdGFic1xuZXhwb3J0IHR5cGUgVGFiVmlld1R5cGUgPSAnbGVnYWN5JyB8ICdyZXNwb25zaXZlJztcblxuLy8gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBsZWdhY3kgdGFiIHZpZXcgdHlwZVxuZXhwb3J0IGludGVyZmFjZSBUYWJzQ29uZmlndXJhdGlvbiB7XG4gIHRhYkJhcj86IHtcbiAgICBmdWxsV2lkdGg/OiBib29sZWFuO1xuICB9O1xuICB0YWJJdGVtcz86IHtcbiAgICBhcHBlYXJhbmNlOiBUYWJJdGVtQXBwZWFyYW5jZTtcbiAgfTtcbn1cblxuLy8gcHJvdmlkZXMgZGV0YWlscyBhYm91dCB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHRhYiBlbGVtZW50IGFuZCB0aGUgdGFiIGNvbnRlbnQgZWxlbWVudFxuLy8gdGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmlzdWFsIHBvc2l0aW9uIG9mIHRoZSB0YWIgd2l0aCByZXNwZWN0IG9mIGl0cyBwYXJlbnQgY29udGFpbmVyXG5leHBvcnQgaW50ZXJmYWNlIFRhYkRpbWVuc2lvbnMge1xuICByb290TGVmdDogbnVtYmVyO1xuICByb290UmlnaHQ6IG51bWJlcjtcbiAgY29udGVudExlZnQ6IG51bWJlcjtcbiAgY29udGVudFJpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFiU2Nyb2xsQW5pbWF0aW9uIHtcbiAgZmluYWxTY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICBzY3JvbGxEZWx0YTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYlNjcm9sbEhvcml6b250YWxFZGdlcyB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgcmlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCZWZvcmVUYWJDaGFuZ2VFdmVudCB7XG4gIG9rOiAoKSA9PiB2b2lkO1xuICBjYW5jZWw6ICgpID0+IHZvaWQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZuZy10YWJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmV4dElkID0gMDtcbiAgQElucHV0KCdmbmdUYWJzVmlld1R5cGUnKSB2aWV3VHlwZTogVGFiVmlld1R5cGUgPSAncmVzcG9uc2l2ZSc7XG4gIEBJbnB1dCgnZm5nVGFic1VzZUJvdHRvbURpdmlkZXInKSBzaG93RGl2aWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogVGFic0NvbmZpZ3VyYXRpb24gPSBudWxsO1xuICBAT3V0cHV0KCkgZm5nQmVmb3JlVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxCZWZvcmVUYWJDaGFuZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGZuZ1RhYkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwcmV2aW91czogc3RyaW5nOyBjdXJyZW50OiBzdHJpbmcgfT4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmVDb21wb25lbnQpIHBhbmVzOiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGVyJykgc2Nyb2xsZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbEFlcmEnKSBzY3JvbGxBZXJhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzY3JvbGxDb250ZW50Jykgc2Nyb2xsQ29udGVudDogRWxlbWVudFJlZjtcblxuICBjb21wb25lbnRJZCA9IGB0YWJzLSR7KytUYWJzQ29tcG9uZW50Lm5leHRJZH1gO1xuICB0YWJzOiBUYWJbXSA9IFtdO1xuICB1c2VDb21wYWN0RGVuc2l0eTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgYWN0aXZlVGFiOiBUYWIgPSBudWxsO1xuICBwcml2YXRlIGVsZW1TY3JvbGxlcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZWxlbVNjcm9sbEFyZWE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGVsZW1TY3JvbGxDb250ZW50OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RlZFdpbmRvdzogV2luZG93O1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBjb21wbGV0ZTogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5pbmplY3RlZFdpbmRvdyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5pbml0VGFicygpO1xuICAgIGlmIChudWxsID09PSB0aGlzLmFjdGl2ZVRhYikge1xuICAgICAgdGhpcy5wYW5lcy5tYXAoKHBhbmUsIGkpID0+IHtcbiAgICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgICBwYW5lLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhbmVzLmZpbmQocGFuZSA9PiBudWxsICE9IHRoaXMuYWN0aXZlVGFiLnBhbmVJZCAmJiBwYW5lLnRhYlBhbmVJZCA9PT0gdGhpcy5hY3RpdmVUYWIucGFuZUlkKS5pc1Zpc2libGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1TY3JvbGxlciA9IHRoaXMuc2Nyb2xsZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5lbGVtU2Nyb2xsQXJlYSA9IHRoaXMuc2Nyb2xsQWVyYT8ubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmVsZW1TY3JvbGxDb250ZW50ID0gdGhpcy5zY3JvbGxDb250ZW50Py5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGluaXRpYWxXaWR0aCA9IHRoaXMuZWxlbVNjcm9sbEFyZWE/Lm9mZnNldFdpZHRoO1xuICAgIGlmIChpbml0aWFsV2lkdGggPiA3NjgpIHtcbiAgICAgIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmVsZW1TY3JvbGxBcmVhLm9mZnNldFdpZHRoO1xuICAgICAgaWYgKHdpZHRoID4gNzY4ICYmIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0gZWxzZSBpZiAod2lkdGggPD0gNzY4ICYmIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVsZW1TY3JvbGxBcmVhICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1TY3JvbGxBcmVhKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVRhYlBhbmVDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBsZXRlLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5jb21wbGV0ZS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2hvd1RhYlBhbmUoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzLmZpbmQocCA9PiBwLnRhYlBhbmVJZCA9PT0gaWQpO1xuICAgIGNvbnN0IGhhbmRsZVRhYkNoYW5nZSA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAocGFuZSAhPSBudWxsICYmIHBhbmUuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5wYW5lcy5tYXAocCA9PiB7XG4gICAgICAgICAgcC5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhbmUuaXNWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnRhYnMubWFwKHRhYiA9PiB7XG4gICAgICAgICAgaWYgKHRhYi5wYW5lSWQgIT09IHBhbmUudGFiUGFuZUlkKSB7XG4gICAgICAgICAgICB0YWIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhYi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm5nVGFiQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgIHByZXZpb3VzOiB0aGlzLmFjdGl2ZVRhYj8ucGFuZUlkLFxuICAgICAgICAgIGN1cnJlbnQ6IGlkXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRoaXMudGFicy5maW5kKHRhYiA9PiAhIXRhYi5hY3RpdmUpO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZm5nQmVmb3JlVGFiQ2hhbmdlPy5vYnNlcnZlcnM/Lmxlbmd0aCA+IDAgJiYgcGFuZS5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5mbmdCZWZvcmVUYWJDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG9rOiAoKSA9PiB7XG4gICAgICAgICAgaGFuZGxlVGFiQ2hhbmdlKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgbm9vcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlVGFiQ2hhbmdlKGlkKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVUYWJTY3JvbGwoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHNjcm9sbENvbnRlbnRXaWR0aCA9IHRoaXMuZWxlbVNjcm9sbENvbnRlbnQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgc2Nyb2xsQXJlYVdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcblxuICAgIC8vIGNoZWNrIGlmIG5vIHNjcm9sbCBpcyBuZWVkZWRcbiAgICBpZiAoc2Nyb2xsQXJlYVdpZHRoID4gc2Nyb2xsQ29udGVudFdpZHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaW5kZXhcbiAgICBpZiAoIXRoaXMuaW5kZXhJc0luUmFuZ2UoaW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHNjcm9sbCB0byAwIGlmIHNjcm9sbGluZyB0byB0aGUgZmlyc3QgdGFiXG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvKDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzY3JvbGwgdG8gdGhlIG1heCB2YWx1ZSBpZiBzY3JvbGxpbmcgdG8gdGhlIGxhc3QgdGFiXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLnRhYnMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5zY3JvbGxUbyh0aGlzLmVsZW1TY3JvbGxDb250ZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VGFiOiBIVE1MRWxlbWVudCA9IGV2ZW50LnRhcmdldDtcbiAgICB0aGlzLnNjcm9sbEludG9WaWV3KGluZGV4LCBjdXJyZW50VGFiKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRhYnMoKSB7XG4gICAgdGhpcy50YWJzID0gW107XG4gICAgdGhpcy5wYW5lcy5tYXAoKHBhbmUsIGkpID0+IHtcbiAgICAgIHBhbmUudGFiSWQgPSB0aGlzLmNvbXBvbmVudElkICsgJy10YWItJyArIGk7XG4gICAgICBjb25zdCB0YWI6IFRhYiA9IHtcbiAgICAgICAgbmFtZTogbnVsbCAhPSBwYW5lLm5hbWUgPyBwYW5lLm5hbWUgOiAnJyxcbiAgICAgICAgcGFuZUlkOiBudWxsICE9IHBhbmUudGFiUGFuZUlkID8gcGFuZS50YWJQYW5lSWQgOiBudWxsLFxuICAgICAgICBpY29uOiBudWxsICE9IHBhbmUuaWNvbiA/IHBhbmUuaWNvbiA6IG51bGwsXG4gICAgICAgIGFjdGl2ZTogbnVsbCAhPSBwYW5lLmFjdGl2ZSA/IHBhbmUuYWN0aXZlIDogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkOiBudWxsICE9IHBhbmUuZGlzYWJsZWQgPyBwYW5lLmRpc2FibGVkIDogZmFsc2VcbiAgICAgIH07XG4gICAgICB0aGlzLnRhYnMucHVzaCh0YWIpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0QWN0aXZlVGFiKCk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRBY3RpdmVUYWIoKSB7XG4gICAgY29uc3QgYWN0aXZlVGFiOiBUYWIgPSB0aGlzLnRhYnMuZmluZCgodGFiOiBUYWIpID0+ICEhdGFiLmFjdGl2ZSk7XG4gICAgaWYgKCFhY3RpdmVUYWIgJiYgMCA8IHRoaXMudGFicy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGFic1swXSA9IHsgLi4udGhpcy50YWJzWzBdLCBhY3RpdmU6IHRydWUgfTtcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGhpcy50YWJzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IGFjdGl2ZVRhYjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRhYlBhbmVDaGFuZ2VzKCkge1xuICAgIC8vIGZpcnN0IHN1YnNjcmliZSB0byBhbnkgY2hhbmdlcyBpbiB0YWIgcGFuZSwgc28gdGhhdCB0aGUgdGFicyBpbiB0aGlzIHZpZXcgd2lpbCBiZSB1cGRhdGVkXG4gICAgdGhpcy5wYW5lcy5mb3JFYWNoKHBhbmUgPT4ge1xuICAgICAgcGFuZS5jaGFuZ2VzJC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBsZXRlKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gb24gY2hhbmdlcyBpbiBhIHRhYiBwYW5lLCB3ZSBpbml0IHRoZSB0YWJzIGFnYWluXG4gICAgICAgIHRoaXMuaW5pdFRhYnMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUbyhzY3JvbGxYOiBudW1iZXIpIHtcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsWCA9IHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICBjb25zdCBzYWZlU2Nyb2xsWCA9IHRoaXMuY2xhbXBTY3JvbGxWYWx1ZShzY3JvbGxYKTtcbiAgICBjb25zdCBzY3JvbGxEZWx0YSA9IHNhZmVTY3JvbGxYIC0gY3VycmVudFNjcm9sbFg7XG4gICAgdGhpcy5hbmltYXRlKHtcbiAgICAgIGZpbmFsU2Nyb2xsUG9zaXRpb246IHNhZmVTY3JvbGxYLFxuICAgICAgc2Nyb2xsRGVsdGFcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsSW50b1ZpZXcoaW5kZXg6IG51bWJlciwgdGFiOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIGNvbnN0IGJhcldpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCB0YWJEaW1lbnNpb25zID0gdGhpcy5jb21wdXRlRGltZW5zaW9ucyh0YWIpO1xuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuZmluZEFkamFjZW50VGFiSW5kZXhDbG9zZXN0VG9FZGdlKGluZGV4LCB0YWJEaW1lbnNpb25zLCBzY3JvbGxQb3NpdGlvbiwgYmFyV2lkdGgpO1xuXG4gICAgaWYgKCF0aGlzLmluZGV4SXNJblJhbmdlKG5leHRJbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxJbmNyZW1lbnQgPSB0aGlzLmNhbGN1bGF0ZVNjcm9sbEluY3JlbWVudChpbmRleCwgbmV4dEluZGV4LCBzY3JvbGxQb3NpdGlvbiwgYmFyV2lkdGgpO1xuICAgIHRoaXMuaW5jcmVtZW50U2Nyb2xsKHNjcm9sbEluY3JlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGluY3JlbWVudFNjcm9sbChzY3JvbGxYSW5jcmVtZW50OiBudW1iZXIpIHtcbiAgICAvLyBubyBzY3JvbGwgbmVlZGVkXG4gICAgaWYgKHNjcm9sbFhJbmNyZW1lbnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsT3BlcmF0aW9uID0gdGhpcy5nZXRJbmNyZW1lbnRTY3JvbGxPcGVyYXRpb24oc2Nyb2xsWEluY3JlbWVudCk7XG4gICAgdGhpcy5hbmltYXRlKHNjcm9sbE9wZXJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGUoYW5pbWF0aW9uOiBUYWJTY3JvbGxBbmltYXRpb24pIHtcbiAgICAvLyBubyBhbmltYXRpb24gbmVlZGVkXG4gICAgaWYgKGFuaW1hdGlvbi5zY3JvbGxEZWx0YSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcFNjcm9sbEFuaW1hdGlvbigpO1xuXG4gICAgLy8gdGhpcyBhbmltYXRpb24gdXNlcyB0aGUgZmxpcCBhcHByb2FjaFxuICAgIC8vIGh0dHBzOi8vYWVyb3R3aXN0LmNvbS9ibG9nL2ZsaXAteW91ci1hbmltYXRpb25zL1xuICAgIC8vIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vYW5pbWF0aW5nLWxheW91dHMtd2l0aC10aGUtZmxpcC10ZWNobmlxdWUvXG4gICAgdGhpcy5lbGVtU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0ID0gYW5pbWF0aW9uLmZpbmFsU2Nyb2xsUG9zaXRpb247XG4gICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U3R5bGVQcm9wZXJ0eSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZVgoJHthbmltYXRpb24uc2Nyb2xsRGVsdGF9cHgpYCk7XG4gICAgLy8gZm9yY2UgcmVwYWludFxuICAgIHRoaXMuZWxlbVNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1TY3JvbGxlciwgJ2ZuZy10YWItc2Nyb2xsZXItLWFuaW1hdGluZycpO1xuICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U3R5bGVQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFNjcm9sbEFuaW1hdGlvbigpIHtcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldEFuaW1hdGluZ1Njcm9sbFBvc2l0aW9uKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1TY3JvbGxlciwgJ2ZuZy10YWItc2Nyb2xsZXItLWFuaW1hdGluZycpO1xuICAgIHRoaXMuc2V0U2Nyb2xsQ29udGVudFN0eWxlUHJvcGVydHkoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVYKDBweCknKTtcbiAgICB0aGlzLmVsZW1TY3JvbGxBcmVhLnNjcm9sbExlZnQgPSBjdXJyZW50U2Nyb2xsUG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldEFuaW1hdGluZ1Njcm9sbFBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudFRyYW5zbGF0ZVggPSB0aGlzLmNhbGN1bGF0ZUN1cnJlbnRUcmFuc2xhdGVYKCk7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdCAtIGN1cnJlbnRUcmFuc2xhdGVYO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmNyZW1lbnRTY3JvbGxPcGVyYXRpb24oc2Nyb2xsWDogbnVtYmVyKTogVGFiU2Nyb2xsQW5pbWF0aW9uIHtcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsWCA9IHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICBjb25zdCB0YXJnZXRTY3JvbGxYID0gc2Nyb2xsWCArIGN1cnJlbnRTY3JvbGxYO1xuICAgIGNvbnN0IHNhZmVTY3JvbGxYID0gdGhpcy5jbGFtcFNjcm9sbFZhbHVlKHRhcmdldFNjcm9sbFgpO1xuICAgIGNvbnN0IHNjcm9sbERlbHRhID0gc2FmZVNjcm9sbFggLSBjdXJyZW50U2Nyb2xsWDtcbiAgICByZXR1cm4ge1xuICAgICAgZmluYWxTY3JvbGxQb3NpdGlvbjogc2FmZVNjcm9sbFgsXG4gICAgICBzY3JvbGxEZWx0YVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNsYW1wU2Nyb2xsVmFsdWUoc2Nyb2xsWDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBlZGdlcyA9IHRoaXMuY2FsY3VsYXRlU2Nyb2xsRWRnZXMoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZWRnZXMubGVmdCwgc2Nyb2xsWCksIGVkZ2VzLnJpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU2Nyb2xsRWRnZXMoKTogVGFiU2Nyb2xsSG9yaXpvbnRhbEVkZ2VzIHtcbiAgICBjb25zdCBzY3JvbGxDb250ZW50V2lkdGggPSB0aGlzLmVsZW1TY3JvbGxDb250ZW50Lm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IHNjcm9sbEFyZWFXaWR0aCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEub2Zmc2V0V2lkdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogc2Nyb2xsQ29udGVudFdpZHRoIC0gc2Nyb2xsQXJlYVdpZHRoXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZURpbWVuc2lvbnModGFiOiBIVE1MRWxlbWVudCk6IFRhYkRpbWVuc2lvbnMge1xuICAgIGNvbnN0IHJvb3RXaWR0aCA9IHRhYi5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCByb290TGVmdCA9IHRhYi5vZmZzZXRMZWZ0O1xuXG4gICAgY29uc3QgdGFiQ29udGVudDogSFRNTEVsZW1lbnQgPSB0YWIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5mbmctdGFiLWNvbnRlbnQnKTtcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSB0YWJDb250ZW50Lm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGNvbnRlbnRMZWZ0ID0gdGFiQ29udGVudC5vZmZzZXRMZWZ0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRMZWZ0OiByb290TGVmdCArIGNvbnRlbnRMZWZ0LFxuICAgICAgY29udGVudFJpZ2h0OiByb290TGVmdCArIGNvbnRlbnRMZWZ0ICsgY29udGVudFdpZHRoLFxuICAgICAgcm9vdExlZnQsXG4gICAgICByb290UmlnaHQ6IHJvb3RMZWZ0ICsgcm9vdFdpZHRoXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU2Nyb2xsSW5jcmVtZW50KGluZGV4OiBudW1iZXIsIG5leHRJbmRleDogbnVtYmVyLCBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLCBiYXJXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBuZXh0VGFiOiBIVE1MRWxlbWVudCA9ICh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgYCMke3RoaXMuY29tcG9uZW50SWR9LXRhYi0ke25leHRJbmRleH1gXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VGFiRGltZW5zaW9ucyA9IHRoaXMuY29tcHV0ZURpbWVuc2lvbnMobmV4dFRhYik7XG4gICAgY29uc3QgcmVsYXRpdmVDb250ZW50TGVmdCA9IG5leHRUYWJEaW1lbnNpb25zLmNvbnRlbnRMZWZ0IC0gc2Nyb2xsUG9zaXRpb24gLSBiYXJXaWR0aDtcbiAgICBjb25zdCByZWxhdGl2ZUNvbnRlbnRSaWdodCA9IG5leHRUYWJEaW1lbnNpb25zLmNvbnRlbnRSaWdodCAtIHNjcm9sbFBvc2l0aW9uO1xuICAgIGNvbnN0IGxlZnRJbmNyZW1lbnQgPSByZWxhdGl2ZUNvbnRlbnRSaWdodCAtIDQ4O1xuICAgIGNvbnN0IHJpZ2h0SW5jcmVtZW50ID0gcmVsYXRpdmVDb250ZW50TGVmdCArIDQ4O1xuXG4gICAgaWYgKG5leHRJbmRleCA8IGluZGV4KSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4obGVmdEluY3JlbWVudCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWF4KHJpZ2h0SW5jcmVtZW50LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5kZXhJc0luUmFuZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy50YWJzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNsYXRlWCA9IHRoaXMuY2FsY3VsYXRlQ3VycmVudFRyYW5zbGF0ZVgoKTtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgcmV0dXJuIHNjcm9sbExlZnQgLSBjdXJyZW50VHJhbnNsYXRlWDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ3VycmVudFRyYW5zbGF0ZVgoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1WYWx1ZSA9IHRoaXMuZ2V0U2Nyb2xsQ29udGVudFN0eWxlVmFsdWUoJ3RyYW5zZm9ybScpO1xuICAgIGlmICh0cmFuc2Zvcm1WYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyB0aGUgdHJhbnNmb3JtIHZhbHVlIGlzIGluIGZvcm0gb2YgJ21hdHJpeChhLCBiLCBjLCBkLCB0eCwgdHkpJ1xuICAgIC8vIGdldCBhbGwgdGhlIHBhcmVudGhlc2l6ZWQgdmFsdWVzXG4gICAgY29uc3QgbWF0Y2ggPSAvXFwoKC4rPylcXCkvLmV4ZWModHJhbnNmb3JtVmFsdWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdHJpeFBhcmFtcyA9IG1hdGNoWzFdO1xuICAgIC8vIHdlIG5lZWQgdmFsdWUgb2YgdHggLT4gdHJhbnNsYXRlWFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCBbYSwgYiwgYywgZCwgdHgsIHR5XSA9IG1hdHJpeFBhcmFtcy5zcGxpdCgnLCcpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHR4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGVudFN0eWxlVmFsdWUocHJvcE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmluamVjdGVkV2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtU2Nyb2xsQ29udGVudCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHNldFNjcm9sbENvbnRlbnRTdHlsZVByb3BlcnR5KHByb3BOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbVNjcm9sbENvbnRlbnQsIHByb3BOYW1lLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRBZGphY2VudFRhYkluZGV4Q2xvc2VzdFRvRWRnZShpbmRleDogbnVtYmVyLCB0YWJEaW1lbnNpb25zOiBUYWJEaW1lbnNpb25zLCBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLCBiYXJXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiB0YWJzIGFyZSBsYWlkIG91dCBpbiB0aGUgdGFiIHNjcm9sbGVyIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqICAgIHNjcm9sbCBwb3NpdGlvblxuICAgICAqICAgICstLS0rXG4gICAgICogICAgfCAgIHwgICBiYXIgd2lkdGhcbiAgICAgKiAgICB8ICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgICAqICAgIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogICAgfCAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZcbiAgICAgKiAgICB8ICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgICAqICAgIHYgICB8ICAgICAgICAgICAgIHRhYiBzY3JvbGxlciAgICAgICAgICB8XG4gICAgICogICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgICAqICAgIHwgICAgdGFiICAgICB8ICAgICAgdGFiICAgICB8ICAgICAgICB0YWIgICAgICAgIHxcbiAgICAgKiAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAgICogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgICAqXG4gICAgICogdG8gZGV0ZXJtaW5lIHRoZSBuZXh0IGFkamFjZW50IGluZGV4LCB3ZSBsb29rIGF0IHRoZSB0YWIgcm9vdCBsZWZ0IGFuZFxuICAgICAqIHRhYiByb290IHJpZ2h0LCBib3RoIHJlbGF0aXZlIHRvIHRoZSBzY3JvbGwgcG9zaXRpb24uIGlmIHRoZSB0YWIgcm9vdFxuICAgICAqIGxlZnQgaXMgbGVzcyB0aGFuIDAsIHRoZW4gd2Uga25vdyBpdCdzIG91dCBvZiB2aWV3IHRvIHRoZSBsZWZ0LiBpZiB0aGVcbiAgICAgKiB0YWIgcm9vdCByaWdodCBtaW51cyB0aGUgYmFyIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAwLCB3ZSBrbm93IHRoZSB0YWIgaXNcbiAgICAgKiBvdXQgb2YgdmlldyB0byB0aGUgcmlnaHQuIGZyb20gdGhlcmUsIHdlIGVpdGhlciBpbmNyZW1lbnQgb3IgZGVjcmVtZW50XG4gICAgICogdGhlIGluZGV4LlxuICAgICAqL1xuICAgIGNvbnN0IHJlbGF0aXZlUm9vdExlZnQgPSB0YWJEaW1lbnNpb25zLnJvb3RMZWZ0IC0gc2Nyb2xsUG9zaXRpb247XG4gICAgY29uc3QgcmVsYXRpdmVSb290UmlnaHQgPSB0YWJEaW1lbnNpb25zLnJvb3RSaWdodCAtIHNjcm9sbFBvc2l0aW9uIC0gYmFyV2lkdGg7XG4gICAgY29uc3QgcmVsYXRpdmVSb290RGVsdGEgPSByZWxhdGl2ZVJvb3RMZWZ0ICsgcmVsYXRpdmVSb290UmlnaHQ7XG4gICAgY29uc3QgbGVmdEVkZ2VJc0Nsb3NlciA9IHJlbGF0aXZlUm9vdExlZnQgPCAwIHx8IHJlbGF0aXZlUm9vdERlbHRhIDwgMDtcbiAgICBjb25zdCByaWdodEVkZ2VJc0Nsb3NlciA9IHJlbGF0aXZlUm9vdFJpZ2h0ID4gMCB8fCByZWxhdGl2ZVJvb3REZWx0YSA+IDA7XG5cbiAgICBpZiAobGVmdEVkZ2VJc0Nsb3Nlcikge1xuICAgICAgcmV0dXJuIGluZGV4IC0gMTtcbiAgICB9XG5cbiAgICBpZiAocmlnaHRFZGdlSXNDbG9zZXIpIHtcbiAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidmlld1R5cGUgPT09ICdsZWdhY3knXCI+XG4gIDxkaXYgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYnNcIj5cbiAgICA8dWxcbiAgICAgIHJvbGU9XCJ0YWJsaXN0XCJcbiAgICAgIGNsYXNzPVwiZndlLWxlZ2FjeS10YWItYmFyXCJcbiAgICAgIFtjbGFzcy5md2UtbGVnYWN5LXRhYi1iYXItZnVsbC13aWR0aF09XCJjb25maWc/LnRhYkJhcj8uZnVsbFdpZHRoXCJcbiAgICAgIFtjbGFzcy5md2UtbGVnYWN5LXRhYi1pdGVtcy1lcXVhbC13aWR0aF09XCInZXF1YWwnID09PSBjb25maWc/LnRhYkl0ZW1zPy5hcHBlYXJhbmNlXCJcbiAgICAgIFtjbGFzcy5md2UtbGVnYWN5LXRhYi1pdGVtcy1maWxsXT1cIidmaWxsJyA9PT0gY29uZmlnPy50YWJJdGVtcz8uYXBwZWFyYW5jZVwiXG4gICAgPlxuICAgICAgPGxpXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIGNsYXNzPVwiZndlLWxlZ2FjeS10YWItaXRlbVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Z3ZS1hY3RpdmUnOiB0YWI/LmFjdGl2ZSwgJ2Z3ZS1kaXNhYmxlZCc6IHRhYj8uZGlzYWJsZWQgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJudWxsID09IHRhYj8uaWNvblwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInRhYi5wYW5lSWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0cnVlID09PSB0YWI/LmFjdGl2ZSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWUgPT09IHRhYj8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICBjbGFzcz1cImZ3ZS1sZWdhY3ktdGFiLWxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcbiAgICAgICAgICAgID57eyB0YWIubmFtZSB9fTwvYVxuICAgICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJudWxsICE9IHRhYj8uaWNvblwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInRhYi5wYW5lSWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0cnVlID09PSB0YWI/LmFjdGl2ZSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWUgPT09IHRhYj8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICBjbGFzcz1cImZ3ZS1sZWdhY3ktdGFiLWxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5md2UtY2FuLXN3YXAtaWNvbl09XCIyID09PSB0YWJzLmxlbmd0aCAmJiAxID09PSBpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ2Z3ZS1pY29uICcgKyB0YWIuaWNvblwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRhYi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gICAgPGRpdiBjbGFzcz1cImZ3ZS1sZWdhY3ktdGFiLXBhbmVsLWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJQYW5lbENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdUeXBlICE9PSAnbGVnYWN5J1wiPlxuICA8ZGl2IGNsYXNzPVwiZm5nLXRhYi1iYXJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbmctdGFiLXNjcm9sbGVyXCIgI3Njcm9sbGVyPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZuZy10YWItc2Nyb2xsZXItc2Nyb2xsLWFyZWEgZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtYXJlYS0tc2Nyb2xsXCJcbiAgICAgICAgW2NsYXNzLmZuZy10YWItc2Nyb2xsZXItc2Nyb2xsLWFyZWEtLWNvbXBhY3RdPVwidXNlQ29tcGFjdERlbnNpdHlcIlxuICAgICAgICAjc2Nyb2xsQWVyYVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtY29udGVudFwiIFtjbGFzcy5mbmctdGFiLXNjcm9sbGVyLXNjcm9sbC1jb250ZW50LS13aXRoLWRpdmlkZXJdPVwic2hvd0RpdmlkZXJcIiAjc2Nyb2xsQ29udGVudD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICBjbGFzcz1cImZuZy10YWJcIlxuICAgICAgICAgICAgW2lkXT1cImNvbXBvbmVudElkICsgJy10YWItJyArIGlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ0YWIucGFuZUlkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidHJ1ZSA9PT0gdGFiPy5hY3RpdmUgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImkgPT09IDAgPyAwIDogLTFcIlxuICAgICAgICAgICAgW2NsYXNzLmZuZy10YWItLWFjdGl2ZV09XCJ0YWI/LmFjdGl2ZVwiXG4gICAgICAgICAgICBbY2xhc3MuZm5nLXRhYi0tZGlzYWJsZWRdPVwidGFiPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFiU2Nyb2xsKCRldmVudCwgaSk7IHNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZuZy10YWItY29udGVudFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZuZy10YWItdGV4dC1sYWJlbFwiPnt7IHRhYi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbmctdGFiLWluZGljYXRvclwiIFtjbGFzcy5mbmctdGFiLWluZGljYXRvci0tYWN0aXZlXT1cInRhYj8uYWN0aXZlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm5nLXRhYi1pbmRpY2F0b3ItY29udGVudCBmbmctdGFiLWluZGljYXRvci1jb250ZW50LS11bmRlcmxpbmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZuZy10YWItc2Nyb2xsZXItZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZuZy10YWItcGFuZWwtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYlBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3RhYlBhbmVsQ29udGVudD5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy90YWJzL3RhYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdGFicy90YWJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUE0RGpFLE1BQU0sT0FBTyxhQUFhO0lBeUJ4QixZQUNVLEtBQWlCLEVBQ0MsUUFBa0IsRUFDcEMsUUFBbUIsRUFDbkIsRUFBcUI7UUFIckIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQTNCTCxhQUFRLEdBQWdCLFlBQVksQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUV0RCxXQUFNLEdBQTZCLElBQUksQ0FBQztRQUN2Qyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUM5RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUF5QyxDQUFDO1FBT25G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QUFpQixHQUFHLENBQUMsQ0FBQztRQUV6RSxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNsQjtRQUVELElBQUksaUJBQWlCLEVBQUU7WUFDckIsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7O0FBemVNLG9CQUFNLEdBQUcsQ0FBQyxDQUFDOzBHQURQLGFBQWEsNENBMkJkLFFBQVE7OEZBM0JQLGFBQWEsaVRBU1AsZ0JBQWdCLCtUQzFGbkMsb3pIQTBGQSxpdkpEZlksWUFBWTsyRkFNWCxhQUFhO2tCQVJ6QixTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLFVBQVUsbUJBR0gsdUJBQXVCLENBQUMsTUFBTTs7MEJBNkI1QyxNQUFNOzJCQUFDLFFBQVE7b0dBekJRLFFBQVE7c0JBQWpDLEtBQUs7dUJBQUMsaUJBQWlCO2dCQUNVLFdBQVc7c0JBQTVDLEtBQUs7dUJBQUMseUJBQXlCO2dCQUV2QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRTRCLEtBQUs7c0JBQXZDLGVBQWU7dUJBQUMsZ0JBQWdCO2dCQUNWLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0ssYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgbm9vcCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBUYWJQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi90YWItcGFuZS90YWItcGFuZS5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWIge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBwYW5lSWQ6IHN0cmluZyB8IG51bGw7XHJcbiAgYWN0aXZlPzogYm9vbGVhbjtcclxuICBpY29uPzogc3RyaW5nIHwgbnVsbDtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8vIGZpbGw6IHVzZSB0aGUgcmVtYWluaW5nIHNwYWNlIGFuZCBhZGQgaW4gc2FtZSBwcm9wb3J0aW9uIHRvIGV2ZXJ5IHRhYiBpdGVtXHJcbi8vIGVxdWFsOiBtYWtlIGFsbCB0YWIgaXRlbXMgc2FtZSB3aWR0aCAoYXMgdGhlIG9uZSB3aXRoIGxhcmdlc3QgY29udGVudClcclxuZXhwb3J0IHR5cGUgVGFiSXRlbUFwcGVhcmFuY2UgPSAnZmlsbCcgfCAnZXF1YWwnIHwgJ2RlZmF1bHQnO1xyXG5cclxuLy8gbGVnYWN5OiByZWNvbW1lbmRlZCBmb3IgZGVza3RvcCBvbmx5IGFwcGxpY2F0aW9uc1xyXG4vLyByZXNwb25zaXZlOiBkZXNrdG9wLCB0YWJsZXQsIG1vYmlsZSB3aXRoIHNjcm9sbGFibGUgdGFic1xyXG5leHBvcnQgdHlwZSBUYWJWaWV3VHlwZSA9ICdsZWdhY3knIHwgJ3Jlc3BvbnNpdmUnO1xyXG5cclxuLy8gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBsZWdhY3kgdGFiIHZpZXcgdHlwZVxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYnNDb25maWd1cmF0aW9uIHtcclxuICB0YWJCYXI/OiB7XHJcbiAgICBmdWxsV2lkdGg/OiBib29sZWFuO1xyXG4gIH07XHJcbiAgdGFiSXRlbXM/OiB7XHJcbiAgICBhcHBlYXJhbmNlOiBUYWJJdGVtQXBwZWFyYW5jZTtcclxuICB9O1xyXG59XHJcblxyXG4vLyBwcm92aWRlcyBkZXRhaWxzIGFib3V0IHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyBvZiB0aGUgdGFiIGVsZW1lbnQgYW5kIHRoZSB0YWIgY29udGVudCBlbGVtZW50XHJcbi8vIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZpc3VhbCBwb3NpdGlvbiBvZiB0aGUgdGFiIHdpdGggcmVzcGVjdCBvZiBpdHMgcGFyZW50IGNvbnRhaW5lclxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYkRpbWVuc2lvbnMge1xyXG4gIHJvb3RMZWZ0OiBudW1iZXI7XHJcbiAgcm9vdFJpZ2h0OiBudW1iZXI7XHJcbiAgY29udGVudExlZnQ6IG51bWJlcjtcclxuICBjb250ZW50UmlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWJTY3JvbGxBbmltYXRpb24ge1xyXG4gIGZpbmFsU2Nyb2xsUG9zaXRpb246IG51bWJlcjtcclxuICBzY3JvbGxEZWx0YTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYlNjcm9sbEhvcml6b250YWxFZGdlcyB7XHJcbiAgbGVmdDogbnVtYmVyO1xyXG4gIHJpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmVmb3JlVGFiQ2hhbmdlRXZlbnQge1xyXG4gIG9rOiAoKSA9PiB2b2lkO1xyXG4gIGNhbmNlbDogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICBzZWxlY3RvcjogJ2ZuZy10YWJzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBzdGF0aWMgbmV4dElkID0gMDtcclxuICBASW5wdXQoJ2ZuZ1RhYnNWaWV3VHlwZScpIHZpZXdUeXBlOiBUYWJWaWV3VHlwZSA9ICdyZXNwb25zaXZlJztcclxuICBASW5wdXQoJ2ZuZ1RhYnNVc2VCb3R0b21EaXZpZGVyJykgc2hvd0RpdmlkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBUYWJzQ29uZmlndXJhdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIEBPdXRwdXQoKSBmbmdCZWZvcmVUYWJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEJlZm9yZVRhYkNoYW5nZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBmbmdUYWJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldmlvdXM6IHN0cmluZzsgY3VycmVudDogc3RyaW5nIH0+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFiUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxUYWJQYW5lQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKCdzY3JvbGxlcicpIHNjcm9sbGVyOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbEFlcmEnKSBzY3JvbGxBZXJhOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRlbnQnKSBzY3JvbGxDb250ZW50OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb21wb25lbnRJZCA9IGB0YWJzLSR7KytUYWJzQ29tcG9uZW50Lm5leHRJZH1gO1xyXG4gIHRhYnM6IFRhYltdID0gW107XHJcbiAgdXNlQ29tcGFjdERlbnNpdHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgYWN0aXZlVGFiOiBUYWIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBlbGVtU2Nyb2xsZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZWxlbVNjcm9sbEFyZWE6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZWxlbVNjcm9sbENvbnRlbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0ZWRXaW5kb3c6IFdpbmRvdyB8IG51bGw7XHJcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlciE6IFJlc2l6ZU9ic2VydmVyO1xyXG4gIHByaXZhdGUgY29tcGxldGU6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7XHJcbiAgICB0aGlzLmluamVjdGVkV2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldztcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdFRhYnMoKTtcclxuICAgIGlmIChudWxsID09IHRoaXMuYWN0aXZlVGFiKSB7XHJcbiAgICAgIHRoaXMucGFuZXM/Lm1hcCgocGFuZSwgaSkgPT4ge1xyXG4gICAgICAgIGlmICgwID09PSBpKSB7XHJcbiAgICAgICAgICBwYW5lLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzPy5maW5kKHBhbmUgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYikge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiLnBhbmVJZCAhPSBudWxsICYmIHBhbmUudGFiUGFuZUlkID09PSB0aGlzLmFjdGl2ZVRhYi5wYW5lSWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocGFuZSkge1xyXG4gICAgICAgIHBhbmUuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lbGVtU2Nyb2xsZXIgPSB0aGlzLnNjcm9sbGVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5lbGVtU2Nyb2xsQXJlYSA9IHRoaXMuc2Nyb2xsQWVyYT8ubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuZWxlbVNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5lbGVtU2Nyb2xsZXIgPT0gbnVsbCB8fCB0aGlzLmVsZW1TY3JvbGxBcmVhID09IG51bGwgfHwgdGhpcy5lbGVtU2Nyb2xsQ29udGVudCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGluaXRpYWxXaWR0aCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEub2Zmc2V0V2lkdGg7XHJcbiAgICBpZiAoaW5pdGlhbFdpZHRoICE9IG51bGwgJiYgaW5pdGlhbFdpZHRoID4gNzY4KSB7XHJcbiAgICAgIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVsZW1TY3JvbGxBcmVhID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmVsZW1TY3JvbGxBcmVhLm9mZnNldFdpZHRoO1xyXG4gICAgICBpZiAod2lkdGggIT0gbnVsbCAmJiB3aWR0aCA+IDc2OCAmJiB0aGlzLnVzZUNvbXBhY3REZW5zaXR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2UgaWYgKHdpZHRoICE9IG51bGwgJiYgd2lkdGggPD0gNzY4ICYmIHRoaXMudXNlQ29tcGFjdERlbnNpdHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmVsZW1TY3JvbGxBcmVhICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbVNjcm9sbEFyZWEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlVGFiUGFuZUNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wbGV0ZS5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5jb21wbGV0ZS51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvd1RhYlBhbmUoaWQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIGlmIChpZCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5wYW5lcz8uZmluZChwID0+IHAudGFiUGFuZUlkID09PSBpZCk7XHJcbiAgICBjb25zdCBoYW5kbGVUYWJDaGFuZ2UgPSAoaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAocGFuZSAhPSBudWxsICYmIHBhbmUuZGlzYWJsZWQgIT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLnBhbmVzPy5tYXAocCA9PiB7XHJcbiAgICAgICAgICBwLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBhbmUuaXNWaXNpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy50YWJzLm1hcCh0YWIgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhYi5wYW5lSWQgIT09IHBhbmUudGFiUGFuZUlkKSB7XHJcbiAgICAgICAgICAgIHRhYi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhYi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZm5nVGFiQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgcHJldmlvdXM6IHRoaXMuYWN0aXZlVGFiPy5wYW5lSWQgfHwgJycsXHJcbiAgICAgICAgICBjdXJyZW50OiBpZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGhpcy50YWJzLmZpbmQodGFiID0+ICEhdGFiLmFjdGl2ZSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuZm5nQmVmb3JlVGFiQ2hhbmdlPy5vYnNlcnZlcnM/Lmxlbmd0aCA+IDAgJiYgcGFuZT8uZGlzYWJsZWQgIT09IHRydWUpIHtcclxuICAgICAgdGhpcy5mbmdCZWZvcmVUYWJDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgb2s6ICgpID0+IHtcclxuICAgICAgICAgIGhhbmRsZVRhYkNoYW5nZShpZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjYW5jZWw6ICgpID0+IHtcclxuICAgICAgICAgIG5vb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaGFuZGxlVGFiQ2hhbmdlKGlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYlNjcm9sbChldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5lbGVtU2Nyb2xsQ29udGVudCA9PSBudWxsIHx8IHRoaXMuZWxlbVNjcm9sbEFyZWEgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxDb250ZW50V2lkdGggPSB0aGlzLmVsZW1TY3JvbGxDb250ZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3Qgc2Nyb2xsQXJlYVdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAvLyBjaGVjayBpZiBubyBzY3JvbGwgaXMgbmVlZGVkXHJcbiAgICBpZiAoc2Nyb2xsQXJlYVdpZHRoID4gc2Nyb2xsQ29udGVudFdpZHRoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBpbmRleFxyXG4gICAgaWYgKCF0aGlzLmluZGV4SXNJblJhbmdlKGluZGV4KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWx3YXlzIHNjcm9sbCB0byAwIGlmIHNjcm9sbGluZyB0byB0aGUgZmlyc3QgdGFiXHJcbiAgICBpZiAoaW5kZXggPT09IDApIHtcclxuICAgICAgdGhpcy5zY3JvbGxUbygwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsd2F5cyBzY3JvbGwgdG8gdGhlIG1heCB2YWx1ZSBpZiBzY3JvbGxpbmcgdG8gdGhlIGxhc3QgdGFiXHJcbiAgICBpZiAoaW5kZXggPT09IHRoaXMudGFicy5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5lbGVtU2Nyb2xsQ29udGVudC5vZmZzZXRXaWR0aCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50VGFiOiBIVE1MRWxlbWVudCA9IGV2ZW50LnRhcmdldDtcclxuICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXcoaW5kZXgsIGN1cnJlbnRUYWIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0VGFicygpIHtcclxuICAgIHRoaXMudGFicyA9IFtdO1xyXG4gICAgdGhpcy5wYW5lcz8ubWFwKChwYW5lLCBpKSA9PiB7XHJcbiAgICAgIHBhbmUudGFiSWQgPSB0aGlzLmNvbXBvbmVudElkICsgJy10YWItJyArIGk7XHJcbiAgICAgIGNvbnN0IHRhYjogVGFiID0ge1xyXG4gICAgICAgIG5hbWU6IG51bGwgIT0gcGFuZS5uYW1lID8gcGFuZS5uYW1lIDogJycsXHJcbiAgICAgICAgcGFuZUlkOiBudWxsICE9IHBhbmUudGFiUGFuZUlkID8gcGFuZS50YWJQYW5lSWQgOiBudWxsLFxyXG4gICAgICAgIGljb246IG51bGwgIT0gcGFuZS5pY29uID8gcGFuZS5pY29uIDogbnVsbCxcclxuICAgICAgICBhY3RpdmU6IG51bGwgIT0gcGFuZS5hY3RpdmUgPyBwYW5lLmFjdGl2ZSA6IGZhbHNlLFxyXG4gICAgICAgIGRpc2FibGVkOiBudWxsICE9IHBhbmUuZGlzYWJsZWQgPyBwYW5lLmRpc2FibGVkIDogZmFsc2VcclxuICAgICAgfTtcclxuICAgICAgdGhpcy50YWJzLnB1c2godGFiKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5pdEFjdGl2ZVRhYigpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRBY3RpdmVUYWIoKSB7XHJcbiAgICBjb25zdCBhY3RpdmVUYWI6IFRhYiB8IHVuZGVmaW5lZCA9IHRoaXMudGFicy5maW5kKCh0YWI6IFRhYikgPT4gISF0YWIuYWN0aXZlKTtcclxuICAgIGlmICghYWN0aXZlVGFiICYmIDAgPCB0aGlzLnRhYnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudGFic1swXSA9IHsgLi4udGhpcy50YWJzWzBdLCBhY3RpdmU6IHRydWUgfTtcclxuICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0aGlzLnRhYnNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IGFjdGl2ZVRhYjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlVGFiUGFuZUNoYW5nZXMoKSB7XHJcbiAgICAvLyBmaXJzdCBzdWJzY3JpYmUgdG8gYW55IGNoYW5nZXMgaW4gdGFiIHBhbmUsIHNvIHRoYXQgdGhlIHRhYnMgaW4gdGhpcyB2aWV3IHdpaWwgYmUgdXBkYXRlZFxyXG4gICAgdGhpcy5wYW5lcz8uZm9yRWFjaChwYW5lID0+IHtcclxuICAgICAgcGFuZS5jaGFuZ2VzJC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBsZXRlKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAvLyBvbiBjaGFuZ2VzIGluIGEgdGFiIHBhbmUsIHdlIGluaXQgdGhlIHRhYnMgYWdhaW5cclxuICAgICAgICB0aGlzLmluaXRUYWJzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjcm9sbFRvKHNjcm9sbFg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHNjcm9sbFggPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsWCA9IHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgIGNvbnN0IHNhZmVTY3JvbGxYID0gdGhpcy5jbGFtcFNjcm9sbFZhbHVlKHNjcm9sbFgpO1xyXG4gICAgaWYgKHNhZmVTY3JvbGxYID09IG51bGwgfHwgY3VycmVudFNjcm9sbFggPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxEZWx0YSA9IHNhZmVTY3JvbGxYIC0gY3VycmVudFNjcm9sbFg7XHJcbiAgICB0aGlzLmFuaW1hdGUoe1xyXG4gICAgICBmaW5hbFNjcm9sbFBvc2l0aW9uOiBzYWZlU2Nyb2xsWCxcclxuICAgICAgc2Nyb2xsRGVsdGFcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxJbnRvVmlldyhpbmRleDogbnVtYmVyLCB0YWI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBpZiAodGhpcy5lbGVtU2Nyb2xsQXJlYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgIGNvbnN0IGJhcldpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcclxuICAgIGlmIChiYXJXaWR0aCA9PSBudWxsIHx8IHNjcm9sbFBvc2l0aW9uID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhYkRpbWVuc2lvbnMgPSB0aGlzLmNvbXB1dGVEaW1lbnNpb25zKHRhYik7XHJcbiAgICBpZiAodGFiRGltZW5zaW9ucyA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmZpbmRBZGphY2VudFRhYkluZGV4Q2xvc2VzdFRvRWRnZShpbmRleCwgdGFiRGltZW5zaW9ucywgc2Nyb2xsUG9zaXRpb24sIGJhcldpZHRoKTtcclxuICAgIGlmICghdGhpcy5pbmRleElzSW5SYW5nZShuZXh0SW5kZXgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzY3JvbGxJbmNyZW1lbnQgPSB0aGlzLmNhbGN1bGF0ZVNjcm9sbEluY3JlbWVudChpbmRleCwgbmV4dEluZGV4LCBzY3JvbGxQb3NpdGlvbiwgYmFyV2lkdGgpO1xyXG4gICAgaWYgKHNjcm9sbEluY3JlbWVudCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFNjcm9sbChzY3JvbGxJbmNyZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbmNyZW1lbnRTY3JvbGwoc2Nyb2xsWEluY3JlbWVudDogbnVtYmVyKSB7XHJcbiAgICAvLyBubyBzY3JvbGwgbmVlZGVkXHJcbiAgICBpZiAoc2Nyb2xsWEluY3JlbWVudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxPcGVyYXRpb24gPSB0aGlzLmdldEluY3JlbWVudFNjcm9sbE9wZXJhdGlvbihzY3JvbGxYSW5jcmVtZW50KTtcclxuICAgIGlmIChzY3JvbGxPcGVyYXRpb24gPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFuaW1hdGUoc2Nyb2xsT3BlcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5pbWF0ZShhbmltYXRpb246IFRhYlNjcm9sbEFuaW1hdGlvbikge1xyXG4gICAgLy8gbm8gYW5pbWF0aW9uIG5lZWRlZFxyXG4gICAgaWYgKGFuaW1hdGlvbi5zY3JvbGxEZWx0YSA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm8gYW5pbWF0aW9uIHBvc3NpYmxlXHJcbiAgICBpZiAodGhpcy5lbGVtU2Nyb2xsQXJlYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3BTY3JvbGxBbmltYXRpb24oKTtcclxuXHJcbiAgICAvLyB0aGlzIGFuaW1hdGlvbiB1c2VzIHRoZSBmbGlwIGFwcHJvYWNoXHJcbiAgICAvLyBodHRwczovL2Flcm90d2lzdC5jb20vYmxvZy9mbGlwLXlvdXItYW5pbWF0aW9ucy9cclxuICAgIC8vIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vYW5pbWF0aW5nLWxheW91dHMtd2l0aC10aGUtZmxpcC10ZWNobmlxdWUvXHJcbiAgICB0aGlzLmVsZW1TY3JvbGxBcmVhLnNjcm9sbExlZnQgPSBhbmltYXRpb24uZmluYWxTY3JvbGxQb3NpdGlvbjtcclxuICAgIHRoaXMuc2V0U2Nyb2xsQ29udGVudFN0eWxlUHJvcGVydHkoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGVYKCR7YW5pbWF0aW9uLnNjcm9sbERlbHRhfXB4KWApO1xyXG4gICAgLy8gZm9yY2UgcmVwYWludFxyXG4gICAgdGhpcy5lbGVtU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbVNjcm9sbGVyLCAnZm5nLXRhYi1zY3JvbGxlci0tYW5pbWF0aW5nJyk7XHJcbiAgICAgIHRoaXMuc2V0U2Nyb2xsQ29udGVudFN0eWxlUHJvcGVydHkoJ3RyYW5zZm9ybScsICdub25lJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcFNjcm9sbEFuaW1hdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmVsZW1TY3JvbGxBcmVhID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudFNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRBbmltYXRpbmdTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgaWYgKGN1cnJlbnRTY3JvbGxQb3NpdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbVNjcm9sbGVyLCAnZm5nLXRhYi1zY3JvbGxlci0tYW5pbWF0aW5nJyk7XHJcbiAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTdHlsZVByb3BlcnR5KCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlWCgwcHgpJyk7XHJcbiAgICB0aGlzLmVsZW1TY3JvbGxBcmVhLnNjcm9sbExlZnQgPSBjdXJyZW50U2Nyb2xsUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFuaW1hdGluZ1Njcm9sbFBvc2l0aW9uKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuZWxlbVNjcm9sbEFyZWEgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2xhdGVYID0gdGhpcy5jYWxjdWxhdGVDdXJyZW50VHJhbnNsYXRlWCgpO1xyXG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcclxuICAgIHJldHVybiBzY3JvbGxMZWZ0IC0gY3VycmVudFRyYW5zbGF0ZVg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEluY3JlbWVudFNjcm9sbE9wZXJhdGlvbihzY3JvbGxYOiBudW1iZXIpOiBUYWJTY3JvbGxBbmltYXRpb24gfCBudWxsIHtcclxuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxYID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgaWYgKGN1cnJlbnRTY3JvbGxYID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0U2Nyb2xsWCA9IHNjcm9sbFggKyBjdXJyZW50U2Nyb2xsWDtcclxuICAgIGNvbnN0IHNhZmVTY3JvbGxYID0gdGhpcy5jbGFtcFNjcm9sbFZhbHVlKHRhcmdldFNjcm9sbFgpO1xyXG4gICAgaWYgKHNhZmVTY3JvbGxYID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxEZWx0YSA9IHNhZmVTY3JvbGxYIC0gY3VycmVudFNjcm9sbFg7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmaW5hbFNjcm9sbFBvc2l0aW9uOiBzYWZlU2Nyb2xsWCxcclxuICAgICAgc2Nyb2xsRGVsdGFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wU2Nyb2xsVmFsdWUoc2Nyb2xsWDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCBlZGdlcyA9IHRoaXMuY2FsY3VsYXRlU2Nyb2xsRWRnZXMoKTtcclxuICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGVkZ2VzLmxlZnQsIHNjcm9sbFgpLCBlZGdlcy5yaWdodCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVNjcm9sbEVkZ2VzKCk6IFRhYlNjcm9sbEhvcml6b250YWxFZGdlcyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuZWxlbVNjcm9sbEFyZWEgPT0gbnVsbCB8fCB0aGlzLmVsZW1TY3JvbGxDb250ZW50ID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxDb250ZW50V2lkdGggPSB0aGlzLmVsZW1TY3JvbGxDb250ZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3Qgc2Nyb2xsQXJlYVdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICAgIHJpZ2h0OiBzY3JvbGxDb250ZW50V2lkdGggLSBzY3JvbGxBcmVhV2lkdGhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVEaW1lbnNpb25zKHRhYjogSFRNTEVsZW1lbnQpOiBUYWJEaW1lbnNpb25zIHwgbnVsbCB7XHJcbiAgICBjb25zdCByb290V2lkdGggPSB0YWIub2Zmc2V0V2lkdGg7XHJcbiAgICBjb25zdCByb290TGVmdCA9IHRhYi5vZmZzZXRMZWZ0O1xyXG5cclxuICAgIGNvbnN0IHRhYkNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IHRhYi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmZuZy10YWItY29udGVudCcpO1xyXG4gICAgaWYgKHRhYkNvbnRlbnQgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSB0YWJDb250ZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3QgY29udGVudExlZnQgPSB0YWJDb250ZW50Lm9mZnNldExlZnQ7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29udGVudExlZnQ6IHJvb3RMZWZ0ICsgY29udGVudExlZnQsXHJcbiAgICAgIGNvbnRlbnRSaWdodDogcm9vdExlZnQgKyBjb250ZW50TGVmdCArIGNvbnRlbnRXaWR0aCxcclxuICAgICAgcm9vdExlZnQsXHJcbiAgICAgIHJvb3RSaWdodDogcm9vdExlZnQgKyByb290V2lkdGhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVNjcm9sbEluY3JlbWVudChpbmRleDogbnVtYmVyLCBuZXh0SW5kZXg6IG51bWJlciwgc2Nyb2xsUG9zaXRpb246IG51bWJlciwgYmFyV2lkdGg6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgbmV4dFRhYjogSFRNTEVsZW1lbnQgfCBudWxsID0gKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXHJcbiAgICAgIGAjJHt0aGlzLmNvbXBvbmVudElkfS10YWItJHtuZXh0SW5kZXh9YFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAobmV4dFRhYiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5leHRUYWJEaW1lbnNpb25zID0gdGhpcy5jb21wdXRlRGltZW5zaW9ucyhuZXh0VGFiKTtcclxuXHJcbiAgICBpZiAobmV4dFRhYkRpbWVuc2lvbnMgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZWxhdGl2ZUNvbnRlbnRMZWZ0ID0gbmV4dFRhYkRpbWVuc2lvbnMuY29udGVudExlZnQgLSBzY3JvbGxQb3NpdGlvbiAtIGJhcldpZHRoO1xyXG4gICAgY29uc3QgcmVsYXRpdmVDb250ZW50UmlnaHQgPSBuZXh0VGFiRGltZW5zaW9ucy5jb250ZW50UmlnaHQgLSBzY3JvbGxQb3NpdGlvbjtcclxuICAgIGNvbnN0IGxlZnRJbmNyZW1lbnQgPSByZWxhdGl2ZUNvbnRlbnRSaWdodCAtIDQ4O1xyXG4gICAgY29uc3QgcmlnaHRJbmNyZW1lbnQgPSByZWxhdGl2ZUNvbnRlbnRMZWZ0ICsgNDg7XHJcblxyXG4gICAgaWYgKG5leHRJbmRleCA8IGluZGV4KSB7XHJcbiAgICAgIHJldHVybiBNYXRoLm1pbihsZWZ0SW5jcmVtZW50LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5tYXgocmlnaHRJbmNyZW1lbnQsIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbmRleElzSW5SYW5nZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMudGFicy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuZWxlbVNjcm9sbEFyZWEgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2xhdGVYID0gdGhpcy5jYWxjdWxhdGVDdXJyZW50VHJhbnNsYXRlWCgpO1xyXG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICByZXR1cm4gc2Nyb2xsTGVmdCAtIGN1cnJlbnRUcmFuc2xhdGVYO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVDdXJyZW50VHJhbnNsYXRlWCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdHJhbnNmb3JtVmFsdWUgPSB0aGlzLmdldFNjcm9sbENvbnRlbnRTdHlsZVZhbHVlKCd0cmFuc2Zvcm0nKTtcclxuICAgIGlmICh0cmFuc2Zvcm1WYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0cmFuc2Zvcm1WYWx1ZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoZSB0cmFuc2Zvcm0gdmFsdWUgaXMgaW4gZm9ybSBvZiAnbWF0cml4KGEsIGIsIGMsIGQsIHR4LCB0eSknXHJcbiAgICAvLyBnZXQgYWxsIHRoZSBwYXJlbnRoZXNpemVkIHZhbHVlc1xyXG4gICAgY29uc3QgbWF0Y2ggPSAvXFwoKC4rPylcXCkvLmV4ZWModHJhbnNmb3JtVmFsdWUpO1xyXG4gICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXRyaXhQYXJhbXMgPSBtYXRjaFsxXTtcclxuICAgIC8vIHdlIG5lZWQgdmFsdWUgb2YgdHggLT4gdHJhbnNsYXRlWFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgY29uc3QgW2EsIGIsIGMsIGQsIHR4LCB0eV0gPSBtYXRyaXhQYXJhbXMuc3BsaXQoJywnKTtcclxuICAgIHJldHVybiBwYXJzZUZsb2F0KHR4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGVudFN0eWxlVmFsdWUocHJvcE5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZWxlbVNjcm9sbENvbnRlbnQgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pbmplY3RlZFdpbmRvdz8uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1TY3JvbGxDb250ZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2Nyb2xsQ29udGVudFN0eWxlUHJvcGVydHkocHJvcE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1TY3JvbGxDb250ZW50LCBwcm9wTmFtZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kQWRqYWNlbnRUYWJJbmRleENsb3Nlc3RUb0VkZ2UoaW5kZXg6IG51bWJlciwgdGFiRGltZW5zaW9uczogVGFiRGltZW5zaW9ucywgc2Nyb2xsUG9zaXRpb246IG51bWJlciwgYmFyV2lkdGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAvKipcclxuICAgICAqIHRhYnMgYXJlIGxhaWQgb3V0IGluIHRoZSB0YWIgc2Nyb2xsZXIgbGlrZSB0aGlzOlxyXG4gICAgICpcclxuICAgICAqICAgIHNjcm9sbCBwb3NpdGlvblxyXG4gICAgICogICAgKy0tLStcclxuICAgICAqICAgIHwgICB8ICAgYmFyIHdpZHRoXHJcbiAgICAgKiAgICB8ICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xyXG4gICAgICogICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqICAgIHwgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XHJcbiAgICAgKiAgICB8ICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xyXG4gICAgICogICAgdiAgIHwgICAgICAgICAgICAgdGFiIHNjcm9sbGVyICAgICAgICAgIHxcclxuICAgICAqICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLStcclxuICAgICAqICAgIHwgICAgdGFiICAgICB8ICAgICAgdGFiICAgICB8ICAgICAgICB0YWIgICAgICAgIHxcclxuICAgICAqICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLStcclxuICAgICAqICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xyXG4gICAgICpcclxuICAgICAqIHRvIGRldGVybWluZSB0aGUgbmV4dCBhZGphY2VudCBpbmRleCwgd2UgbG9vayBhdCB0aGUgdGFiIHJvb3QgbGVmdCBhbmRcclxuICAgICAqIHRhYiByb290IHJpZ2h0LCBib3RoIHJlbGF0aXZlIHRvIHRoZSBzY3JvbGwgcG9zaXRpb24uIGlmIHRoZSB0YWIgcm9vdFxyXG4gICAgICogbGVmdCBpcyBsZXNzIHRoYW4gMCwgdGhlbiB3ZSBrbm93IGl0J3Mgb3V0IG9mIHZpZXcgdG8gdGhlIGxlZnQuIGlmIHRoZVxyXG4gICAgICogdGFiIHJvb3QgcmlnaHQgbWludXMgdGhlIGJhciB3aWR0aCBpcyBncmVhdGVyIHRoYW4gMCwgd2Uga25vdyB0aGUgdGFiIGlzXHJcbiAgICAgKiBvdXQgb2YgdmlldyB0byB0aGUgcmlnaHQuIGZyb20gdGhlcmUsIHdlIGVpdGhlciBpbmNyZW1lbnQgb3IgZGVjcmVtZW50XHJcbiAgICAgKiB0aGUgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlbGF0aXZlUm9vdExlZnQgPSB0YWJEaW1lbnNpb25zLnJvb3RMZWZ0IC0gc2Nyb2xsUG9zaXRpb247XHJcbiAgICBjb25zdCByZWxhdGl2ZVJvb3RSaWdodCA9IHRhYkRpbWVuc2lvbnMucm9vdFJpZ2h0IC0gc2Nyb2xsUG9zaXRpb24gLSBiYXJXaWR0aDtcclxuICAgIGNvbnN0IHJlbGF0aXZlUm9vdERlbHRhID0gcmVsYXRpdmVSb290TGVmdCArIHJlbGF0aXZlUm9vdFJpZ2h0O1xyXG4gICAgY29uc3QgbGVmdEVkZ2VJc0Nsb3NlciA9IHJlbGF0aXZlUm9vdExlZnQgPCAwIHx8IHJlbGF0aXZlUm9vdERlbHRhIDwgMDtcclxuICAgIGNvbnN0IHJpZ2h0RWRnZUlzQ2xvc2VyID0gcmVsYXRpdmVSb290UmlnaHQgPiAwIHx8IHJlbGF0aXZlUm9vdERlbHRhID4gMDtcclxuXHJcbiAgICBpZiAobGVmdEVkZ2VJc0Nsb3Nlcikge1xyXG4gICAgICByZXR1cm4gaW5kZXggLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyaWdodEVkZ2VJc0Nsb3Nlcikge1xyXG4gICAgICByZXR1cm4gaW5kZXggKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdUeXBlID09PSAnbGVnYWN5J1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYnNcIj5cclxuICAgIDx1bFxyXG4gICAgICByb2xlPVwidGFibGlzdFwiXHJcbiAgICAgIGNsYXNzPVwiZndlLWxlZ2FjeS10YWItYmFyXCJcclxuICAgICAgW2NsYXNzLmZ3ZS1sZWdhY3ktdGFiLWJhci1mdWxsLXdpZHRoXT1cImNvbmZpZz8udGFiQmFyPy5mdWxsV2lkdGhcIlxyXG4gICAgICBbY2xhc3MuZndlLWxlZ2FjeS10YWItaXRlbXMtZXF1YWwtd2lkdGhdPVwiJ2VxdWFsJyA9PT0gY29uZmlnPy50YWJJdGVtcz8uYXBwZWFyYW5jZVwiXHJcbiAgICAgIFtjbGFzcy5md2UtbGVnYWN5LXRhYi1pdGVtcy1maWxsXT1cIidmaWxsJyA9PT0gY29uZmlnPy50YWJJdGVtcz8uYXBwZWFyYW5jZVwiXHJcbiAgICA+XHJcbiAgICAgIDxsaVxyXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYi1pdGVtXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7ICdmd2UtYWN0aXZlJzogdGFiPy5hY3RpdmUsICdmd2UtZGlzYWJsZWQnOiB0YWI/LmRpc2FibGVkIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bGwgPT0gdGFiPy5pY29uXCI+XHJcbiAgICAgICAgICA8YVxyXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidGFiLnBhbmVJZFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidHJ1ZSA9PT0gdGFiPy5hY3RpdmUgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWUgPT09IHRhYj8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYi1saW5rXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcclxuICAgICAgICAgICAgPnt7IHRhYi5uYW1lIH19PC9hXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bGwgIT0gdGFiPy5pY29uXCI+XHJcbiAgICAgICAgICA8YVxyXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidGFiLnBhbmVJZFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidHJ1ZSA9PT0gdGFiPy5hY3RpdmUgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWUgPT09IHRhYj8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYi1saW5rXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmZ3ZS1jYW4tc3dhcC1pY29uXT1cIjIgPT09IHRhYnMubGVuZ3RoICYmIDEgPT09IGlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ2Z3ZS1pY29uICcgKyB0YWIuaWNvblwiPjwvaT5cclxuICAgICAgICAgICAgPHNwYW4+e3sgdGFiLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPGRpdiBjbGFzcz1cImZ3ZS1sZWdhY3ktdGFiLXBhbmVsLWNvbnRlbnRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYlBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdUeXBlICE9PSAnbGVnYWN5J1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJmbmctdGFiLWJhclwiIHJvbGU9XCJ0YWJsaXN0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm5nLXRhYi1zY3JvbGxlclwiICNzY3JvbGxlcj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtYXJlYSBmbmctdGFiLXNjcm9sbGVyLXNjcm9sbC1hcmVhLS1zY3JvbGxcIlxyXG4gICAgICAgIFtjbGFzcy5mbmctdGFiLXNjcm9sbGVyLXNjcm9sbC1hcmVhLS1jb21wYWN0XT1cInVzZUNvbXBhY3REZW5zaXR5XCJcclxuICAgICAgICAjc2Nyb2xsQWVyYVxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZuZy10YWItc2Nyb2xsZXItc2Nyb2xsLWNvbnRlbnRcIiBbY2xhc3MuZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtY29udGVudC0td2l0aC1kaXZpZGVyXT1cInNob3dEaXZpZGVyXCIgI3Njcm9sbENvbnRlbnQ+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZuZy10YWJcIlxyXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidGFiLnBhbmVJZFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidHJ1ZSA9PT0gdGFiPy5hY3RpdmUgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiaSA9PT0gMCA/IDAgOiAtMVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5mbmctdGFiLS1hY3RpdmVdPVwidGFiPy5hY3RpdmVcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZm5nLXRhYi0tZGlzYWJsZWRdPVwidGFiPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVUYWJTY3JvbGwoJGV2ZW50LCBpKTsgc2hvd1RhYlBhbmUodGFiLnBhbmVJZClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZuZy10YWItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm5nLXRhYi10ZXh0LWxhYmVsXCI+e3sgdGFiLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbmctdGFiLWluZGljYXRvclwiIFtjbGFzcy5mbmctdGFiLWluZGljYXRvci0tYWN0aXZlXT1cInRhYj8uYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbmctdGFiLWluZGljYXRvci1jb250ZW50IGZuZy10YWItaW5kaWNhdG9yLWNvbnRlbnQtLXVuZGVybGluZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm5nLXRhYi1zY3JvbGxlci1kaXZpZGVyLWxpbmVcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbmctdGFiLXBhbmVsLWNvbnRlbnRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYlBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0YWJQYW5lbENvbnRlbnQ+XHJcbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=