ngx-sfc-components 0.0.1

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 (232) hide show
  1. package/README.md +685 -0
  2. package/esm2020/lib/components/avatar/avatar.component.mjs +83 -0
  3. package/esm2020/lib/components/avatar/avatar.constants.mjs +9 -0
  4. package/esm2020/lib/components/avatar/models/avatar-data.model.mjs +2 -0
  5. package/esm2020/lib/components/avatar/models/avatar-image.model.mjs +14 -0
  6. package/esm2020/lib/components/avatar/models/avatar-progress.model.mjs +2 -0
  7. package/esm2020/lib/components/avatar/parts/badge/avatar-badge-position.enum.mjs +12 -0
  8. package/esm2020/lib/components/avatar/parts/badge/avatar-badge.component.mjs +88 -0
  9. package/esm2020/lib/components/avatar/parts/badge/avatar-badge.constants.mjs +5 -0
  10. package/esm2020/lib/components/carousel/carousel.component.mjs +230 -0
  11. package/esm2020/lib/components/carousel/carousel.enum.mjs +33 -0
  12. package/esm2020/lib/components/carousel/directive/carousel-slide.directive.mjs +31 -0
  13. package/esm2020/lib/components/carousel/models/dom.model.mjs +2 -0
  14. package/esm2020/lib/components/carousel/models/navigation.model.mjs +2 -0
  15. package/esm2020/lib/components/carousel/models/options.model.mjs +2 -0
  16. package/esm2020/lib/components/carousel/models/slide.model.mjs +3 -0
  17. package/esm2020/lib/components/carousel/parts/stage/carousel-stage.component.mjs +83 -0
  18. package/esm2020/lib/components/carousel/parts/stage/carousel-stage.model.mjs +2 -0
  19. package/esm2020/lib/components/carousel/service/animate/carousel-animate.service.mjs +86 -0
  20. package/esm2020/lib/components/carousel/service/autoplay/carousel-autoplay.service.mjs +129 -0
  21. package/esm2020/lib/components/carousel/service/carousel/carousel-service.constants.mjs +44 -0
  22. package/esm2020/lib/components/carousel/service/carousel/carousel-service.enum.mjs +14 -0
  23. package/esm2020/lib/components/carousel/service/carousel/carousel-service.model.mjs +2 -0
  24. package/esm2020/lib/components/carousel/service/carousel/carousel.service.mjs +697 -0
  25. package/esm2020/lib/components/carousel/service/lazy/carousel-lazy-load.service.mjs +59 -0
  26. package/esm2020/lib/components/carousel/service/navigation/carousel-navigation.service.mjs +211 -0
  27. package/esm2020/lib/components/chart/chart-option.model.mjs +2 -0
  28. package/esm2020/lib/components/chart/chart.component.mjs +124 -0
  29. package/esm2020/lib/components/chart/chart.constants.mjs +95 -0
  30. package/esm2020/lib/components/chart/service/settings/chart-settings.service.mjs +87 -0
  31. package/esm2020/lib/components/chart/service/theme/chart-theme.model.mjs +2 -0
  32. package/esm2020/lib/components/chart/service/theme/chart-theme.service.mjs +25 -0
  33. package/esm2020/lib/components/index.mjs +40 -0
  34. package/esm2020/lib/components/menu/dropdown/dropdown-menu.component.mjs +86 -0
  35. package/esm2020/lib/components/menu/dropdown/parts/item/dropdown-menu-item.component.mjs +26 -0
  36. package/esm2020/lib/components/menu/dropdown/parts/item/dropdown-menu-item.model.mjs +2 -0
  37. package/esm2020/lib/components/menu/navigation/navigation-menu.component.mjs +26 -0
  38. package/esm2020/lib/components/menu/navigation/parts/item/navigation-menu-item.component.mjs +31 -0
  39. package/esm2020/lib/components/menu/navigation/parts/item/navigation-menu-item.model.mjs +2 -0
  40. package/esm2020/lib/components/menu/side/parts/header/side-menu-header.component.mjs +31 -0
  41. package/esm2020/lib/components/menu/side/parts/item/content/side-menu-item-content.component.mjs +56 -0
  42. package/esm2020/lib/components/menu/side/parts/item/side-menu-item.component.mjs +81 -0
  43. package/esm2020/lib/components/menu/side/parts/title/side-menu-title.component.mjs +24 -0
  44. package/esm2020/lib/components/menu/side/side-menu.component.mjs +47 -0
  45. package/esm2020/lib/components/menu/side/side-menu.model.mjs +6 -0
  46. package/esm2020/lib/components/no-export-index.mjs +15 -0
  47. package/esm2020/lib/components/notification/enums/notification-template.enum.mjs +5 -0
  48. package/esm2020/lib/components/notification/enums/notification-type.enum.mjs +7 -0
  49. package/esm2020/lib/components/notification/notification-auto-close.model.mjs +2 -0
  50. package/esm2020/lib/components/notification/notification.component.mjs +67 -0
  51. package/esm2020/lib/components/notification/parts/content/notification-content.component.mjs +33 -0
  52. package/esm2020/lib/components/notification/parts/content/notification-content.model.mjs +2 -0
  53. package/esm2020/lib/components/progress/circle/progress-circle.component.mjs +23 -0
  54. package/esm2020/lib/components/progress/line/progress-line.component.mjs +40 -0
  55. package/esm2020/lib/components/progress/progress-color.enum.mjs +13 -0
  56. package/esm2020/lib/components/progress/progress.component.mjs +50 -0
  57. package/esm2020/lib/components/progress/semi-circle/progress-semi-circle.component.mjs +42 -0
  58. package/esm2020/lib/components/slider/parts/button/slider-button-type.enum.mjs +6 -0
  59. package/esm2020/lib/components/slider/parts/button/slider-button.component.mjs +34 -0
  60. package/esm2020/lib/components/slider/parts/item/slider-item.component.mjs +17 -0
  61. package/esm2020/lib/components/slider/parts/item/slider-item.model.mjs +2 -0
  62. package/esm2020/lib/components/slider/parts/pagination/slider-pagination.component.mjs +29 -0
  63. package/esm2020/lib/components/slider/service/automatic/slider-automatic.service.mjs +35 -0
  64. package/esm2020/lib/components/slider/service/slider/slider-move-type.enum.mjs +7 -0
  65. package/esm2020/lib/components/slider/service/slider/slider-move.event.mjs +2 -0
  66. package/esm2020/lib/components/slider/service/slider/slider-move.model.mjs +2 -0
  67. package/esm2020/lib/components/slider/service/slider/slider.service.mjs +40 -0
  68. package/esm2020/lib/components/slider/slider-type.enum.mjs +6 -0
  69. package/esm2020/lib/components/slider/slider.component.mjs +116 -0
  70. package/esm2020/lib/components/stars/star-type.enum.mjs +9 -0
  71. package/esm2020/lib/components/stars/stars.component.mjs +42 -0
  72. package/esm2020/lib/components/table/enums/table-data-type.enum.mjs +6 -0
  73. package/esm2020/lib/components/table/enums/table-template.enum.mjs +7 -0
  74. package/esm2020/lib/components/table/models/table-pagination.model.mjs +2 -0
  75. package/esm2020/lib/components/table/models/table.model.mjs +2 -0
  76. package/esm2020/lib/components/table/parts/columns/default/default-table-column.component.mjs +24 -0
  77. package/esm2020/lib/components/table/parts/columns/selectable/selectable-table-column.component.mjs +30 -0
  78. package/esm2020/lib/components/table/parts/columns/table-column-type.enum.mjs +8 -0
  79. package/esm2020/lib/components/table/parts/columns/table-column.model.mjs +2 -0
  80. package/esm2020/lib/components/table/parts/content/base-default-table-content.component.mjs +74 -0
  81. package/esm2020/lib/components/table/parts/content/cards/default/default-table-card.component.mjs +14 -0
  82. package/esm2020/lib/components/table/parts/content/rows/default/default-table-row.component.mjs +28 -0
  83. package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row-template.enum.mjs +6 -0
  84. package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.component.mjs +42 -0
  85. package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.mjs +2 -0
  86. package/esm2020/lib/components/table/parts/toggle/columns-toggle.component.mjs +33 -0
  87. package/esm2020/lib/components/table/parts/toggle/columns-toggle.constants.mjs +11 -0
  88. package/esm2020/lib/components/table/parts/toggle/service/columns-toggle.service.mjs +34 -0
  89. package/esm2020/lib/components/table/service/select/table-select.event.mjs +2 -0
  90. package/esm2020/lib/components/table/service/select/table-select.service.mjs +24 -0
  91. package/esm2020/lib/components/table/table.component.mjs +250 -0
  92. package/esm2020/lib/components/table/table.constants.mjs +11 -0
  93. package/esm2020/lib/components/tabs/models/tab.model.mjs +2 -0
  94. package/esm2020/lib/components/tabs/models/tabs-view.model.mjs +2 -0
  95. package/esm2020/lib/components/tabs/parts/labels/tab-label-content-base.component.mjs +29 -0
  96. package/esm2020/lib/components/tabs/parts/labels/tab-label-icon/tab-label-icon.component.mjs +20 -0
  97. package/esm2020/lib/components/tabs/parts/labels/tab-label-line/tab-label-line.component.mjs +13 -0
  98. package/esm2020/lib/components/tabs/parts/sliders/tab-label-icon/tab-label-icon-slider.component.mjs +20 -0
  99. package/esm2020/lib/components/tabs/parts/sliders/tab-label-line/tab-label-line-slider.component.mjs +20 -0
  100. package/esm2020/lib/components/tabs/parts/sliders/tab-slider-base.component.mjs +18 -0
  101. package/esm2020/lib/components/tabs/parts/sliders/tab-slider-context.model.mjs +2 -0
  102. package/esm2020/lib/components/tabs/service/tab.service.mjs +11 -0
  103. package/esm2020/lib/components/tabs/tabs-template.enum.mjs +7 -0
  104. package/esm2020/lib/components/tabs/tabs.component.mjs +69 -0
  105. package/esm2020/lib/components/tags/parts/tag/tag.component.mjs +18 -0
  106. package/esm2020/lib/components/tags/parts/tag/tag.model.mjs +2 -0
  107. package/esm2020/lib/components/tags/tags.component.mjs +18 -0
  108. package/esm2020/lib/components/timeline/parts/item/timeline-item-position.enum.mjs +6 -0
  109. package/esm2020/lib/components/timeline/parts/item/timeline-item.component.mjs +34 -0
  110. package/esm2020/lib/components/timeline/parts/item/timeline-item.model.mjs +2 -0
  111. package/esm2020/lib/components/timeline/timeline.component.mjs +18 -0
  112. package/esm2020/lib/ngx-sfc-components.module.mjs +208 -0
  113. package/esm2020/ngx-sfc-components.mjs +5 -0
  114. package/esm2020/public-api.mjs +6 -0
  115. package/fesm2015/ngx-sfc-components.mjs +4006 -0
  116. package/fesm2015/ngx-sfc-components.mjs.map +1 -0
  117. package/fesm2020/ngx-sfc-components.mjs +3989 -0
  118. package/fesm2020/ngx-sfc-components.mjs.map +1 -0
  119. package/lib/components/avatar/avatar.component.d.ts +42 -0
  120. package/lib/components/avatar/avatar.constants.d.ts +8 -0
  121. package/lib/components/avatar/models/avatar-data.model.d.ts +6 -0
  122. package/lib/components/avatar/models/avatar-image.model.d.ts +12 -0
  123. package/lib/components/avatar/models/avatar-progress.model.d.ts +4 -0
  124. package/lib/components/avatar/parts/badge/avatar-badge-position.enum.d.ts +10 -0
  125. package/lib/components/avatar/parts/badge/avatar-badge.component.d.ts +14 -0
  126. package/lib/components/avatar/parts/badge/avatar-badge.constants.d.ts +4 -0
  127. package/lib/components/carousel/carousel.component.d.ts +62 -0
  128. package/lib/components/carousel/carousel.enum.d.ts +26 -0
  129. package/lib/components/carousel/directive/carousel-slide.directive.d.ts +13 -0
  130. package/lib/components/carousel/models/dom.model.d.ts +7 -0
  131. package/lib/components/carousel/models/navigation.model.d.ts +17 -0
  132. package/lib/components/carousel/models/options.model.d.ts +40 -0
  133. package/lib/components/carousel/models/slide.model.d.ts +28 -0
  134. package/lib/components/carousel/parts/stage/carousel-stage.component.d.ts +30 -0
  135. package/lib/components/carousel/parts/stage/carousel-stage.model.d.ts +7 -0
  136. package/lib/components/carousel/service/animate/carousel-animate.service.d.ts +17 -0
  137. package/lib/components/carousel/service/autoplay/carousel-autoplay.service.d.ts +29 -0
  138. package/lib/components/carousel/service/carousel/carousel-service.constants.d.ts +5 -0
  139. package/lib/components/carousel/service/carousel/carousel-service.enum.d.ts +9 -0
  140. package/lib/components/carousel/service/carousel/carousel-service.model.d.ts +21 -0
  141. package/lib/components/carousel/service/carousel/carousel.service.d.ts +92 -0
  142. package/lib/components/carousel/service/lazy/carousel-lazy-load.service.d.ts +14 -0
  143. package/lib/components/carousel/service/navigation/carousel-navigation.service.d.ts +28 -0
  144. package/lib/components/chart/chart-option.model.d.ts +9 -0
  145. package/lib/components/chart/chart.component.d.ts +38 -0
  146. package/lib/components/chart/chart.constants.d.ts +100 -0
  147. package/lib/components/chart/service/settings/chart-settings.service.d.ts +14 -0
  148. package/lib/components/chart/service/theme/chart-theme.model.d.ts +15 -0
  149. package/lib/components/chart/service/theme/chart-theme.service.d.ts +11 -0
  150. package/lib/components/index.d.ts +56 -0
  151. package/lib/components/menu/dropdown/dropdown-menu.component.d.ts +28 -0
  152. package/lib/components/menu/dropdown/parts/item/dropdown-menu-item.component.d.ts +8 -0
  153. package/lib/components/menu/dropdown/parts/item/dropdown-menu-item.model.d.ts +6 -0
  154. package/lib/components/menu/navigation/navigation-menu.component.d.ts +10 -0
  155. package/lib/components/menu/navigation/parts/item/navigation-menu-item.component.d.ts +9 -0
  156. package/lib/components/menu/navigation/parts/item/navigation-menu-item.model.d.ts +6 -0
  157. package/lib/components/menu/side/parts/header/side-menu-header.component.d.ts +11 -0
  158. package/lib/components/menu/side/parts/item/content/side-menu-item-content.component.d.ts +17 -0
  159. package/lib/components/menu/side/parts/item/side-menu-item.component.d.ts +17 -0
  160. package/lib/components/menu/side/parts/title/side-menu-title.component.d.ts +7 -0
  161. package/lib/components/menu/side/side-menu.component.d.ts +13 -0
  162. package/lib/components/menu/side/side-menu.model.d.ts +15 -0
  163. package/lib/components/no-export-index.d.ts +14 -0
  164. package/lib/components/notification/enums/notification-template.enum.d.ts +3 -0
  165. package/lib/components/notification/enums/notification-type.enum.d.ts +5 -0
  166. package/lib/components/notification/notification-auto-close.model.d.ts +4 -0
  167. package/lib/components/notification/notification.component.d.ts +26 -0
  168. package/lib/components/notification/parts/content/notification-content.component.d.ts +14 -0
  169. package/lib/components/notification/parts/content/notification-content.model.d.ts +8 -0
  170. package/lib/components/progress/circle/progress-circle.component.d.ts +8 -0
  171. package/lib/components/progress/line/progress-line.component.d.ts +17 -0
  172. package/lib/components/progress/progress-color.enum.d.ts +11 -0
  173. package/lib/components/progress/progress.component.d.ts +9 -0
  174. package/lib/components/progress/semi-circle/progress-semi-circle.component.d.ts +16 -0
  175. package/lib/components/slider/parts/button/slider-button-type.enum.d.ts +4 -0
  176. package/lib/components/slider/parts/button/slider-button.component.d.ts +11 -0
  177. package/lib/components/slider/parts/item/slider-item.component.d.ts +7 -0
  178. package/lib/components/slider/parts/item/slider-item.model.d.ts +5 -0
  179. package/lib/components/slider/parts/pagination/slider-pagination.component.d.ts +11 -0
  180. package/lib/components/slider/service/automatic/slider-automatic.service.d.ts +17 -0
  181. package/lib/components/slider/service/slider/slider-move-type.enum.d.ts +5 -0
  182. package/lib/components/slider/service/slider/slider-move.event.d.ts +5 -0
  183. package/lib/components/slider/service/slider/slider-move.model.d.ts +4 -0
  184. package/lib/components/slider/service/slider/slider.service.d.ts +12 -0
  185. package/lib/components/slider/slider-type.enum.d.ts +4 -0
  186. package/lib/components/slider/slider.component.d.ts +45 -0
  187. package/lib/components/stars/star-type.enum.d.ts +7 -0
  188. package/lib/components/stars/stars.component.d.ts +11 -0
  189. package/lib/components/table/enums/table-data-type.enum.d.ts +4 -0
  190. package/lib/components/table/enums/table-template.enum.d.ts +5 -0
  191. package/lib/components/table/models/table-pagination.model.d.ts +5 -0
  192. package/lib/components/table/models/table.model.d.ts +9 -0
  193. package/lib/components/table/parts/columns/default/default-table-column.component.d.ts +8 -0
  194. package/lib/components/table/parts/columns/selectable/selectable-table-column.component.d.ts +10 -0
  195. package/lib/components/table/parts/columns/table-column-type.enum.d.ts +6 -0
  196. package/lib/components/table/parts/columns/table-column.model.d.ts +11 -0
  197. package/lib/components/table/parts/content/base-default-table-content.component.d.ts +27 -0
  198. package/lib/components/table/parts/content/cards/default/default-table-card.component.d.ts +6 -0
  199. package/lib/components/table/parts/content/rows/default/default-table-row.component.d.ts +10 -0
  200. package/lib/components/table/parts/content/rows/expanded/expanded-table-row-template.enum.d.ts +4 -0
  201. package/lib/components/table/parts/content/rows/expanded/expanded-table-row.component.d.ts +16 -0
  202. package/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.d.ts +11 -0
  203. package/lib/components/table/parts/toggle/columns-toggle.component.d.ts +13 -0
  204. package/lib/components/table/parts/toggle/columns-toggle.constants.d.ts +10 -0
  205. package/lib/components/table/parts/toggle/service/columns-toggle.service.d.ts +15 -0
  206. package/lib/components/table/service/select/table-select.event.d.ts +4 -0
  207. package/lib/components/table/service/select/table-select.service.d.ts +11 -0
  208. package/lib/components/table/table.component.d.ts +74 -0
  209. package/lib/components/table/table.constants.d.ts +11 -0
  210. package/lib/components/tabs/models/tab.model.d.ts +7 -0
  211. package/lib/components/tabs/models/tabs-view.model.d.ts +8 -0
  212. package/lib/components/tabs/parts/labels/tab-label-content-base.component.d.ts +9 -0
  213. package/lib/components/tabs/parts/labels/tab-label-icon/tab-label-icon.component.d.ts +9 -0
  214. package/lib/components/tabs/parts/labels/tab-label-line/tab-label-line.component.d.ts +6 -0
  215. package/lib/components/tabs/parts/sliders/tab-label-icon/tab-label-icon-slider.component.d.ts +7 -0
  216. package/lib/components/tabs/parts/sliders/tab-label-line/tab-label-line-slider.component.d.ts +10 -0
  217. package/lib/components/tabs/parts/sliders/tab-slider-base.component.d.ts +8 -0
  218. package/lib/components/tabs/parts/sliders/tab-slider-context.model.d.ts +4 -0
  219. package/lib/components/tabs/service/tab.service.d.ts +6 -0
  220. package/lib/components/tabs/tabs-template.enum.d.ts +5 -0
  221. package/lib/components/tabs/tabs.component.d.ts +26 -0
  222. package/lib/components/tags/parts/tag/tag.component.d.ts +7 -0
  223. package/lib/components/tags/parts/tag/tag.model.d.ts +4 -0
  224. package/lib/components/tags/tags.component.d.ts +7 -0
  225. package/lib/components/timeline/parts/item/timeline-item-position.enum.d.ts +4 -0
  226. package/lib/components/timeline/parts/item/timeline-item.component.d.ts +11 -0
  227. package/lib/components/timeline/parts/item/timeline-item.model.d.ts +10 -0
  228. package/lib/components/timeline/timeline.component.d.ts +7 -0
  229. package/lib/ngx-sfc-components.module.d.ts +49 -0
  230. package/ngx-sfc-components.d.ts +5 -0
  231. package/package.json +50 -0
  232. package/public-api.d.ts +2 -0
@@ -0,0 +1,697 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { CommonConstants, isNumeric } from 'ngx-sfc-common';
3
+ import { Subject } from 'rxjs';
4
+ import { CarouselEventType, CarouselProperty, CarouselState } from '../../carousel.enum';
5
+ import { CarouselServiceConstants } from './carousel-service.constants';
6
+ import { Width } from './carousel-service.enum';
7
+ import * as i0 from "@angular/core";
8
+ export class CarouselService {
9
+ constructor() {
10
+ this._viewSettingsShipper$ = new Subject();
11
+ this._initializedCarousel$ = new Subject();
12
+ this._changeSettingsCarousel$ = new Subject();
13
+ this._changedSettingsCarousel$ = new Subject();
14
+ this._translateCarousel$ = new Subject();
15
+ this._translatedCarousel$ = new Subject();
16
+ this._resizeCarousel$ = new Subject();
17
+ this._resizedCarousel$ = new Subject();
18
+ this._refreshCarousel$ = new Subject();
19
+ this._refreshedCarousel$ = new Subject();
20
+ this.carouselDOMModel = {
21
+ rtl: false,
22
+ isResponsive: false,
23
+ isRefreshed: false,
24
+ isLoaded: false,
25
+ isLoading: false
26
+ };
27
+ this.stageModel = {
28
+ transform: 'translate3d(0px,0px,0px)',
29
+ transition: '0s',
30
+ width: 0,
31
+ paddingL: 0,
32
+ paddingR: 0
33
+ };
34
+ this._items = [];
35
+ this._widths = [];
36
+ this._supress = {};
37
+ this._current = null;
38
+ this._clones = [];
39
+ this._mergers = [];
40
+ this._speed = null;
41
+ this._coordinates = [];
42
+ this._invalidated = {};
43
+ this._states = {
44
+ current: {},
45
+ tags: {
46
+ initializing: [CarouselState.Busy],
47
+ animating: [CarouselState.Busy]
48
+ }
49
+ };
50
+ this._pipe = [
51
+ {
52
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
53
+ run: (cache) => {
54
+ cache.current = this._items && this._items[this.relative(this._current || 0)].id;
55
+ }
56
+ },
57
+ {
58
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
59
+ run: (cache) => {
60
+ const margin = this.settings.margin || CommonConstants.EMPTY_STRING, grid = !this.settings.autoWidth, rtl = this.settings.rtl, css = {
61
+ 'margin-left': rtl ? margin : CommonConstants.EMPTY_STRING,
62
+ 'margin-right': rtl ? CommonConstants.EMPTY_STRING : margin
63
+ };
64
+ if (!grid) {
65
+ this.slidesModel.forEach(slide => {
66
+ slide.marginL = css['margin-left'];
67
+ slide.marginR = css['margin-right'];
68
+ });
69
+ }
70
+ cache.css = css;
71
+ }
72
+ }, {
73
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
74
+ run: (cache) => {
75
+ const width = +(this.width() / (this.settings.items || 0)).toFixed(3) - (this.settings.margin || 0), grid = !this.settings.autoWidth, widths = [];
76
+ let merge = null, iterator = this._items.length;
77
+ cache.items = {
78
+ merge: false,
79
+ width: width
80
+ };
81
+ while (iterator--) {
82
+ merge = this._mergers[iterator];
83
+ merge = this.settings.mergeFit && Math.min(merge, (this.settings.items || 0)) || merge;
84
+ cache.items.merge = merge > 1 || cache.items.merge;
85
+ widths[iterator] = !grid ? this._items[iterator].width ? this._items[iterator].width : width : width * merge;
86
+ }
87
+ this._widths = widths;
88
+ this.slidesModel.forEach((slide, i) => {
89
+ slide.width = this._widths[i];
90
+ slide.marginR = cache.css['margin-right'];
91
+ slide.marginL = cache.css['margin-left'];
92
+ });
93
+ }
94
+ }, {
95
+ filter: [CarouselProperty.Items, CarouselProperty.Settings],
96
+ run: () => {
97
+ const clones = [], items = this._items, settings = this.settings, view = Math.max(settings.items * 2, 4), size = Math.ceil(items.length / 2) * 2;
98
+ let append = [], prepend = [], repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0;
99
+ repeat /= 2;
100
+ while (repeat--) {
101
+ clones.push(this.normalize(clones.length / 2, true));
102
+ append.push({ ...this.slidesModel[clones[clones.length - 1]] });
103
+ clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
104
+ prepend.unshift({ ...this.slidesModel[clones[clones.length - 1]] });
105
+ }
106
+ this._clones = clones;
107
+ append = append.map(slide => {
108
+ slide.id = `${CarouselServiceConstants.CLONE_ID_PREFIX}${slide.id}`;
109
+ slide.isActive = false;
110
+ slide.isCloned = true;
111
+ return slide;
112
+ });
113
+ prepend = prepend.map(slide => {
114
+ slide.id = `${CarouselServiceConstants.CLONE_ID_PREFIX}${slide.id}`;
115
+ slide.isActive = false;
116
+ slide.isCloned = true;
117
+ return slide;
118
+ });
119
+ this.slidesModel = prepend.concat(this.slidesModel).concat(append);
120
+ }
121
+ }, {
122
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
123
+ run: () => {
124
+ const rtl = this.settings.rtl ? 1 : -1, size = this._clones.length + this._items.length, coordinates = [];
125
+ let iterator = -1, previous = 0, current = 0;
126
+ while (++iterator < size) {
127
+ previous = coordinates[iterator - 1] || 0;
128
+ current = this._widths[this.relative(iterator)] + this.settings.margin;
129
+ coordinates.push(previous + current * rtl);
130
+ }
131
+ this._coordinates = coordinates;
132
+ }
133
+ }, {
134
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
135
+ run: () => {
136
+ const padding = this.settings.stagePadding || 0, coordinates = this._coordinates, css = {
137
+ 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
138
+ 'padding-left': padding || '',
139
+ 'padding-right': padding || ''
140
+ };
141
+ this.stageModel.width = css.width;
142
+ this.stageModel.paddingR = css['padding-right'];
143
+ }
144
+ }, {
145
+ filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
146
+ run: (cache) => {
147
+ let current = cache.current ? this.slidesModel.findIndex(slide => slide.id === cache.current) : 0;
148
+ current = Math.max(this.minimum(), Math.min(this.maximum(), current));
149
+ this.reset(current);
150
+ }
151
+ }, {
152
+ filter: [CarouselProperty.Position],
153
+ run: () => {
154
+ this.animate(this.coordinates(this._current));
155
+ }
156
+ }, {
157
+ filter: [CarouselProperty.Width, CarouselProperty.Position, CarouselProperty.Items, CarouselProperty.Settings],
158
+ run: () => {
159
+ const rtl = this.settings.rtl ? 1 : -1, padding = (this.settings.stagePadding || 0) * 2, matches = [];
160
+ let begin, end, inner, outer, i, n;
161
+ begin = this.coordinates(this.current());
162
+ if (typeof begin === 'number') {
163
+ begin += padding;
164
+ }
165
+ else {
166
+ begin = 0;
167
+ }
168
+ end = begin + this.width() * rtl;
169
+ if (rtl === -1 && this.settings.center) {
170
+ const result = this._coordinates.filter(element => {
171
+ return (this.settings.items || 0) % 2 === 1 ? element >= begin : element > begin;
172
+ });
173
+ begin = result.length ? result[result.length - 1] : begin;
174
+ }
175
+ for (i = 0, n = this._coordinates.length; i < n; i++) {
176
+ inner = Math.ceil(this._coordinates[i - 1] || 0);
177
+ outer = Math.ceil(Math.abs(this._coordinates[i]) + padding * rtl);
178
+ if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
179
+ || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
180
+ matches.push(i);
181
+ }
182
+ }
183
+ this.slidesModel.forEach(slide => {
184
+ slide.isActive = false;
185
+ return slide;
186
+ });
187
+ matches.forEach(item => {
188
+ this.slidesModel[item].isActive = true;
189
+ });
190
+ if (this.settings.center) {
191
+ this.slidesModel.forEach(slide => {
192
+ slide.isCentered = false;
193
+ return slide;
194
+ });
195
+ const currentValue = this.current();
196
+ if (currentValue)
197
+ this.slidesModel[currentValue].isCentered = true;
198
+ }
199
+ }
200
+ }
201
+ ];
202
+ this.settings = {
203
+ items: 0
204
+ };
205
+ this.options = {};
206
+ }
207
+ get viewCurrrentSettings() {
208
+ return this._viewSettingsShipper$.asObservable();
209
+ }
210
+ get initializedState() {
211
+ return this._initializedCarousel$.asObservable();
212
+ }
213
+ get changeState() {
214
+ return this._changeSettingsCarousel$.asObservable();
215
+ }
216
+ get changedState() {
217
+ return this._changedSettingsCarousel$.asObservable();
218
+ }
219
+ get translateState() {
220
+ return this._translateCarousel$.asObservable();
221
+ }
222
+ get translatedState() {
223
+ return this._translatedCarousel$.asObservable();
224
+ }
225
+ get resizeState() {
226
+ return this._resizeCarousel$.asObservable();
227
+ }
228
+ get resizedState() {
229
+ return this._resizedCarousel$.asObservable();
230
+ }
231
+ get refreshState() {
232
+ return this._refreshCarousel$.asObservable();
233
+ }
234
+ get refreshedState() {
235
+ return this._refreshedCarousel$.asObservable();
236
+ }
237
+ setup(carouselWidth, slides, options) {
238
+ this.setCarouselWidth(carouselWidth);
239
+ this.setItems(slides);
240
+ this.defineSlidesData();
241
+ this.setOptions(options);
242
+ this.settings = { ...this.options };
243
+ this.setOptionsForViewport();
244
+ this.trigger(CarouselEventType.Change, { property: { name: CarouselProperty.Settings, value: this.settings } });
245
+ this.invalidate(CarouselProperty.Settings);
246
+ this.trigger(CarouselEventType.Changed, { property: { name: CarouselProperty.Settings, value: this.settings } });
247
+ }
248
+ initialize(slides) {
249
+ this.enter(CarouselEventType.Initializing);
250
+ this.carouselDOMModel.rtl = this.settings.rtl || false;
251
+ if (this._mergers.length) {
252
+ this._mergers = [];
253
+ }
254
+ slides.forEach(item => {
255
+ const mergeN = this.settings.merge ? item.dataMerge : 1;
256
+ this._mergers.push(mergeN);
257
+ });
258
+ this._clones = [];
259
+ this.reset(isNumeric(this.settings.startPosition) ? +(this.settings.startPosition || 0) : 0);
260
+ this.invalidate(CarouselProperty.Items);
261
+ this.refresh();
262
+ this.carouselDOMModel.isLoaded = true;
263
+ this.sendChanges();
264
+ this.leave(CarouselEventType.Initializing);
265
+ this.trigger(CarouselEventType.Initialized);
266
+ }
267
+ ;
268
+ sendChanges() {
269
+ this._viewSettingsShipper$.next({
270
+ carouselDOMModel: this.carouselDOMModel,
271
+ stageModel: this.stageModel,
272
+ slidesModel: this.slidesModel,
273
+ navigationModel: this.navigationModel,
274
+ navigationDotsModel: this.navigationDotsModel
275
+ });
276
+ }
277
+ onResize(curWidth) {
278
+ if (this._items.length) {
279
+ this.setCarouselWidth(curWidth);
280
+ this.enter(CarouselEventType.Resizing);
281
+ this.trigger(CarouselEventType.Resize);
282
+ this.invalidate(CarouselProperty.Width);
283
+ this.refresh();
284
+ this.leave(CarouselEventType.Resizing);
285
+ this.trigger(CarouselEventType.Resized);
286
+ }
287
+ }
288
+ is(state) {
289
+ return this._states.current[state] && this._states.current[state] > 0;
290
+ }
291
+ ;
292
+ current(position) {
293
+ if (position === undefined) {
294
+ return this._current;
295
+ }
296
+ if (this._items.length === 0) {
297
+ return undefined;
298
+ }
299
+ position = this.normalize(position);
300
+ if (this._current !== position) {
301
+ this.trigger(CarouselEventType.Change, { property: { name: CarouselProperty.Position, value: position } });
302
+ this._current = position;
303
+ this.invalidate(CarouselProperty.Position);
304
+ this.trigger(CarouselEventType.Changed, { property: { name: CarouselProperty.Position, value: this._current } });
305
+ }
306
+ return this._current;
307
+ }
308
+ relative(position) {
309
+ position -= this._clones.length / 2;
310
+ return this.normalize(position, true);
311
+ }
312
+ maximum(relative = false) {
313
+ const settings = this.settings;
314
+ let maximum = this._coordinates.length, iterator, reciprocalItemsWidth, elementWidth;
315
+ if (settings.loop) {
316
+ maximum = this._clones.length / 2 + this._items.length - 1;
317
+ }
318
+ else if (settings.autoWidth || settings.merge) {
319
+ iterator = this._items.length;
320
+ reciprocalItemsWidth = this.slidesModel[--iterator].width;
321
+ elementWidth = this._width;
322
+ while (iterator--) {
323
+ reciprocalItemsWidth += +this.slidesModel[iterator].width + (this.settings.margin || 0).toString();
324
+ if (reciprocalItemsWidth > elementWidth) {
325
+ break;
326
+ }
327
+ }
328
+ maximum = iterator + 1;
329
+ }
330
+ else if (settings.center) {
331
+ maximum = this._items.length - 1;
332
+ }
333
+ else {
334
+ maximum = this._items.length - (settings.items || 0);
335
+ }
336
+ if (relative) {
337
+ maximum -= this._clones.length / 2;
338
+ }
339
+ return Math.max(maximum, 0);
340
+ }
341
+ minimum(relative = false) {
342
+ return relative ? 0 : this._clones.length / 2;
343
+ }
344
+ items(position) {
345
+ if (position === undefined) {
346
+ return this._items.slice();
347
+ }
348
+ position = this.normalize(position, true);
349
+ return [this._items[position]];
350
+ }
351
+ mergers(position) {
352
+ if (position === undefined) {
353
+ return this._mergers.slice();
354
+ }
355
+ position = this.normalize(position, true);
356
+ return this._mergers[position];
357
+ }
358
+ clones(position) {
359
+ const odd = this._clones.length / 2, even = odd + this._items.length, map = (index) => index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
360
+ if (position === undefined) {
361
+ return this._clones.map((v, i) => map(i));
362
+ }
363
+ return this._clones.map((v, i) => v === position ? map(i) : null).filter(item => item);
364
+ }
365
+ speed(speed) {
366
+ if (speed !== undefined) {
367
+ this._speed = speed;
368
+ }
369
+ return this._speed || 0;
370
+ }
371
+ coordinates(position) {
372
+ let multiplier = 1, newPosition = (position || 0) - 1, coordinate, result;
373
+ if (position === undefined) {
374
+ result = this._coordinates.map((_, index) => {
375
+ return this.coordinates(index);
376
+ });
377
+ return result;
378
+ }
379
+ if (this.settings.center) {
380
+ if (this.settings.rtl) {
381
+ multiplier = -1;
382
+ newPosition = (position || 0) + 1;
383
+ }
384
+ coordinate = this._coordinates[(position || 0)];
385
+ coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
386
+ }
387
+ else {
388
+ coordinate = this._coordinates[newPosition] || 0;
389
+ }
390
+ coordinate = Math.ceil(coordinate);
391
+ return coordinate;
392
+ }
393
+ to(position, speed) {
394
+ let current = this.current(), revert = null, distance = position - this.relative(current || 0), maximum = this.maximum(), delayForLoop = 0;
395
+ const direction = +(distance > 0) - +(distance < 0), items = this._items.length, minimum = this.minimum();
396
+ if (this.settings.loop) {
397
+ if (!this.settings.rewind && Math.abs(distance) > items / 2) {
398
+ distance += direction * -1 * items;
399
+ }
400
+ position = (current || 0) + distance;
401
+ revert = ((position - minimum) % items + items) % items + minimum;
402
+ if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
403
+ current = revert - distance;
404
+ position = revert;
405
+ delayForLoop = 30;
406
+ this.reset(current);
407
+ this.sendChanges();
408
+ }
409
+ }
410
+ else if (this.settings.rewind) {
411
+ maximum += 1;
412
+ position = (position % maximum + maximum) % maximum;
413
+ }
414
+ else {
415
+ position = Math.max(minimum, Math.min(maximum, position));
416
+ }
417
+ setTimeout(() => {
418
+ this.speed(this.duration(current || 0, position, speed));
419
+ this.current(position);
420
+ this.update();
421
+ }, delayForLoop);
422
+ }
423
+ next(speed) {
424
+ speed = speed || false;
425
+ this.to(this.relative(this.current() || 0) + 1, speed);
426
+ }
427
+ previous(speed) {
428
+ speed = speed || false;
429
+ this.to(this.relative(this.current() || 0) - 1, speed);
430
+ }
431
+ onTransitionEnd(event) {
432
+ if (!event) {
433
+ this.leave(CarouselEventType.Animating);
434
+ this.trigger(CarouselEventType.Translated);
435
+ }
436
+ }
437
+ setCurrentSlideClasses(slide) {
438
+ const currentClasses = {
439
+ 'active': slide.isActive || false,
440
+ 'center': slide.isCentered || false,
441
+ 'cloned': slide.isCloned || false,
442
+ 'animated': slide.isAnimated || false,
443
+ 'animated-in': slide.isDefAnimatedIn || false,
444
+ 'animated-out': slide.isDefAnimatedOut || false
445
+ };
446
+ if (this.settings.animateIn) {
447
+ currentClasses[this.settings.animateIn] = slide.isCustomAnimatedIn || false;
448
+ }
449
+ if (this.settings.animateOut) {
450
+ currentClasses[this.settings.animateOut] = slide.isCustomAnimatedOut || false;
451
+ }
452
+ return currentClasses;
453
+ }
454
+ enter(name) {
455
+ [name].concat(this._states.tags[name] || []).forEach((stateName) => {
456
+ if (this._states.current[stateName] === undefined) {
457
+ this._states.current[stateName] = 0;
458
+ }
459
+ this._states.current[stateName]++;
460
+ });
461
+ }
462
+ ;
463
+ leave(name) {
464
+ [name].concat(this._states.tags[name] || []).forEach((stateName) => {
465
+ if (this._states.current[stateName] === 0 || !!this._states.current[stateName]) {
466
+ this._states.current[stateName]--;
467
+ }
468
+ });
469
+ }
470
+ ;
471
+ setOptions(options) {
472
+ this.options = { ...CarouselServiceConstants.DEFAULT_OPTIONS, ...options };
473
+ }
474
+ validateItems(items, skip_validateItems) {
475
+ let result = items;
476
+ if (items > this._items.length && !skip_validateItems) {
477
+ result = this._items.length;
478
+ }
479
+ return result;
480
+ }
481
+ setCarouselWidth(width) {
482
+ this._width = width;
483
+ }
484
+ setOptionsForViewport() {
485
+ const viewport = this._width, overwrites = this.options.responsive || {};
486
+ let match = -1;
487
+ if (!Object.keys(overwrites).length) {
488
+ return;
489
+ }
490
+ if (!viewport) {
491
+ this.settings.items = 1;
492
+ return;
493
+ }
494
+ for (const key in overwrites) {
495
+ if (overwrites.hasOwnProperty(key)) {
496
+ if (+key <= viewport && +key > match) {
497
+ match = Number(key);
498
+ }
499
+ }
500
+ }
501
+ this.settings = { ...this.options, ...overwrites[match], items: (overwrites[match] && overwrites[match].items) ? this.validateItems(overwrites[match].items || 0, this.options.skip_validateItems || false) : this.options.items };
502
+ delete this.settings.responsive;
503
+ this.carouselDOMModel.isResponsive = true;
504
+ const mergers = [];
505
+ this._items.forEach(item => {
506
+ const mergeN = this.settings.merge ? item.dataMerge : 1;
507
+ mergers.push(mergeN);
508
+ });
509
+ this._mergers = mergers;
510
+ this.invalidate(CarouselProperty.Settings);
511
+ }
512
+ optionsLogic() {
513
+ if (this.settings.autoWidth) {
514
+ this.settings.stagePadding = 0;
515
+ this.settings.merge = false;
516
+ }
517
+ }
518
+ update() {
519
+ let i = 0;
520
+ const n = this._pipe.length, filter = (item) => this._invalidated[item], cache = {};
521
+ while (i < n) {
522
+ const filteredPipe = this._pipe[i].filter.filter(filter);
523
+ if (this._invalidated.all || filteredPipe.length > 0) {
524
+ this._pipe[i].run(cache);
525
+ }
526
+ i++;
527
+ }
528
+ this.slidesModel.forEach(slide => slide.classes = this.setCurrentSlideClasses(slide));
529
+ this.sendChanges();
530
+ this._invalidated = {};
531
+ if (!this.is('valid')) {
532
+ this.enter('valid');
533
+ }
534
+ }
535
+ width(dimension) {
536
+ dimension = dimension || Width.Default;
537
+ switch (dimension) {
538
+ case Width.Inner:
539
+ case Width.Outer:
540
+ return this._width;
541
+ default:
542
+ return this._width - (this.settings.stagePadding || 0) * 2 + (this.settings.margin || 0);
543
+ }
544
+ }
545
+ refresh() {
546
+ this.enter(CarouselEventType.Refreshing);
547
+ this.trigger(CarouselEventType.Refresh);
548
+ this.defineSlidesData();
549
+ this.setOptionsForViewport();
550
+ this.optionsLogic();
551
+ this.update();
552
+ this.leave(CarouselEventType.Refreshing);
553
+ this.trigger(CarouselEventType.Refreshed);
554
+ }
555
+ animate(coordinate) {
556
+ const animate = this.speed() > 0;
557
+ if (this.is(CarouselEventType.Animating)) {
558
+ this.onTransitionEnd();
559
+ }
560
+ if (animate) {
561
+ this.enter(CarouselEventType.Animating);
562
+ this.trigger(CarouselEventType.Translate);
563
+ }
564
+ this.stageModel.transform = 'translate3d(' + coordinate + 'px,0px,0px)';
565
+ this.stageModel.transition = (this.speed() / 1000) + 's' + (this.settings.slideTransition ? ' ' + this.settings.slideTransition : '');
566
+ }
567
+ invalidate(part) {
568
+ if (typeof part === 'string') {
569
+ this._invalidated[part] = true;
570
+ if (this.is('valid')) {
571
+ this.leave('valid');
572
+ }
573
+ }
574
+ return Object.keys(this._invalidated);
575
+ }
576
+ ;
577
+ reset(position) {
578
+ position = this.normalize(position);
579
+ if (position === undefined) {
580
+ return;
581
+ }
582
+ this._speed = 0;
583
+ this._current = position;
584
+ this.suppress([CarouselEventType.Translate, CarouselEventType.Translated]);
585
+ this.animate(this.coordinates(position));
586
+ this.release([CarouselEventType.Translate, CarouselEventType.Translated]);
587
+ }
588
+ normalize(position, relative) {
589
+ const n = this._items.length, m = relative ? 0 : this._clones.length;
590
+ if (!isNumeric(position) || n < 1) {
591
+ position = 0;
592
+ }
593
+ else if (position < 0 || position >= n + m) {
594
+ position = ((position - m / 2) % n + n) % n + m / 2;
595
+ }
596
+ return position;
597
+ }
598
+ duration(from, to, factor) {
599
+ if (factor === 0) {
600
+ return 0;
601
+ }
602
+ return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((+factor));
603
+ }
604
+ setItems(content) {
605
+ this._items = content;
606
+ }
607
+ defineSlidesData() {
608
+ let loadMap;
609
+ if (this.slidesModel && this.slidesModel.length) {
610
+ loadMap = new Map();
611
+ this.slidesModel.forEach(item => {
612
+ if (item.load) {
613
+ loadMap.set(item.id, item.load);
614
+ }
615
+ });
616
+ }
617
+ this.slidesModel = this._items.map(slide => {
618
+ return {
619
+ id: `${slide.id}`,
620
+ isActive: false,
621
+ tplRef: slide.tplRef,
622
+ dataMerge: slide.dataMerge,
623
+ width: 0,
624
+ isCloned: false,
625
+ load: loadMap ? loadMap.get(slide.id) : false,
626
+ classes: {}
627
+ };
628
+ });
629
+ }
630
+ op(a, o, b) {
631
+ const rtl = this.settings.rtl;
632
+ switch (o) {
633
+ case '<':
634
+ return rtl ? a > b : a < b;
635
+ case '>':
636
+ return rtl ? a < b : a > b;
637
+ case '>=':
638
+ return rtl ? a <= b : a >= b;
639
+ case '<=':
640
+ return rtl ? a >= b : a <= b;
641
+ default:
642
+ return false;
643
+ }
644
+ }
645
+ trigger(name, data) {
646
+ switch (name) {
647
+ case CarouselEventType.Initialized:
648
+ this._initializedCarousel$.next(name);
649
+ break;
650
+ case CarouselEventType.Change:
651
+ this._changeSettingsCarousel$.next(data);
652
+ break;
653
+ case CarouselEventType.Changed:
654
+ this._changedSettingsCarousel$.next(data);
655
+ break;
656
+ case CarouselEventType.Resize:
657
+ this._resizeCarousel$.next(name);
658
+ break;
659
+ case CarouselEventType.Resized:
660
+ this._resizedCarousel$.next(name);
661
+ break;
662
+ case CarouselEventType.Refresh:
663
+ this._refreshCarousel$.next(name);
664
+ break;
665
+ case CarouselEventType.Refreshed:
666
+ this._refreshedCarousel$.next(name);
667
+ break;
668
+ case CarouselEventType.Translate:
669
+ this._translateCarousel$.next(name);
670
+ break;
671
+ case CarouselEventType.Translated:
672
+ this._translatedCarousel$.next(name);
673
+ break;
674
+ default:
675
+ break;
676
+ }
677
+ }
678
+ suppress(events) {
679
+ events.forEach(event => {
680
+ this._supress[event] = true;
681
+ });
682
+ }
683
+ release(events) {
684
+ events.forEach(event => {
685
+ delete this._supress[event];
686
+ });
687
+ }
688
+ }
689
+ CarouselService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
690
+ CarouselService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, providedIn: 'root' });
691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, decorators: [{
692
+ type: Injectable,
693
+ args: [{
694
+ providedIn: 'root'
695
+ }]
696
+ }] });
697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvc2VydmljZS9jYXJvdXNlbC9jYXJvdXNlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU96RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTWhELE1BQU0sT0FBTyxlQUFlO0lBSDVCO1FBS1UsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFFM0QsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUU5Qyw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBRTlDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFL0Msd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUU1Qyx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRTdDLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFekMsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUUxQyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRTFDLHdCQUFtQixHQUFHLElBQUksT0FBTyxF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aUJBQWlCLENBQUMsU0FBUztnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCLENBQUMsU0FBUztnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCLENBQUMsVUFBVTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtJQUNILENBQUM7SUFFTyxRQUFRLENBQUMsTUFBZ0I7UUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxPQUFPLENBQUMsTUFBZ0I7UUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs0R0FyMkJVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbkNvbnN0YW50cywgaXNOdW1lcmljIH0gZnJvbSAnbmd4LXNmYy1jb21tb24nO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENhcm91c2VsRXZlbnRUeXBlLCBDYXJvdXNlbFByb3BlcnR5LCBDYXJvdXNlbFN0YXRlIH0gZnJvbSAnLi4vLi4vY2Fyb3VzZWwuZW51bSc7XHJcbmltcG9ydCB7IENhcm91c2VsU2xpZGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY2Fyb3VzZWwtc2xpZGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxET01Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kb20ubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbE5hdmlnYXRpb25Eb3RzTW9kZWwsIENhcm91c2VsTmF2aWdhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdmlnYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbE9wdGlvbnNNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9vcHRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxTbGlkZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NsaWRlLm1vZGVsJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxTdGFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vcGFydHMvc3RhZ2UvY2Fyb3VzZWwtc3RhZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbFNlcnZpY2VDb25zdGFudHMgfSBmcm9tICcuL2Nhcm91c2VsLXNlcnZpY2UuY29uc3RhbnRzJztcclxuaW1wb3J0IHsgV2lkdGggfSBmcm9tICcuL2Nhcm91c2VsLXNlcnZpY2UuZW51bSc7XHJcbmltcG9ydCB7IENhcm91c2VsQ3VycmVudERhdGEsIFN0YXRlcyB9IGZyb20gJy4vY2Fyb3VzZWwtc2VydmljZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbFNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIF92aWV3U2V0dGluZ3NTaGlwcGVyJCA9IG5ldyBTdWJqZWN0PENhcm91c2VsQ3VycmVudERhdGE+KCk7XHJcblxyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICBwcml2YXRlIF9jaGFuZ2VTZXR0aW5nc0Nhcm91c2VsJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2hhbmdlZFNldHRpbmdzQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBwcml2YXRlIF90cmFuc2xhdGVDYXJvdXNlbCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgX3RyYW5zbGF0ZWRDYXJvdXNlbCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZUNhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplZENhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVmcmVzaENhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVmcmVzaGVkQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICBwcml2YXRlIGNhcm91c2VsRE9NTW9kZWw6IENhcm91c2VsRE9NTW9kZWwgPSB7XHJcbiAgICBydGw6IGZhbHNlLFxyXG4gICAgaXNSZXNwb25zaXZlOiBmYWxzZSxcclxuICAgIGlzUmVmcmVzaGVkOiBmYWxzZSxcclxuICAgIGlzTG9hZGVkOiBmYWxzZSxcclxuICAgIGlzTG9hZGluZzogZmFsc2VcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHN0YWdlTW9kZWw6IENhcm91c2VsU3RhZ2VNb2RlbCA9IHtcclxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDBweCwwcHgsMHB4KScsXHJcbiAgICB0cmFuc2l0aW9uOiAnMHMnLFxyXG4gICAgd2lkdGg6IDAsXHJcbiAgICBwYWRkaW5nTDogMCxcclxuICAgIHBhZGRpbmdSOiAwXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfd2lkdGghOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2l0ZW1zOiBDYXJvdXNlbFNsaWRlRGlyZWN0aXZlW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfd2lkdGhzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9zdXByZXNzOiBhbnkgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBfY3VycmVudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX2Nsb25lczogYW55W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfbWVyZ2VyczogYW55W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfc3BlZWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9jb29yZGluYXRlczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfaW52YWxpZGF0ZWQ6IGFueSA9IHt9O1xyXG5cclxuICBwcml2YXRlIF9zdGF0ZXM6IFN0YXRlcyA9IHtcclxuICAgIGN1cnJlbnQ6IHt9LFxyXG4gICAgdGFnczoge1xyXG4gICAgICBpbml0aWFsaXppbmc6IFtDYXJvdXNlbFN0YXRlLkJ1c3ldLFxyXG4gICAgICBhbmltYXRpbmc6IFtDYXJvdXNlbFN0YXRlLkJ1c3ldXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfcGlwZTogYW55W10gPSBbXHJcbiAgICB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46IChjYWNoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY2FjaGUuY3VycmVudCA9IHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zW3RoaXMucmVsYXRpdmUodGhpcy5fY3VycmVudCB8fCAwKV0uaWQ7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46IChjYWNoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWFyZ2luID0gdGhpcy5zZXR0aW5ncy5tYXJnaW4gfHwgQ29tbW9uQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgIGdyaWQgPSAhdGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgsXHJcbiAgICAgICAgICBydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCxcclxuICAgICAgICAgIGNzcyA9IHtcclxuICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JzogcnRsID8gbWFyZ2luIDogQ29tbW9uQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgICAgJ21hcmdpbi1yaWdodCc6IHJ0bCA/IENvbW1vbkNvbnN0YW50cy5FTVBUWV9TVFJJTkcgOiBtYXJnaW5cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICghZ3JpZCkge1xyXG4gICAgICAgICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKHNsaWRlID0+IHtcclxuICAgICAgICAgICAgc2xpZGUubWFyZ2luTCA9IGNzc1snbWFyZ2luLWxlZnQnXTtcclxuICAgICAgICAgICAgc2xpZGUubWFyZ2luUiA9IGNzc1snbWFyZ2luLXJpZ2h0J107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhY2hlLmNzcyA9IGNzcztcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoY2FjaGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoOiBhbnkgPSArKHRoaXMud2lkdGgoKSAvICh0aGlzLnNldHRpbmdzLml0ZW1zIHx8IDApKS50b0ZpeGVkKDMpIC0gKHRoaXMuc2V0dGluZ3MubWFyZ2luIHx8IDApLFxyXG4gICAgICAgICAgZ3JpZCA9ICF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxcclxuICAgICAgICAgIHdpZHRocyA9IFtdO1xyXG4gICAgICAgIGxldCBtZXJnZSA9IG51bGwsXHJcbiAgICAgICAgICBpdGVyYXRvciA9IHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgY2FjaGUuaXRlbXMgPSB7XHJcbiAgICAgICAgICBtZXJnZTogZmFsc2UsXHJcbiAgICAgICAgICB3aWR0aDogd2lkdGhcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB3aGlsZSAoaXRlcmF0b3ItLSkge1xyXG4gICAgICAgICAgbWVyZ2UgPSB0aGlzLl9tZXJnZXJzW2l0ZXJhdG9yXTtcclxuICAgICAgICAgIG1lcmdlID0gdGhpcy5zZXR0aW5ncy5tZXJnZUZpdCAmJiBNYXRoLm1pbihtZXJnZSwgKHRoaXMuc2V0dGluZ3MuaXRlbXMgfHwgMCkpIHx8IG1lcmdlO1xyXG4gICAgICAgICAgY2FjaGUuaXRlbXMubWVyZ2UgPSBtZXJnZSA+IDEgfHwgY2FjaGUuaXRlbXMubWVyZ2U7XHJcblxyXG4gICAgICAgICAgd2lkdGhzW2l0ZXJhdG9yXSA9ICFncmlkID8gdGhpcy5faXRlbXNbaXRlcmF0b3JdLndpZHRoID8gdGhpcy5faXRlbXNbaXRlcmF0b3JdLndpZHRoIDogd2lkdGggOiB3aWR0aCAqIG1lcmdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGhzID0gd2lkdGhzO1xyXG5cclxuICAgICAgICB0aGlzLnNsaWRlc01vZGVsLmZvckVhY2goKHNsaWRlLCBpKSA9PiB7XHJcbiAgICAgICAgICBzbGlkZS53aWR0aCA9IHRoaXMuX3dpZHRoc1tpXTtcclxuICAgICAgICAgIHNsaWRlLm1hcmdpblIgPSBjYWNoZS5jc3NbJ21hcmdpbi1yaWdodCddO1xyXG4gICAgICAgICAgc2xpZGUubWFyZ2luTCA9IGNhY2hlLmNzc1snbWFyZ2luLWxlZnQnXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xvbmVzOiBhbnlbXSA9IFtdLFxyXG4gICAgICAgICAgaXRlbXM6IENhcm91c2VsU2xpZGVEaXJlY3RpdmVbXSA9IHRoaXMuX2l0ZW1zLFxyXG4gICAgICAgICAgc2V0dGluZ3M6IGFueSA9IHRoaXMuc2V0dGluZ3MsXHJcbiAgICAgICAgICB2aWV3ID0gTWF0aC5tYXgoc2V0dGluZ3MuaXRlbXMgKiAyLCA0KSxcclxuICAgICAgICAgIHNpemUgPSBNYXRoLmNlaWwoaXRlbXMubGVuZ3RoIC8gMikgKiAyO1xyXG4gICAgICAgIGxldCBhcHBlbmQ6IGFueVtdID0gW10sXHJcbiAgICAgICAgICBwcmVwZW5kOiBhbnlbXSA9IFtdLFxyXG4gICAgICAgICAgcmVwZWF0ID0gc2V0dGluZ3MubG9vcCAmJiBpdGVtcy5sZW5ndGggPyBzZXR0aW5ncy5yZXdpbmQgPyB2aWV3IDogTWF0aC5tYXgodmlldywgc2l6ZSkgOiAwO1xyXG5cclxuICAgICAgICByZXBlYXQgLz0gMjtcclxuXHJcbiAgICAgICAgd2hpbGUgKHJlcGVhdC0tKSB7XHJcbiAgICAgICAgICBjbG9uZXMucHVzaCh0aGlzLm5vcm1hbGl6ZShjbG9uZXMubGVuZ3RoIC8gMiwgdHJ1ZSkpO1xyXG4gICAgICAgICAgYXBwZW5kLnB1c2goeyAuLi50aGlzLnNsaWRlc01vZGVsW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dIH0pO1xyXG4gICAgICAgICAgY2xvbmVzLnB1c2godGhpcy5ub3JtYWxpemUoaXRlbXMubGVuZ3RoIC0gMSAtIChjbG9uZXMubGVuZ3RoIC0gMSkgLyAyLCB0cnVlKSk7XHJcbiAgICAgICAgICBwcmVwZW5kLnVuc2hpZnQoeyAuLi50aGlzLnNsaWRlc01vZGVsW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY2xvbmVzID0gY2xvbmVzO1xyXG5cclxuICAgICAgICBhcHBlbmQgPSBhcHBlbmQubWFwKHNsaWRlID0+IHtcclxuICAgICAgICAgIHNsaWRlLmlkID0gYCR7Q2Fyb3VzZWxTZXJ2aWNlQ29uc3RhbnRzLkNMT05FX0lEX1BSRUZJWH0ke3NsaWRlLmlkfWA7XHJcbiAgICAgICAgICBzbGlkZS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgc2xpZGUuaXNDbG9uZWQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwZW5kID0gcHJlcGVuZC5tYXAoc2xpZGUgPT4ge1xyXG4gICAgICAgICAgc2xpZGUuaWQgPSBgJHtDYXJvdXNlbFNlcnZpY2VDb25zdGFudHMuQ0xPTkVfSURfUFJFRklYfSR7c2xpZGUuaWR9YDtcclxuICAgICAgICAgIHNsaWRlLmlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICBzbGlkZS5pc0Nsb25lZCA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gc2xpZGU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2xpZGVzTW9kZWwgPSBwcmVwZW5kLmNvbmNhdCh0aGlzLnNsaWRlc01vZGVsKS5jb25jYXQoYXBwZW5kKTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXHJcbiAgICAgICAgICBzaXplID0gdGhpcy5fY2xvbmVzLmxlbmd0aCArIHRoaXMuX2l0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgIGNvb3JkaW5hdGVzID0gW107XHJcbiAgICAgICAgbGV0IGl0ZXJhdG9yID0gLTEsXHJcbiAgICAgICAgICBwcmV2aW91cyA9IDAsXHJcbiAgICAgICAgICBjdXJyZW50ID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKCsraXRlcmF0b3IgPCBzaXplKSB7XHJcbiAgICAgICAgICBwcmV2aW91cyA9IGNvb3JkaW5hdGVzW2l0ZXJhdG9yIC0gMV0gfHwgMDtcclxuICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShpdGVyYXRvcildICsgdGhpcy5zZXR0aW5ncy5tYXJnaW47XHJcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKHByZXZpb3VzICsgY3VycmVudCAqIHJ0bCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xyXG4gICAgICB9XHJcbiAgICB9LCB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46ICgpID0+IHtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcgfHwgMCxcclxuICAgICAgICAgIGNvb3JkaW5hdGVzID0gdGhpcy5fY29vcmRpbmF0ZXMsXHJcbiAgICAgICAgICBjc3MgPSB7XHJcbiAgICAgICAgICAgICd3aWR0aCc6IE1hdGguY2VpbChNYXRoLmFicyhjb29yZGluYXRlc1tjb29yZGluYXRlcy5sZW5ndGggLSAxXSkpICsgcGFkZGluZyAqIDIsXHJcbiAgICAgICAgICAgICdwYWRkaW5nLWxlZnQnOiBwYWRkaW5nIHx8ICcnLFxyXG4gICAgICAgICAgICAncGFkZGluZy1yaWdodCc6IHBhZGRpbmcgfHwgJydcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc3RhZ2VNb2RlbC53aWR0aCA9IGNzcy53aWR0aDtcclxuICAgICAgICB0aGlzLnN0YWdlTW9kZWwucGFkZGluZ1IgPSBjc3NbJ3BhZGRpbmctcmlnaHQnXTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoY2FjaGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gY2FjaGUuY3VycmVudCA/IHRoaXMuc2xpZGVzTW9kZWwuZmluZEluZGV4KHNsaWRlID0+IHNsaWRlLmlkID09PSBjYWNoZS5jdXJyZW50KSA6IDA7XHJcbiAgICAgICAgY3VycmVudCA9IE1hdGgubWF4KHRoaXMubWluaW11bSgpLCBNYXRoLm1pbih0aGlzLm1heGltdW0oKSwgY3VycmVudCkpO1xyXG4gICAgICAgIHRoaXMucmVzZXQoY3VycmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHtcclxuICAgICAgZmlsdGVyOiBbQ2Fyb3VzZWxQcm9wZXJ0eS5Qb3NpdGlvbl0sXHJcbiAgICAgIHJ1bjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZSh0aGlzLmNvb3JkaW5hdGVzKHRoaXMuX2N1cnJlbnQpKTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXHJcbiAgICAgICAgICBwYWRkaW5nID0gKHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nIHx8IDApICogMixcclxuICAgICAgICAgIG1hdGNoZXMgPSBbXTtcclxuICAgICAgICBsZXQgYmVnaW46IGFueSwgZW5kLCBpbm5lciwgb3V0ZXIsIGksIG47XHJcblxyXG4gICAgICAgIGJlZ2luID0gdGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGJlZ2luICs9IHBhZGRpbmc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJlZ2luID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVuZCA9IGJlZ2luICsgdGhpcy53aWR0aCgpICogcnRsO1xyXG5cclxuICAgICAgICBpZiAocnRsID09PSAtMSAmJiB0aGlzLnNldHRpbmdzLmNlbnRlcikge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY29vcmRpbmF0ZXMuZmlsdGVyKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuc2V0dGluZ3MuaXRlbXMgfHwgMCkgJSAyID09PSAxID8gZWxlbWVudCA+PSBiZWdpbiA6IGVsZW1lbnQgPiBiZWdpbjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYmVnaW4gPSByZXN1bHQubGVuZ3RoID8gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA6IGJlZ2luO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMCwgbiA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgaW5uZXIgPSBNYXRoLmNlaWwodGhpcy5fY29vcmRpbmF0ZXNbaSAtIDFdIHx8IDApO1xyXG4gICAgICAgICAgb3V0ZXIgPSBNYXRoLmNlaWwoTWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbaV0pICsgcGFkZGluZyAqIHJ0bCk7XHJcblxyXG4gICAgICAgICAgaWYgKCh0aGlzLm9wKGlubmVyLCAnPD0nLCBiZWdpbikgJiYgKHRoaXMub3AoaW5uZXIsICc+JywgZW5kKSkpXHJcbiAgICAgICAgICAgIHx8ICh0aGlzLm9wKG91dGVyLCAnPCcsIGJlZ2luKSAmJiB0aGlzLm9wKG91dGVyLCAnPicsIGVuZCkpKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2xpZGVzTW9kZWwuZm9yRWFjaChzbGlkZSA9PiB7XHJcbiAgICAgICAgICBzbGlkZS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1hdGNoZXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWxbaXRlbV0uaXNBY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5jZW50ZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWwuZm9yRWFjaChzbGlkZSA9PiB7XHJcbiAgICAgICAgICAgIHNsaWRlLmlzQ2VudGVyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmN1cnJlbnQoKTtcclxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUpXHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWxbY3VycmVudFZhbHVlXS5pc0NlbnRlcmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBdO1xyXG5cclxuICBzZXR0aW5nczogQ2Fyb3VzZWxPcHRpb25zTW9kZWwgPSB7XHJcbiAgICBpdGVtczogMFxyXG4gIH07XHJcblxyXG4gIHNsaWRlc01vZGVsITogQ2Fyb3VzZWxTbGlkZU1vZGVsW107XHJcblxyXG4gIG5hdmlnYXRpb25Nb2RlbCE6IENhcm91c2VsTmF2aWdhdGlvbk1vZGVsO1xyXG5cclxuICBuYXZpZ2F0aW9uRG90c01vZGVsITogQ2Fyb3VzZWxOYXZpZ2F0aW9uRG90c01vZGVsO1xyXG5cclxuICBvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCA9IHt9O1xyXG5cclxuICBnZXQgdmlld0N1cnJyZW50U2V0dGluZ3MoKTogT2JzZXJ2YWJsZTxDYXJvdXNlbEN1cnJlbnREYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlld1NldHRpbmdzU2hpcHBlciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5pdGlhbGl6ZWRTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkQ2Fyb3VzZWwkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgfVxyXG5cclxuICBnZXQgY2hhbmdlU3RhdGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VTZXR0aW5nc0Nhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGFuZ2VkU3RhdGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkU2V0dGluZ3NDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhbnNsYXRlU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhbnNsYXRlZFN0YXRlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlZENhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNpemVTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc2l6ZUNhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNpemVkU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZXNpemVkQ2Fyb3VzZWwkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZnJlc2hTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVmcmVzaGVkU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWZyZXNoZWRDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBzZXR1cChjYXJvdXNlbFdpZHRoOiBudW1iZXIsIHNsaWRlczogQ2Fyb3VzZWxTbGlkZURpcmVjdGl2ZVtdLCBvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCkge1xyXG4gICAgdGhpcy5zZXRDYXJvdXNlbFdpZHRoKGNhcm91c2VsV2lkdGgpO1xyXG4gICAgdGhpcy5zZXRJdGVtcyhzbGlkZXMpO1xyXG4gICAgdGhpcy5kZWZpbmVTbGlkZXNEYXRhKCk7XHJcbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5vcHRpb25zIH07XHJcblxyXG4gICAgdGhpcy5zZXRPcHRpb25zRm9yVmlld3BvcnQoKTtcclxuXHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuQ2hhbmdlLCB7IHByb3BlcnR5OiB7IG5hbWU6IENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3MsIHZhbHVlOiB0aGlzLnNldHRpbmdzIH0gfSk7XHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5TZXR0aW5ncyk7XHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuQ2hhbmdlZCwgeyBwcm9wZXJ0eTogeyBuYW1lOiBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzLCB2YWx1ZTogdGhpcy5zZXR0aW5ncyB9IH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZShzbGlkZXM6IENhcm91c2VsU2xpZGVEaXJlY3RpdmVbXSkge1xyXG4gICAgdGhpcy5lbnRlcihDYXJvdXNlbEV2ZW50VHlwZS5Jbml0aWFsaXppbmcpO1xyXG5cclxuICAgIHRoaXMuY2Fyb3VzZWxET01Nb2RlbC5ydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCB8fCBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fbWVyZ2Vycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbWVyZ2VycyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNsaWRlcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCBtZXJnZU46IG51bWJlciA9IHRoaXMuc2V0dGluZ3MubWVyZ2UgPyBpdGVtLmRhdGFNZXJnZSA6IDE7XHJcbiAgICAgIHRoaXMuX21lcmdlcnMucHVzaChtZXJnZU4pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9jbG9uZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnJlc2V0KGlzTnVtZXJpYyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24pID8gKyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24gfHwgMCkgOiAwKTtcclxuXHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5JdGVtcyk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuXHJcbiAgICB0aGlzLmNhcm91c2VsRE9NTW9kZWwuaXNMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLkluaXRpYWxpemluZyk7XHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuSW5pdGlhbGl6ZWQpO1xyXG4gIH07XHJcblxyXG4gIHNlbmRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5fdmlld1NldHRpbmdzU2hpcHBlciQubmV4dCh7XHJcbiAgICAgIGNhcm91c2VsRE9NTW9kZWw6IHRoaXMuY2Fyb3VzZWxET01Nb2RlbCxcclxuICAgICAgc3RhZ2VNb2RlbDogdGhpcy5zdGFnZU1vZGVsLFxyXG4gICAgICBzbGlkZXNNb2RlbDogdGhpcy5zbGlkZXNNb2RlbCxcclxuICAgICAgbmF2aWdhdGlvbk1vZGVsOiB0aGlzLm5hdmlnYXRpb25Nb2RlbCxcclxuICAgICAgbmF2aWdhdGlvbkRvdHNNb2RlbDogdGhpcy5uYXZpZ2F0aW9uRG90c01vZGVsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplKGN1cldpZHRoOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZXRDYXJvdXNlbFdpZHRoKGN1cldpZHRoKTtcclxuICAgICAgdGhpcy5lbnRlcihDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemUpO1xyXG4gICAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5XaWR0aCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLlJlc2l6aW5nKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlc2l6ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXMoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9zdGF0ZXMuY3VycmVudCBhcyBhbnkpW3N0YXRlXSAmJiAodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZV0gPiAwO1xyXG4gIH07XHJcblxyXG4gIGN1cnJlbnQocG9zaXRpb24/OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQgYXMgbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uKTtcclxuXHJcbiAgICBpZiAodGhpcy5fY3VycmVudCAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLkNoYW5nZSwgeyBwcm9wZXJ0eTogeyBuYW1lOiBDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uLCB2YWx1ZTogcG9zaXRpb24gfSB9KTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJlbnQgPSBwb3NpdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuaW52YWxpZGF0ZShDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLkNoYW5nZWQsIHsgcHJvcGVydHk6IHsgbmFtZTogQ2Fyb3VzZWxQcm9wZXJ0eS5Qb3NpdGlvbiwgdmFsdWU6IHRoaXMuX2N1cnJlbnQgfSB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcclxuICB9XHJcblxyXG4gIHJlbGF0aXZlKHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcG9zaXRpb24gLT0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDI7XHJcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgbWF4aW11bShyZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcclxuICAgIGxldCBtYXhpbXVtID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLFxyXG4gICAgICBpdGVyYXRvcixcclxuICAgICAgcmVjaXByb2NhbEl0ZW1zV2lkdGgsXHJcbiAgICAgIGVsZW1lbnRXaWR0aDtcclxuXHJcbiAgICBpZiAoc2V0dGluZ3MubG9vcCkge1xyXG4gICAgICBtYXhpbXVtID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIgKyB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdXRvV2lkdGggfHwgc2V0dGluZ3MubWVyZ2UpIHtcclxuICAgICAgaXRlcmF0b3IgPSB0aGlzLl9pdGVtcy5sZW5ndGg7XHJcbiAgICAgIHJlY2lwcm9jYWxJdGVtc1dpZHRoID0gdGhpcy5zbGlkZXNNb2RlbFstLWl0ZXJhdG9yXS53aWR0aDtcclxuICAgICAgZWxlbWVudFdpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgICAgIHdoaWxlIChpdGVyYXRvci0tKSB7XHJcbiAgICAgICAgcmVjaXByb2NhbEl0ZW1zV2lkdGggKz0gKyh0aGlzLnNsaWRlc01vZGVsW2l0ZXJhdG9yXS53aWR0aCBhcyBzdHJpbmcpICsgKHRoaXMuc2V0dGluZ3MubWFyZ2luIHx8IDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKChyZWNpcHJvY2FsSXRlbXNXaWR0aCBhcyBudW1iZXIpID4gZWxlbWVudFdpZHRoKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbWF4aW11bSA9IGl0ZXJhdG9yICsgMTtcclxuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuY2VudGVyKSB7XHJcbiAgICAgIG1heGltdW0gPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWF4aW11bSA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIChzZXR0aW5ncy5pdGVtcyB8fCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgbWF4aW11bSAtPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4aW11bSwgMCk7XHJcbiAgfVxyXG5cclxuICBtaW5pbXVtKHJlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlbGF0aXZlID8gMCA6IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyO1xyXG4gIH1cclxuXHJcbiAgaXRlbXMocG9zaXRpb24/OiBudW1iZXIpOiBDYXJvdXNlbFNsaWRlRGlyZWN0aXZlW10ge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zW3Bvc2l0aW9uXV07XHJcbiAgfVxyXG5cclxuICBtZXJnZXJzKHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIgfCBudW1iZXJbXSB7XHJcbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbWVyZ2Vycy5zbGljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21lcmdlcnNbcG9zaXRpb25dO1xyXG4gIH1cclxuXHJcbiAgY2xvbmVzKHBvc2l0aW9uPzogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3Qgb2RkID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIsXHJcbiAgICAgIGV2ZW4gPSBvZGQgKyB0aGlzLl9pdGVtcy5sZW5ndGgsXHJcbiAgICAgIG1hcCA9IChpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIDIgPT09IDAgPyBldmVuICsgaW5kZXggLyAyIDogb2RkIC0gKGluZGV4ICsgMSkgLyAyO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jbG9uZXMubWFwKCh2LCBpKSA9PiBtYXAoaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jbG9uZXMubWFwKCh2LCBpKSA9PiB2ID09PSBwb3NpdGlvbiA/IG1hcChpKSA6IG51bGwpLmZpbHRlcihpdGVtID0+IGl0ZW0pIGFzIG51bWJlcltdO1xyXG4gIH1cclxuXHJcbiAgc3BlZWQoc3BlZWQ/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHNwZWVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc3BlZWQgPSBzcGVlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fc3BlZWQgfHwgMDtcclxuICB9XHJcblxyXG4gIGNvb3JkaW5hdGVzKHBvc2l0aW9uOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVtYmVyW10ge1xyXG4gICAgbGV0IG11bHRpcGxpZXIgPSAxLFxyXG4gICAgICBuZXdQb3NpdGlvbiA9IChwb3NpdGlvbiB8fCAwKSAtIDEsXHJcbiAgICAgIGNvb3JkaW5hdGUsXHJcbiAgICAgIHJlc3VsdDogbnVtYmVyW107XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5fY29vcmRpbmF0ZXMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVzKGluZGV4KSBhcyBudW1iZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNlbnRlcikge1xyXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5ydGwpIHtcclxuICAgICAgICBtdWx0aXBsaWVyID0gLTE7XHJcbiAgICAgICAgbmV3UG9zaXRpb24gPSAocG9zaXRpb24gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbKHBvc2l0aW9uIHx8IDApXTtcclxuICAgICAgY29vcmRpbmF0ZSArPSAodGhpcy53aWR0aCgpIC0gY29vcmRpbmF0ZSArICh0aGlzLl9jb29yZGluYXRlc1tuZXdQb3NpdGlvbl0gfHwgMCkpIC8gMiAqIG11bHRpcGxpZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbbmV3UG9zaXRpb25dIHx8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29vcmRpbmF0ZSA9IE1hdGguY2VpbChjb29yZGluYXRlKTtcclxuXHJcbiAgICByZXR1cm4gY29vcmRpbmF0ZTtcclxuICB9XHJcblxyXG4gIHRvKHBvc2l0aW9uOiBudW1iZXIsIHNwZWVkOiBudW1iZXIgfCBib29sZWFuKSB7XHJcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuY3VycmVudCgpLFxyXG4gICAgICByZXZlcnQgPSBudWxsLFxyXG4gICAgICBkaXN0YW5jZSA9IHBvc2l0aW9uIC0gdGhpcy5yZWxhdGl2ZShjdXJyZW50IHx8IDApLFxyXG4gICAgICBtYXhpbXVtID0gdGhpcy5tYXhpbXVtKCksXHJcbiAgICAgIGRlbGF5Rm9yTG9vcCA9IDA7XHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSArKGRpc3RhbmNlID4gMCkgLSArKGRpc3RhbmNlIDwgMCksXHJcbiAgICAgIGl0ZW1zID0gdGhpcy5faXRlbXMubGVuZ3RoLFxyXG4gICAgICBtaW5pbXVtID0gdGhpcy5taW5pbXVtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubG9vcCkge1xyXG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3MucmV3aW5kICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGl0ZW1zIC8gMikge1xyXG4gICAgICAgIGRpc3RhbmNlICs9IGRpcmVjdGlvbiAqIC0xICogaXRlbXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBvc2l0aW9uID0gKGN1cnJlbnQgfHwgMCkgKyBkaXN0YW5jZTtcclxuICAgICAgcmV2ZXJ0ID0gKChwb3NpdGlvbiAtIG1pbmltdW0pICUgaXRlbXMgKyBpdGVtcykgJSBpdGVtcyArIG1pbmltdW07XHJcblxyXG4gICAgICBpZiAocmV2ZXJ0ICE9PSBwb3NpdGlvbiAmJiByZXZlcnQgLSBkaXN0YW5jZSA8PSBtYXhpbXVtICYmIHJldmVydCAtIGRpc3RhbmNlID4gMCkge1xyXG4gICAgICAgIGN1cnJlbnQgPSByZXZlcnQgLSBkaXN0YW5jZTtcclxuICAgICAgICBwb3NpdGlvbiA9IHJldmVydDtcclxuICAgICAgICBkZWxheUZvckxvb3AgPSAzMDtcclxuICAgICAgICB0aGlzLnJlc2V0KGN1cnJlbnQpO1xyXG4gICAgICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLnJld2luZCkge1xyXG4gICAgICBtYXhpbXVtICs9IDE7XHJcbiAgICAgIHBvc2l0aW9uID0gKHBvc2l0aW9uICUgbWF4aW11bSArIG1heGltdW0pICUgbWF4aW11bTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvc2l0aW9uID0gTWF0aC5tYXgobWluaW11bSwgTWF0aC5taW4obWF4aW11bSwgcG9zaXRpb24pKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zcGVlZCh0aGlzLmR1cmF0aW9uKGN1cnJlbnQgfHwgMCwgcG9zaXRpb24sIHNwZWVkKSk7XHJcbiAgICAgIHRoaXMuY3VycmVudChwb3NpdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSwgZGVsYXlGb3JMb29wKTtcclxuICB9XHJcblxyXG4gIG5leHQoc3BlZWQ6IG51bWJlciB8IGJvb2xlYW4pIHtcclxuICAgIHNwZWVkID0gc3BlZWQgfHwgZmFsc2U7XHJcbiAgICB0aGlzLnRvKHRoaXMucmVsYXRpdmUodGhpcy5jdXJyZW50KCkgfHwgMCkgKyAxLCBzcGVlZCk7XHJcbiAgfVxyXG5cclxuICBwcmV2aW91cyhzcGVlZDogbnVtYmVyIHwgYm9vbGVhbikge1xyXG4gICAgc3BlZWQgPSBzcGVlZCB8fCBmYWxzZTtcclxuICAgIHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSB8fCAwKSAtIDEsIHNwZWVkKTtcclxuICB9XHJcblxyXG4gIG9uVHJhbnNpdGlvbkVuZChldmVudD86IGFueSkge1xyXG4gICAgaWYgKCFldmVudCkge1xyXG4gICAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEN1cnJlbnRTbGlkZUNsYXNzZXMoc2xpZGU6IENhcm91c2VsU2xpZGVNb2RlbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHtcclxuICAgICAgJ2FjdGl2ZSc6IHNsaWRlLmlzQWN0aXZlIHx8IGZhbHNlLFxyXG4gICAgICAnY2VudGVyJzogc2xpZGUuaXNDZW50ZXJlZCB8fCBmYWxzZSxcclxuICAgICAgJ2Nsb25lZCc6IHNsaWRlLmlzQ2xvbmVkIHx8IGZhbHNlLFxyXG4gICAgICAnYW5pbWF0ZWQnOiBzbGlkZS5pc0FuaW1hdGVkIHx8IGZhbHNlLFxyXG4gICAgICAnYW5pbWF0ZWQtaW4nOiBzbGlkZS5pc0RlZkFuaW1hdGVkSW4gfHwgZmFsc2UsXHJcbiAgICAgICdhbmltYXRlZC1vdXQnOiBzbGlkZS5pc0RlZkFuaW1hdGVkT3V0IHx8IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuYW5pbWF0ZUluKSB7XHJcbiAgICAgIGN1cnJlbnRDbGFzc2VzW3RoaXMuc2V0dGluZ3MuYW5pbWF0ZUluIGFzIHN0cmluZ10gPSBzbGlkZS5pc0N1c3RvbUFuaW1hdGVkSW4gfHwgZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5hbmltYXRlT3V0KSB7XHJcbiAgICAgIGN1cnJlbnRDbGFzc2VzW3RoaXMuc2V0dGluZ3MuYW5pbWF0ZU91dCBhcyBzdHJpbmddID0gc2xpZGUuaXNDdXN0b21BbmltYXRlZE91dCB8fCBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Q2xhc3NlcztcclxuICB9XHJcblxyXG4gIGVudGVyKG5hbWU6IHN0cmluZykge1xyXG4gICAgW25hbWVdLmNvbmNhdCh0aGlzLl9zdGF0ZXMudGFnc1tuYW1lXSB8fCBbXSkuZm9yRWFjaCgoc3RhdGVOYW1lKSA9PiB7XHJcbiAgICAgIGlmICgodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgKHRoaXMuX3N0YXRlcy5jdXJyZW50IGFzIGFueSlbc3RhdGVOYW1lXSsrO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgbGVhdmUobmFtZTogc3RyaW5nKSB7XHJcbiAgICBbbmFtZV0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW25hbWVdIHx8IFtdKS5mb3JFYWNoKChzdGF0ZU5hbWUpID0+IHtcclxuICAgICAgaWYgKCh0aGlzLl9zdGF0ZXMuY3VycmVudCBhcyBhbnkpW3N0YXRlTmFtZV0gPT09IDAgfHwgISEodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdKSB7XHJcbiAgICAgICAgKHRoaXMuX3N0YXRlcy5jdXJyZW50IGFzIGFueSlbc3RhdGVOYW1lXS0tO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc2V0T3B0aW9ucyhvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0geyAuLi5DYXJvdXNlbFNlcnZpY2VDb25zdGFudHMuREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRlSXRlbXMoaXRlbXM6IG51bWJlciwgc2tpcF92YWxpZGF0ZUl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IGl0ZW1zO1xyXG5cclxuICAgIGlmIChpdGVtcyA+IHRoaXMuX2l0ZW1zLmxlbmd0aCAmJiAhc2tpcF92YWxpZGF0ZUl0ZW1zKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDYXJvdXNlbFdpZHRoKHdpZHRoOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE9wdGlvbnNGb3JWaWV3cG9ydCgpIHtcclxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fd2lkdGgsXHJcbiAgICAgIG92ZXJ3cml0ZXMgPSB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSB8fCB7fTtcclxuICAgIGxldCBtYXRjaCA9IC0xO1xyXG5cclxuICAgIGlmICghT2JqZWN0LmtleXMob3ZlcndyaXRlcykubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXZpZXdwb3J0KSB7XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuaXRlbXMgPSAxO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcndyaXRlcykge1xyXG4gICAgICBpZiAob3ZlcndyaXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgaWYgKCtrZXkgPD0gdmlld3BvcnQgJiYgK2tleSA+IG1hdGNoKSB7XHJcbiAgICAgICAgICBtYXRjaCA9IE51bWJlcihrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ub3ZlcndyaXRlc1ttYXRjaF0sIGl0ZW1zOiAob3ZlcndyaXRlc1ttYXRjaF0gJiYgb3ZlcndyaXRlc1ttYXRjaF0uaXRlbXMpID8gdGhpcy52YWxpZGF0ZUl0ZW1zKG92ZXJ3cml0ZXNbbWF0Y2hdLml0ZW1zIHx8IDAsIHRoaXMub3B0aW9ucy5za2lwX3ZhbGlkYXRlSXRlbXMgfHwgZmFsc2UpIDogdGhpcy5vcHRpb25zLml0ZW1zIH07XHJcblxyXG4gICAgZGVsZXRlIHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZTtcclxuICAgIHRoaXMuY2Fyb3VzZWxET01Nb2RlbC5pc1Jlc3BvbnNpdmUgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IG1lcmdlcnM6IGFueVtdID0gW107XHJcbiAgICB0aGlzLl9pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCBtZXJnZU46IG51bWJlciA9IHRoaXMuc2V0dGluZ3MubWVyZ2UgPyBpdGVtLmRhdGFNZXJnZSA6IDE7XHJcbiAgICAgIG1lcmdlcnMucHVzaChtZXJnZU4pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXJnZXJzID0gbWVyZ2VycztcclxuXHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5TZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wdGlvbnNMb2dpYygpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCkge1xyXG4gICAgICB0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyA9IDA7XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MubWVyZ2UgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbiA9IHRoaXMuX3BpcGUubGVuZ3RoLFxyXG4gICAgICBmaWx0ZXIgPSAoaXRlbTogc3RyaW5nIHwgbnVtYmVyKSA9PiB0aGlzLl9pbnZhbGlkYXRlZFtpdGVtXSxcclxuICAgICAgY2FjaGUgPSB7fTtcclxuXHJcbiAgICB3aGlsZSAoaSA8IG4pIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWRQaXBlID0gdGhpcy5fcGlwZVtpXS5maWx0ZXIuZmlsdGVyKGZpbHRlcik7XHJcbiAgICAgIGlmICh0aGlzLl9pbnZhbGlkYXRlZC5hbGwgfHwgZmlsdGVyZWRQaXBlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl9waXBlW2ldLnJ1bihjYWNoZSk7XHJcbiAgICAgIH1cclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKHNsaWRlID0+IHNsaWRlLmNsYXNzZXMgPSB0aGlzLnNldEN1cnJlbnRTbGlkZUNsYXNzZXMoc2xpZGUpKTtcclxuICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLl9pbnZhbGlkYXRlZCA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5pcygndmFsaWQnKSkge1xyXG4gICAgICB0aGlzLmVudGVyKCd2YWxpZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3aWR0aChkaW1lbnNpb24/OiBXaWR0aCk6IG51bWJlciB7XHJcbiAgICBkaW1lbnNpb24gPSBkaW1lbnNpb24gfHwgV2lkdGguRGVmYXVsdDtcclxuICAgIHN3aXRjaCAoZGltZW5zaW9uKSB7XHJcbiAgICAgIGNhc2UgV2lkdGguSW5uZXI6XHJcbiAgICAgIGNhc2UgV2lkdGguT3V0ZXI6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCAtICh0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyB8fCAwKSAqIDIgKyAodGhpcy5zZXR0aW5ncy5tYXJnaW4gfHwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2goKSB7XHJcbiAgICB0aGlzLmVudGVyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hpbmcpO1xyXG4gICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2gpO1xyXG4gICAgdGhpcy5kZWZpbmVTbGlkZXNEYXRhKCk7XHJcbiAgICB0aGlzLnNldE9wdGlvbnNGb3JWaWV3cG9ydCgpO1xyXG4gICAgdGhpcy5vcHRpb25zTG9naWMoKTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hpbmcpO1xyXG4gICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFuaW1hdGUoY29vcmRpbmF0ZTogbnVtYmVyIHwgbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGFuaW1hdGUgPSB0aGlzLnNwZWVkKCkgPiAwO1xyXG5cclxuICAgIGlmICh0aGlzLmlzKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZykpIHtcclxuICAgICAgdGhpcy5vblRyYW5zaXRpb25FbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYW5pbWF0ZSkge1xyXG4gICAgICB0aGlzLmVudGVyKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhZ2VNb2RlbC50cmFuc2Zvcm0gPSAndHJhbnNsYXRlM2QoJyArIGNvb3JkaW5hdGUgKyAncHgsMHB4LDBweCknO1xyXG4gICAgdGhpcy5zdGFnZU1vZGVsLnRyYW5zaXRpb24gPSAodGhpcy5zcGVlZCgpIC8gMTAwMCkgKyAncycgKyAoXHJcbiAgICAgIHRoaXMuc2V0dGluZ3Muc2xpZGVUcmFuc2l0aW9uID8gJyAnICsgdGhpcy5zZXR0aW5ncy5zbGlkZVRyYW5zaXRpb24gOiAnJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52YWxpZGF0ZShwYXJ0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRhdGVkW3BhcnRdID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuaXMoJ3ZhbGlkJykpIHsgdGhpcy5sZWF2ZSgndmFsaWQnKTsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ludmFsaWRhdGVkKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHJlc2V0KHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24pO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zcGVlZCA9IDA7XHJcbiAgICB0aGlzLl9jdXJyZW50ID0gcG9zaXRpb247XHJcblxyXG4gICAgdGhpcy5zdXBwcmVzcyhbQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlLCBDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGVkXSk7XHJcblxyXG4gICAgdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMocG9zaXRpb24pKTtcclxuXHJcbiAgICB0aGlzLnJlbGVhc2UoW0Nhcm91c2VsRXZlbnRUeXBlLlRyYW5zbGF0ZSwgQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlZF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemUocG9zaXRpb246IG51bWJlciwgcmVsYXRpdmU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLl9pdGVtcy5sZW5ndGgsXHJcbiAgICAgIG0gPSByZWxhdGl2ZSA/IDAgOiB0aGlzLl9jbG9uZXMubGVuZ3RoO1xyXG5cclxuICAgIGlmICghaXNOdW1lcmljKHBvc2l0aW9uKSB8fCBuIDwgMSkge1xyXG4gICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBuICsgbSkge1xyXG4gICAgICBwb3NpdGlvbiA9ICgocG9zaXRpb24gLSBtIC8gMikgJSBuICsgbikgJSBuICsgbSAvIDI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkdXJhdGlvbihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIGZhY3Rvcj86IG51bWJlciB8IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGZhY3RvciA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnModG8gLSBmcm9tKSwgMSksIDYpICogTWF0aC5hYnMoKCsoZmFjdG9yIGFzIGFueSkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SXRlbXMoY29udGVudDogQ2Fyb3VzZWxTbGlkZURpcmVjdGl2ZVtdKSB7XHJcbiAgICB0aGlzLl9pdGVtcyA9IGNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZmluZVNsaWRlc0RhdGEoKSB7XHJcbiAgICBsZXQgbG9hZE1hcDogTWFwPHN0cmluZywgYm9vbGVhbj47XHJcblxyXG4gICAgaWYgKHRoaXMuc2xpZGVzTW9kZWwgJiYgdGhpcy5zbGlkZXNNb2RlbC5sZW5ndGgpIHtcclxuICAgICAgbG9hZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmxvYWQpIHtcclxuICAgICAgICAgIGxvYWRNYXAuc2V0KGl0ZW0uaWQsIGl0ZW0ubG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2xpZGVzTW9kZWwgPSB0aGlzLl9pdGVtcy5tYXAoc2xpZGUgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiBgJHtzbGlkZS5pZH1gLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICB0cGxSZWY6IHNsaWRlLnRwbFJlZixcclxuICAgICAgICBkYXRhTWVyZ2U6IHNsaWRlLmRhdGFNZXJnZSxcclxuICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICBpc0Nsb25lZDogZmFsc2UsXHJcbiAgICAgICAgbG9hZDogbG9hZE1hcCA/IGxvYWRNYXAuZ2V0KHNsaWRlLmlkKSA6IGZhbHNlLFxyXG4gICAgICAgIGNsYXNzZXM6IHt9XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3AoYTogbnVtYmVyLCBvOiBzdHJpbmcsIGI6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGw7XHJcbiAgICBzd2l0Y2ggKG8pIHtcclxuICAgICAgY2FzZSAnPCc6XHJcbiAgICAgICAgcmV0dXJuIHJ0bCA/IGEgPiBiIDogYSA8IGI7XHJcbiAgICAgIGNhc2UgJz4nOlxyXG4gICAgICAgIHJldHVybiBydGwgPyBhIDwgYiA6IGEgPiBiO1xyXG4gICAgICBjYXNlICc+PSc6XHJcbiAgICAgICAgcmV0dXJuIHJ0bCA/IGEgPD0gYiA6IGEgPj0gYjtcclxuICAgICAgY2FzZSAnPD0nOlxyXG4gICAgICAgIHJldHVybiBydGwgPyBhID49IGIgOiBhIDw9IGI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmlnZ2VyKG5hbWU6IHN0cmluZywgZGF0YT86IGFueSkge1xyXG4gICAgc3dpdGNoIChuYW1lKSB7XHJcbiAgICAgIGNhc2UgQ2Fyb3VzZWxFdmVudFR5cGUuSW5pdGlhbGl6ZWQ6XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWRDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5DaGFuZ2U6XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlU2V0dGluZ3NDYXJvdXNlbCQubmV4dChkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5DaGFuZ2VkOlxyXG4gICAgICAgIHRoaXMuX2NoYW5nZWRTZXR0aW5nc0Nhcm91c2VsJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhcm91c2VsRXZlbnRUeXBlLlJlc2l6ZTpcclxuICAgICAgICB0aGlzLl9yZXNpemVDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemVkOlxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZWRDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZWZyZXNoOlxyXG4gICAgICAgIHRoaXMuX3JlZnJlc2hDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZWZyZXNoZWQ6XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGVkQ2Fyb3VzZWwkLm5leHQobmFtZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlOlxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZUNhcm91c2VsJC5uZXh0KG5hbWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhcm91c2VsRXZlbnRUeXBlLlRyYW5zbGF0ZWQ6XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlZENhcm91c2VsJC5uZXh0KG5hbWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdXBwcmVzcyhldmVudHM6IHN0cmluZ1tdKSB7XHJcbiAgICBldmVudHMuZm9yRWFjaChldmVudCA9PiB7XHJcbiAgICAgIHRoaXMuX3N1cHJlc3NbZXZlbnRdID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxlYXNlKGV2ZW50czogc3RyaW5nW10pIHtcclxuICAgIGV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcclxuICAgICAgZGVsZXRlIHRoaXMuX3N1cHJlc3NbZXZlbnRdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==