ng-virtual-list 18.11.2 → 18.12.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 (274) hide show
  1. package/README.md +115 -111
  2. package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +170 -61
  3. package/esm2022/lib/components/ng-list-item/const/index.mjs +41 -2
  4. package/esm2022/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
  5. package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +55 -51
  6. package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +5 -5
  7. package/esm2022/lib/components/ng-list-item/utils/create-display-id.mjs +7 -1
  8. package/esm2022/lib/components/ng-list-item/utils/get-element-by-index.mjs +17 -3
  9. package/esm2022/lib/components/ng-list-item/utils/index.mjs +3 -2
  10. package/esm2022/lib/components/ng-list-item/utils/matrix-3d.mjs +18 -0
  11. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +172 -47
  12. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +32 -16
  13. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +5 -5
  14. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +58 -34
  15. package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +37 -7
  16. package/esm2022/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
  17. package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +58 -28
  18. package/esm2022/lib/components/ng-scroll-bar/const/index.mjs +8 -1
  19. package/esm2022/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
  20. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +236 -88
  21. package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +170 -44
  22. package/esm2022/lib/components/ng-scroll-view/const/index.mjs +4 -2
  23. package/esm2022/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
  24. package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +610 -99
  25. package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +7 -1
  26. package/esm2022/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +12 -0
  27. package/esm2022/lib/components/ng-scroll-view/utils/get-dir.mjs +10 -0
  28. package/esm2022/lib/components/ng-scroll-view/utils/index.mjs +4 -2
  29. package/esm2022/lib/components/ng-scroll-view/utils/matrix-3d.mjs +15 -0
  30. package/esm2022/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
  31. package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +342 -160
  32. package/esm2022/lib/const/index.mjs +50 -10
  33. package/esm2022/lib/core/cache-map.mjs +1 -54
  34. package/esm2022/lib/core/const/index.mjs +3 -0
  35. package/esm2022/lib/core/enums/index.mjs +3 -0
  36. package/esm2022/lib/core/enums/item-display-methods.mjs +14 -0
  37. package/esm2022/lib/core/events/index.mjs +3 -0
  38. package/esm2022/lib/core/events/track-box-events.mjs +12 -0
  39. package/esm2022/lib/core/interfaces/get-item-position-options.mjs +2 -0
  40. package/esm2022/lib/core/interfaces/get-metrics-returns.mjs +2 -0
  41. package/esm2022/lib/core/interfaces/index.mjs +2 -0
  42. package/esm2022/lib/core/interfaces/item.mjs +2 -0
  43. package/esm2022/lib/core/interfaces/metrics.mjs +2 -0
  44. package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
  45. package/esm2022/lib/core/interfaces/update-collection-options.mjs +2 -0
  46. package/esm2022/lib/core/interfaces/update-collection-returns.mjs +2 -0
  47. package/esm2022/lib/core/track-box.mjs +601 -191
  48. package/esm2022/lib/core/tracker.mjs +14 -8
  49. package/esm2022/lib/core/types/cache-map-events.mjs +2 -0
  50. package/esm2022/lib/core/types/cache-map-listeners.mjs +2 -0
  51. package/esm2022/lib/core/types/cache.mjs +2 -0
  52. package/esm2022/lib/core/types/index.mjs +2 -0
  53. package/esm2022/lib/core/types/on-change-event-listener.mjs +2 -0
  54. package/esm2022/lib/core/types/on-tick-event-listener.mjs +2 -0
  55. package/esm2022/lib/core/utils/get-service-id-prop.mjs +10 -0
  56. package/esm2022/lib/core/utils/index.mjs +3 -0
  57. package/esm2022/lib/directives/index.mjs +3 -3
  58. package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +34 -13
  59. package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +67 -0
  60. package/esm2022/lib/directives/virtual-click/virtual-click.module.mjs +19 -0
  61. package/esm2022/lib/enums/alignments.mjs +12 -0
  62. package/esm2022/lib/enums/collapsing-modes.mjs +22 -0
  63. package/esm2022/lib/enums/index.mjs +8 -4
  64. package/esm2022/lib/enums/selecting-modes-types.mjs +22 -0
  65. package/esm2022/lib/enums/selecting-modes.mjs +22 -0
  66. package/esm2022/lib/enums/snap-to-item-aligns.mjs +22 -0
  67. package/esm2022/lib/enums/spreading-modes.mjs +18 -0
  68. package/esm2022/lib/interfaces/animation-params.mjs +1 -1
  69. package/esm2022/lib/interfaces/base-virtual-list-item-component.mjs +2 -9
  70. package/esm2022/lib/interfaces/index.mjs +1 -1
  71. package/esm2022/lib/interfaces/item-transformation.mjs +2 -0
  72. package/esm2022/lib/interfaces/point.mjs +2 -0
  73. package/esm2022/lib/interfaces/scroll-options.mjs +1 -1
  74. package/esm2022/lib/interfaces/scroll-params.mjs +1 -1
  75. package/esm2022/lib/models/item-config-map.model.mjs +1 -1
  76. package/esm2022/lib/models/item.model.mjs +1 -1
  77. package/esm2022/lib/models/render-item-config.model.mjs +1 -1
  78. package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
  79. package/esm2022/lib/ng-virtual-list-public.service.mjs +6 -7
  80. package/esm2022/lib/ng-virtual-list.component.mjs +2033 -903
  81. package/esm2022/lib/ng-virtual-list.service.mjs +91 -30
  82. package/esm2022/lib/transformations/deck-of-cards-3d.mjs +57 -0
  83. package/esm2022/lib/transformations/deck-of-cards.mjs +54 -0
  84. package/esm2022/lib/transformations/event-horizon.mjs +47 -0
  85. package/esm2022/lib/transformations/index.mjs +13 -0
  86. package/esm2022/lib/transformations/linear.mjs +47 -0
  87. package/esm2022/lib/transformations/swipe-3d.mjs +51 -0
  88. package/esm2022/lib/types/alignment.mjs +2 -0
  89. package/esm2022/lib/types/arithmetic-expression.mjs +2 -0
  90. package/esm2022/lib/types/collapsing-mode.mjs +2 -0
  91. package/esm2022/lib/types/collection-mode.mjs +2 -0
  92. package/esm2022/lib/types/color.mjs +2 -0
  93. package/esm2022/lib/types/direction.mjs +2 -0
  94. package/esm2022/lib/types/float-or-persentage-value.mjs +2 -0
  95. package/esm2022/lib/types/focus-item-params.mjs +1 -1
  96. package/esm2022/lib/types/gradient-color-position.mjs +1 -1
  97. package/esm2022/lib/types/index.mjs +1 -1
  98. package/esm2022/lib/types/item-transform.mjs +2 -0
  99. package/esm2022/lib/types/scroll-direction.mjs +1 -1
  100. package/esm2022/lib/types/selecting-mode.mjs +2 -0
  101. package/esm2022/lib/types/snap-to-item-align.mjs +2 -0
  102. package/esm2022/lib/types/snapping-distance.mjs +2 -0
  103. package/esm2022/lib/types/snapping-method.mjs +2 -0
  104. package/esm2022/lib/types/spreading-mode.mjs +2 -0
  105. package/esm2022/lib/types/text-direction.mjs +2 -0
  106. package/esm2022/lib/utils/animator/animator.mjs +28 -8
  107. package/esm2022/lib/utils/animator/const/index.mjs +2 -0
  108. package/esm2022/lib/utils/animator/index.mjs +3 -2
  109. package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +2 -0
  110. package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
  111. package/esm2022/lib/utils/animator/interfaces/index.mjs +2 -0
  112. package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
  113. package/esm2022/lib/utils/disposable-component.mjs +27 -0
  114. package/esm2022/lib/utils/event-emitter/event-emitter.mjs +1 -1
  115. package/esm2022/lib/utils/get-scroll-state-version.mjs +12 -0
  116. package/esm2022/lib/utils/is-collapse-mode.mjs +18 -0
  117. package/esm2022/lib/utils/is-collection-mode.mjs +1 -1
  118. package/esm2022/lib/utils/is-direction.mjs +1 -1
  119. package/esm2022/lib/utils/is-persentage-value.mjs +14 -0
  120. package/esm2022/lib/utils/is-select-mode.mjs +18 -0
  121. package/esm2022/lib/utils/is-spreading-mode.mjs +15 -0
  122. package/esm2022/lib/utils/list-validators.mjs +1 -1
  123. package/esm2022/lib/utils/normalize-collection.mjs +42 -0
  124. package/esm2022/lib/utils/object.mjs +1 -1
  125. package/esm2022/lib/utils/parse-arithmetic-expression.mjs +53 -0
  126. package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +17 -0
  127. package/esm2022/lib/utils/scrolling-direction.mjs +29 -0
  128. package/esm2022/lib/utils/snapping-method.mjs +1 -1
  129. package/esm2022/public-api.mjs +4 -1
  130. package/fesm2022/ng-virtual-list.mjs +7545 -3904
  131. package/fesm2022/ng-virtual-list.mjs.map +1 -1
  132. package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +40 -16
  133. package/lib/components/ng-list-item/const/index.d.ts +3 -1
  134. package/lib/components/ng-list-item/interfaces/template-context.d.ts +1 -1
  135. package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +5 -2
  136. package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +2 -2
  137. package/lib/components/ng-list-item/utils/create-display-id.d.ts +6 -0
  138. package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -1
  139. package/lib/components/ng-list-item/utils/index.d.ts +2 -1
  140. package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -0
  141. package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +69 -26
  142. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +2 -2
  143. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +2 -2
  144. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +33 -12
  145. package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +1 -0
  146. package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +20 -17
  147. package/lib/components/ng-scroll-bar/const/index.d.ts +2 -0
  148. package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +2 -2
  149. package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +75 -24
  150. package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +49 -16
  151. package/lib/components/ng-scroll-view/const/index.d.ts +3 -1
  152. package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +4 -1
  153. package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +79 -11
  154. package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +6 -0
  155. package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -0
  156. package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -0
  157. package/lib/components/ng-scroll-view/utils/index.d.ts +3 -1
  158. package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -0
  159. package/lib/components/ng-scroller/enums/scroller-directions.d.ts +2 -1
  160. package/lib/components/ng-scroller/ng-scroller.component.d.ts +111 -47
  161. package/lib/const/index.d.ts +46 -5
  162. package/lib/core/cache-map.d.ts +0 -10
  163. package/lib/core/const/index.d.ts +1 -0
  164. package/lib/core/enums/index.d.ts +2 -0
  165. package/lib/core/enums/item-display-methods.d.ts +12 -0
  166. package/lib/core/events/index.d.ts +2 -0
  167. package/lib/core/events/track-box-events.d.ts +10 -0
  168. package/lib/core/interfaces/get-item-position-options.d.ts +10 -0
  169. package/lib/core/interfaces/get-metrics-returns.d.ts +11 -0
  170. package/lib/core/interfaces/index.d.ts +8 -0
  171. package/lib/core/interfaces/item.d.ts +9 -0
  172. package/lib/core/interfaces/metrics.d.ts +51 -0
  173. package/lib/core/interfaces/recalculate-metrics-options.d.ts +32 -0
  174. package/lib/core/interfaces/update-collection-options.d.ts +10 -0
  175. package/lib/core/interfaces/update-collection-returns.d.ts +14 -0
  176. package/lib/core/track-box.d.ts +25 -95
  177. package/lib/core/tracker.d.ts +1 -1
  178. package/lib/core/types/cache-map-events.d.ts +8 -0
  179. package/lib/core/types/cache-map-listeners.d.ts +9 -0
  180. package/lib/core/types/cache.d.ts +12 -0
  181. package/lib/core/types/index.d.ts +6 -0
  182. package/lib/core/types/on-change-event-listener.d.ts +7 -0
  183. package/lib/core/types/on-tick-event-listener.d.ts +7 -0
  184. package/lib/core/utils/get-service-id-prop.d.ts +7 -0
  185. package/lib/core/utils/index.d.ts +2 -0
  186. package/lib/directives/index.d.ts +2 -2
  187. package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +16 -6
  188. package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -0
  189. package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -0
  190. package/lib/enums/alignments.d.ts +10 -0
  191. package/lib/enums/collapsing-modes.d.ts +20 -0
  192. package/lib/enums/index.d.ts +7 -9
  193. package/lib/enums/{method-for-selecting-types.d.ts → selecting-modes-types.d.ts} +3 -3
  194. package/lib/enums/{methods-for-selecting.d.ts → selecting-modes.d.ts} +3 -3
  195. package/lib/enums/snap-to-item-aligns.d.ts +20 -0
  196. package/lib/enums/spreading-modes.d.ts +16 -0
  197. package/lib/interfaces/animation-params.d.ts +1 -0
  198. package/lib/interfaces/base-virtual-list-item-component.d.ts +13 -13
  199. package/lib/interfaces/index.d.ts +3 -2
  200. package/lib/interfaces/item-transformation.d.ts +22 -0
  201. package/lib/interfaces/point.d.ts +16 -0
  202. package/lib/interfaces/scroll-options.d.ts +4 -0
  203. package/lib/interfaces/scroll-params.d.ts +3 -2
  204. package/lib/models/item-config-map.model.d.ts +5 -0
  205. package/lib/models/item.model.d.ts +7 -0
  206. package/lib/models/render-item-config.model.d.ts +50 -0
  207. package/lib/models/render-item-measures.model.d.ts +71 -0
  208. package/lib/ng-virtual-list-public.service.d.ts +4 -5
  209. package/lib/ng-virtual-list.component.d.ts +462 -135
  210. package/lib/ng-virtual-list.service.d.ts +33 -12
  211. package/lib/transformations/deck-of-cards-3d.d.ts +54 -0
  212. package/lib/transformations/deck-of-cards.d.ts +50 -0
  213. package/lib/transformations/event-horizon.d.ts +26 -0
  214. package/lib/transformations/index.d.ts +7 -0
  215. package/lib/transformations/linear.d.ts +26 -0
  216. package/lib/transformations/swipe-3d.d.ts +38 -0
  217. package/lib/types/alignment.d.ts +8 -0
  218. package/lib/types/arithmetic-expression.d.ts +10 -0
  219. package/lib/types/collapsing-mode.d.ts +8 -0
  220. package/lib/{enums → types}/collection-mode.d.ts +1 -1
  221. package/lib/types/color.d.ts +4 -0
  222. package/lib/{enums → types}/direction.d.ts +1 -1
  223. package/lib/types/float-or-persentage-value.d.ts +7 -0
  224. package/lib/types/focus-item-params.d.ts +6 -0
  225. package/lib/types/gradient-color-position.d.ts +1 -1
  226. package/lib/types/index.d.ts +15 -1
  227. package/lib/types/item-transform.d.ts +9 -0
  228. package/lib/types/scroll-direction.d.ts +2 -0
  229. package/lib/types/selecting-mode.d.ts +8 -0
  230. package/lib/types/snap-to-item-align.d.ts +8 -0
  231. package/lib/types/snapping-distance.d.ts +8 -0
  232. package/lib/{enums → types}/snapping-method.d.ts +1 -1
  233. package/lib/types/spreading-mode.d.ts +8 -0
  234. package/lib/{enums → types}/text-direction.d.ts +1 -1
  235. package/lib/utils/animator/animator.d.ts +10 -17
  236. package/lib/utils/animator/const/index.d.ts +1 -0
  237. package/lib/utils/animator/index.d.ts +2 -1
  238. package/lib/utils/animator/interfaces/animator-params.d.ts +18 -0
  239. package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -0
  240. package/lib/utils/animator/interfaces/index.d.ts +3 -0
  241. package/lib/utils/animator/types/easing.d.ts +6 -0
  242. package/lib/utils/disposable-component.d.ts +15 -0
  243. package/lib/utils/get-scroll-state-version.d.ts +1 -0
  244. package/lib/utils/is-collapse-mode.d.ts +8 -0
  245. package/lib/utils/is-collection-mode.d.ts +1 -1
  246. package/lib/utils/is-direction.d.ts +1 -1
  247. package/lib/utils/is-persentage-value.d.ts +7 -0
  248. package/lib/utils/is-select-mode.d.ts +8 -0
  249. package/lib/utils/is-spreading-mode.d.ts +8 -0
  250. package/lib/utils/list-validators.d.ts +1 -1
  251. package/lib/utils/normalize-collection.d.ts +8 -0
  252. package/lib/utils/object.d.ts +1 -1
  253. package/lib/utils/parse-arithmetic-expression.d.ts +8 -0
  254. package/lib/utils/parse-float-or-persentage-value.d.ts +7 -0
  255. package/lib/utils/scrolling-direction.d.ts +17 -0
  256. package/lib/utils/snapping-method.d.ts +1 -1
  257. package/package.json +1 -1
  258. package/public-api.d.ts +3 -0
  259. package/esm2022/lib/components/ng-scroller/const/index.mjs +0 -2
  260. package/esm2022/lib/directives/item-click/item-click.directive.mjs +0 -59
  261. package/esm2022/lib/directives/item-click/item-click.module.mjs +0 -19
  262. package/esm2022/lib/enums/collection-mode.mjs +0 -2
  263. package/esm2022/lib/enums/direction.mjs +0 -2
  264. package/esm2022/lib/enums/method-for-selecting-types.mjs +0 -22
  265. package/esm2022/lib/enums/method-for-selecting.mjs +0 -2
  266. package/esm2022/lib/enums/methods-for-selecting.mjs +0 -22
  267. package/esm2022/lib/enums/snapping-method.mjs +0 -2
  268. package/esm2022/lib/enums/text-direction.mjs +0 -2
  269. package/esm2022/lib/utils/is-method-for-selecting.mjs +0 -18
  270. package/lib/components/ng-scroller/const/index.d.ts +0 -1
  271. package/lib/directives/item-click/item-click.directive.d.ts +0 -19
  272. package/lib/directives/item-click/item-click.module.d.ts +0 -8
  273. package/lib/enums/method-for-selecting.d.ts +0 -8
  274. package/lib/utils/is-method-for-selecting.d.ts +0 -8
@@ -1,13 +1,17 @@
1
- import { Component, inject, input, ViewChild, } from '@angular/core';
1
+ import { Component, inject, Input, ViewChild, } from '@angular/core';
2
2
  import { CdkScrollable } from '@angular/cdk/scrolling';
3
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
- import { filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
5
- import { ScrollerDirection } from './enums';
3
+ import { BehaviorSubject, debounceTime, delay, filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
6
4
  import { ANIMATOR_MIN_TIMESTAMP, Animator, easeOutQuad } from '../../utils/animator';
7
- import { BEHAVIOR_INSTANT, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SCROLLING_SETTINGS, INTERACTIVE, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, TOUCH_END, TOUCH_MOVE, TOUCH_START, WHEEL, } from '../../const';
8
- import { ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_VELOCITY_TIMESTAMP, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
9
- import { calculateDirection } from './utils';
5
+ import { BEHAVIOR_INSTANT, DEFAULT_ANIMATION_PARAMS, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SCROLLING_ONE_BY_ONE, DEFAULT_SCROLLING_SETTINGS, DEFAULT_SNAP_TO_ITEM, DEFAULT_SNAP_TO_ITEM_ALIGN, DEFAULT_SNAPPING_DISTANCE, INTERACTIVE, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, TOUCH_END, TOUCH_MOVE, TOUCH_START, WHEEL, } from '../../const';
6
+ import { ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS, MAX_VELOCITY_TIMESTAMP, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
7
+ import { calculateDirection, matrix3d } from './utils';
10
8
  import { BaseScrollView } from './base/base-scroll-view.component';
9
+ import { SnapToItemAligns } from '../../enums';
10
+ import { NgVirtualListService } from '../../ng-virtual-list.service';
11
+ import { parseFloatOrPersentageValue } from '../../utils/parse-float-or-persentage-value';
12
+ import { isPercentageValue } from '../../utils/is-persentage-value';
13
+ import { ScrollingDirection } from '../../utils/scrolling-direction';
14
+ import { calculateVelocity } from './utils/calculate-velocity';
11
15
  import * as i0 from "@angular/core";
12
16
  /**
13
17
  * NgScrollView
@@ -19,118 +23,413 @@ import * as i0 from "@angular/core";
19
23
  */
20
24
  export class NgScrollView extends BaseScrollView {
21
25
  cdkScrollable;
22
- scrollBehavior = input(DEFAULT_SCROLL_BEHAVIOR);
23
- scrollingSettings = input(DEFAULT_SCROLLING_SETTINGS);
24
- overscrollEnabled = input(DEFAULT_OVERSCROLL_ENABLED);
26
+ _service = inject(NgVirtualListService);
27
+ _$scrollBehavior = new BehaviorSubject(DEFAULT_SCROLL_BEHAVIOR);
28
+ $scrollBehavior = this._$scrollBehavior.asObservable();
29
+ set scrollBehavior(v) {
30
+ if (this._$scrollBehavior.getValue() !== v) {
31
+ this._$scrollBehavior.next(v);
32
+ }
33
+ }
34
+ get scrollBehavior() { return this._$scrollBehavior.getValue(); }
35
+ _$overscrollEnabled = new BehaviorSubject(DEFAULT_OVERSCROLL_ENABLED);
36
+ $overscrollEnabled = this._$overscrollEnabled.asObservable();
37
+ set overscrollEnabled(v) {
38
+ if (this._$overscrollEnabled.getValue() !== v) {
39
+ this._$overscrollEnabled.next(v);
40
+ }
41
+ }
42
+ get overscrollEnabled() { return this._$overscrollEnabled.getValue(); }
43
+ _$scrollingSettings = new BehaviorSubject(DEFAULT_SCROLLING_SETTINGS);
44
+ $scrollingSettings = this._$scrollingSettings.asObservable();
45
+ set scrollingSettings(v) {
46
+ if (this._$scrollingSettings.getValue() !== v) {
47
+ this._$scrollingSettings.next(v);
48
+ }
49
+ }
50
+ get scrollingSettings() { return this._$scrollingSettings.getValue(); }
51
+ _$snapToItem = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM);
52
+ $snapToItem = this._$snapToItem.asObservable();
53
+ set snapToItem(v) {
54
+ if (this._$snapToItem.getValue() !== v) {
55
+ this._$snapToItem.next(v);
56
+ }
57
+ }
58
+ get snapToItem() { return this._$snapToItem.getValue(); }
59
+ _$scrollingOneByOne = new BehaviorSubject(DEFAULT_SCROLLING_ONE_BY_ONE);
60
+ $scrollingOneByOne = this._$scrollingOneByOne.asObservable();
61
+ set scrollingOneByOne(v) {
62
+ if (this._$scrollingOneByOne.getValue() !== v) {
63
+ this._$scrollingOneByOne.next(v);
64
+ }
65
+ }
66
+ get scrollingOneByOne() { return this._$scrollingOneByOne.getValue(); }
67
+ _$snapToItemAlign = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM_ALIGN);
68
+ $snapToItemAlign = this._$snapToItemAlign.asObservable();
69
+ set snapToItemAlign(v) {
70
+ if (this._$snapToItemAlign.getValue() !== v) {
71
+ this._$snapToItemAlign.next(v);
72
+ }
73
+ }
74
+ get snapToItemAlign() { return this._$snapToItemAlign.getValue(); }
75
+ _$snappingDistance = new BehaviorSubject(DEFAULT_SNAPPING_DISTANCE);
76
+ $snappingDistance = this._$snappingDistance.asObservable();
77
+ set snappingDistance(v) {
78
+ if (this._$snappingDistance.getValue() !== v) {
79
+ this._$snappingDistance.next(v);
80
+ }
81
+ }
82
+ get snappingDistance() { return this._$snappingDistance.getValue(); }
83
+ _$animationParams = new BehaviorSubject(DEFAULT_ANIMATION_PARAMS);
84
+ $animationParams = this._$animationParams.asObservable();
85
+ set animationParams(v) {
86
+ if (this._$animationParams.getValue() !== v) {
87
+ this._$animationParams.next(v);
88
+ }
89
+ }
90
+ get animationParams() { return this._$animationParams.getValue(); }
25
91
  _normalizeValueFromZero = inject(SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO);
92
+ _isScrollsTo = false;
93
+ _scrollDirection = new ScrollingDirection();
94
+ get scrollDirection() {
95
+ return this._scrollDirection.get();
96
+ }
97
+ get $scrollDirection() { return this._scrollDirection.$direction; }
98
+ _$wheel = new Subject();
99
+ $wheel = this._$wheel.asObservable();
26
100
  _$scroll = new Subject();
27
101
  $scroll = this._$scroll.asObservable();
28
102
  _$scrollEnd = new Subject();
29
103
  $scrollEnd = this._$scrollEnd.asObservable();
104
+ _velocities = [];
105
+ _$velocity = new BehaviorSubject(0);
106
+ $velocity = this._$velocity.asObservable();
107
+ get velocity() { return this._$velocity.getValue(); }
108
+ _$averageVelocity = new BehaviorSubject(0);
109
+ $averageVelocity = this._$averageVelocity.asObservable();
110
+ get averageVelocity() { return this._$averageVelocity.getValue(); }
111
+ _measureVelocityTimestamp = Date.now();
112
+ _measureVelocityLastPosition = this._$isVertical.getValue() ? this._y : this._x;
30
113
  _startPosition = 0;
31
114
  _animator = new Animator();
32
115
  _interactive = true;
33
116
  _overscrollIteration = 0;
117
+ set x(v) {
118
+ this.setX(v);
119
+ }
120
+ get x() { return this._x; }
121
+ setX(x, snap = true, normalize = true) {
122
+ if (x !== undefined && !Number.isNaN(x)) {
123
+ this.updateDirection(x, this._y);
124
+ this._x = this._actualY = x;
125
+ if (normalize) {
126
+ this.normalizeScrollSize();
127
+ }
128
+ this.refreshCoordinate(this._x, this._y);
129
+ this.measureVelocity();
130
+ if (snap) {
131
+ this.checkIntersectionComponent();
132
+ }
133
+ }
134
+ }
135
+ set y(v) {
136
+ this.setY(v);
137
+ }
138
+ get y() { return this._y; }
139
+ setY(y, snap = true, normalize = true) {
140
+ if (y !== undefined && !Number.isNaN(y)) {
141
+ this.updateDirection(y, this._y);
142
+ this._y = this._actualY = y;
143
+ if (normalize) {
144
+ this.normalizeScrollSize();
145
+ }
146
+ this.refreshCoordinate(this._x, this._y);
147
+ this.measureVelocity();
148
+ if (snap) {
149
+ this.checkIntersectionComponent();
150
+ }
151
+ }
152
+ }
153
+ _delta = 0;
34
154
  set delta(v) {
155
+ this._delta = v;
35
156
  this._startPosition += v;
36
157
  }
158
+ set startLayoutOffset(v) {
159
+ if (this._startLayoutOffset !== v) {
160
+ this._startLayoutOffset = v;
161
+ this.refreshCoordinate(this._x, this._y);
162
+ }
163
+ }
164
+ get startLayoutOffset() { return this._startLayoutOffset; }
165
+ _intersectionComponentId = null;
166
+ _isAlignmentAnimation = false;
37
167
  constructor() {
38
168
  super();
39
- const $viewport = toObservable(this.scrollViewport).pipe(takeUntilDestroyed(this._destroyRef), filter(v => !!v), map(v => v.nativeElement)), $content = toObservable(this.scrollContent).pipe(takeUntilDestroyed(this._destroyRef), filter(v => !!v), map(v => v.nativeElement)), $wheelEmitter = this._inversion ? $viewport : $content;
40
- $wheelEmitter.pipe(takeUntilDestroyed(this._destroyRef), switchMap(content => {
41
- return fromEvent(content, WHEEL, { passive: false }).pipe(filter(() => this._interactive), takeUntilDestroyed(this._destroyRef), tap(e => {
42
- const isVertical = this.isVertical();
169
+ }
170
+ ngAfterViewInit() {
171
+ let mouseCanceled = false, touchCanceled = false;
172
+ const $viewportBounds = this.$viewportBounds;
173
+ $viewportBounds.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
174
+ this._isMoving = false;
175
+ this._$grabbing.next(false);
176
+ if (!mouseCanceled || !touchCanceled) {
177
+ this.stopMoving();
178
+ }
179
+ mouseCanceled = touchCanceled = true;
180
+ if (this.snapToItem || this.scrollingOneByOne) {
181
+ this.stopScrolling(true);
182
+ this.alignPosition(true, true);
183
+ }
184
+ this._$scrollEnd.next(false);
185
+ })).subscribe();
186
+ const $wheel = this.$wheel;
187
+ $wheel.pipe(takeUntil(this._$unsubscribe), switchMap(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
188
+ this.snapWithInitialForceIfNecessary(v);
189
+ this._scrollDirection.clear();
190
+ })).subscribe();
191
+ const $viewport = of(this.scrollViewport).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $content = of(this.scrollContent).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $wheelEmitter = this._inversion ? $viewport : $content;
192
+ $wheelEmitter.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
193
+ return fromEvent(content, WHEEL, { passive: false }).pipe(filter(() => this._interactive), takeUntil(this._$unsubscribe), tap(e => {
194
+ const isVertical = this._$isVertical.getValue();
43
195
  this.emitScrollableEvent();
44
196
  this.checkOverscroll(e);
45
- this.stopScrolling();
46
- const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this.y : this.x, delta = isVertical ? e.deltaY : e.deltaX, dp = (startPos + delta), position = dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp;
47
- this.scroll({ [isVertical ? TOP : LEFT]: position, behavior: INSTANT, userAction: true });
197
+ this.stopScrolling(true);
198
+ const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : e.deltaX, dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
199
+ this.scroll({ [isVertical ? TOP : LEFT]: position, behavior: INSTANT, userAction: true, blending: false, fireUpdate: true });
200
+ this._$wheel.next(delta);
48
201
  }));
49
202
  })).subscribe();
50
- const $mouseUp = fromEvent(window, MOUSE_UP, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef)), $mouseDragCancel = $mouseUp.pipe(takeUntilDestroyed(this._destroyRef), tap(() => {
203
+ const $mouseUp = race([
204
+ fromEvent(window, MOUSE_UP, { passive: true }).pipe(takeUntil(this._$unsubscribe)),
205
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => fromEvent(content, MOUSE_UP, { passive: true }))),
206
+ ]), $mouseDragCancel = $mouseUp.pipe(takeUntil(this._$unsubscribe), delay(0), tap(() => {
51
207
  this._isMoving = false;
52
- this.grabbing.set(false);
208
+ this._$grabbing.next(false);
209
+ if (!mouseCanceled) {
210
+ this.stopMoving();
211
+ }
212
+ mouseCanceled = true;
213
+ if (this.snapToItem && this.scrollingOneByOne) {
214
+ this._isAlignmentAnimation = false;
215
+ this.alignPosition(true, true);
216
+ }
217
+ this._$scrollEnd.next(true);
53
218
  }));
54
- $content.pipe(takeUntilDestroyed(this._destroyRef), switchMap(content => {
55
- return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef), filter(v => this._interactive), switchMap(e => {
219
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
220
+ return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
221
+ return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil(fromEvent(window, MOUSE_MOVE, { passive: false })), tap(e => {
222
+ this._isMoving = false;
223
+ this._$grabbing.next(false);
224
+ if (!mouseCanceled) {
225
+ this.stopMoving();
226
+ }
227
+ mouseCanceled = true;
228
+ if (this.snapToItem || this.scrollingOneByOne) {
229
+ this._isAlignmentAnimation = false;
230
+ this.alignPosition(true, true);
231
+ }
232
+ this._$scrollEnd.next(true);
233
+ }));
234
+ }));
235
+ })).subscribe();
236
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
237
+ return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(v => this._interactive), switchMap(e => {
238
+ mouseCanceled = false;
239
+ this._scrollDirection.clear();
56
240
  this.cancelOverscroll();
57
241
  this.onDragStart();
58
- this.stopScrolling();
242
+ this.stopScrolling(true);
243
+ this.stopMoving();
59
244
  const target = e.target;
60
245
  if (target.classList.contains(INTERACTIVE)) {
61
246
  return of(undefined);
62
247
  }
63
- const inversion = this._inversion, isVertical = this.isVertical();
248
+ const inversion = this._inversion, isVertical = this._$isVertical.getValue();
64
249
  this._isMoving = true;
65
- this.grabbing.set(true);
250
+ this._$grabbing.next(true);
66
251
  this._startPosition = (isVertical ? this.y : this.x);
67
- let prevClientPosition = 0, startClientPos = isVertical ? e.clientY : e.clientX, offsets = new Array(), velocities = new Array(), startTime = Date.now();
68
- return fromEvent(window, MOUSE_MOVE, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef), takeUntil($mouseDragCancel), tap(e => {
252
+ let prevClientPosition = isVertical ? e.clientY : e.clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
253
+ return fromEvent(window, MOUSE_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
69
254
  this.checkOverscroll(e);
70
255
  }), switchMap(e => {
71
256
  const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
72
257
  prevClientPosition = currentPos;
73
258
  this.move(isVertical, position, true, true, true);
259
+ const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
260
+ if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
261
+ startClientPos -= offset;
262
+ }
74
263
  startTime = endTime;
75
- return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntilDestroyed(this._destroyRef), tap(e => {
264
+ return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
265
+ mouseCanceled = true;
76
266
  this.cancelOverscroll();
77
267
  const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
78
268
  this._isMoving = false;
79
- this.grabbing.set(false);
80
- if (this.scrollBehavior() === BEHAVIOR_INSTANT) {
81
- return;
269
+ this._$grabbing.next(false);
270
+ if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
271
+ this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
272
+ }
273
+ else {
274
+ this.snapIfNecessary(v0);
275
+ this._$scrollEnd.next(true);
82
276
  }
83
- this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
84
277
  }));
85
278
  }));
86
279
  }));
87
280
  })).subscribe();
88
- const $touchUp = fromEvent(window, TOUCH_END, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef)), $touchCanceler = $touchUp.pipe(takeUntilDestroyed(this._destroyRef), tap(() => {
281
+ const $touchUp = race([
282
+ fromEvent(window, TOUCH_END, { passive: false }).pipe(takeUntil(this._$unsubscribe)),
283
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => fromEvent(content, TOUCH_END, { passive: false }))),
284
+ ]), $touchCanceler = $touchUp.pipe(takeUntil(this._$unsubscribe), delay(0), tap(() => {
89
285
  this._isMoving = false;
90
- this.grabbing.set(false);
286
+ this._$grabbing.next(false);
287
+ if (!touchCanceled) {
288
+ this.stopMoving();
289
+ }
290
+ touchCanceled = true;
291
+ if (this.snapToItem && this.scrollingOneByOne) {
292
+ this._isAlignmentAnimation = false;
293
+ this.alignPosition(true, true);
294
+ }
295
+ this._$scrollEnd.next(true);
91
296
  }));
92
- $content.pipe(takeUntilDestroyed(this._destroyRef), switchMap(content => {
93
- return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef), filter(() => this._interactive), switchMap(e => {
297
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
298
+ return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
299
+ return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil(fromEvent(window, TOUCH_MOVE, { passive: false })), tap(e => {
300
+ this._isMoving = false;
301
+ this._$grabbing.next(false);
302
+ if (!touchCanceled) {
303
+ this.stopMoving();
304
+ }
305
+ touchCanceled = true;
306
+ if (this.snapToItem || this.scrollingOneByOne) {
307
+ this._isAlignmentAnimation = false;
308
+ this.alignPosition(true, true);
309
+ }
310
+ this._$scrollEnd.next(true);
311
+ }));
312
+ }));
313
+ })).subscribe();
314
+ $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
315
+ return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
316
+ touchCanceled = false;
317
+ this._scrollDirection.clear();
94
318
  this.cancelOverscroll();
95
319
  this.onDragStart();
96
- this.stopScrolling();
320
+ this.stopScrolling(true);
321
+ this.stopMoving();
97
322
  const target = e.target;
98
323
  if (target.classList.contains(INTERACTIVE)) {
99
324
  return of(undefined);
100
325
  }
101
- const inversion = this._inversion, isVertical = this.isVertical();
326
+ const inversion = this._inversion, isVertical = this._$isVertical.getValue();
102
327
  this._isMoving = true;
103
- this.grabbing.set(true);
328
+ this._$grabbing.next(true);
104
329
  this._startPosition = (isVertical ? this.y : this.x);
105
- let prevClientPosition = 0, startClientPos = isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX, offsets = new Array(), velocities = new Array(), startTime = Date.now();
106
- return fromEvent(window, TOUCH_MOVE, { passive: false }).pipe(takeUntilDestroyed(this._destroyRef), takeUntil($touchCanceler), tap(e => {
330
+ let prevClientPosition = isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
331
+ return fromEvent(window, TOUCH_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
107
332
  this.checkOverscroll(e);
108
333
  }), switchMap(e => {
109
334
  const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
110
335
  prevClientPosition = currentPos;
111
336
  this.move(isVertical, position, true, true, true);
337
+ const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
338
+ if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
339
+ startClientPos -= offset;
340
+ }
112
341
  startTime = endTime;
113
- return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntilDestroyed(this._destroyRef), tap(e => {
342
+ return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
343
+ touchCanceled = true;
114
344
  this.cancelOverscroll();
115
345
  const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
116
346
  this._isMoving = false;
117
- this.grabbing.set(false);
118
- if (this.scrollBehavior() === BEHAVIOR_INSTANT) {
119
- return;
347
+ this._$grabbing.next(false);
348
+ if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
349
+ this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
350
+ }
351
+ else {
352
+ this.snapIfNecessary(v0);
353
+ this._$scrollEnd.next(true);
120
354
  }
121
- this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
122
355
  }));
123
356
  }));
124
357
  }));
125
358
  })).subscribe();
126
359
  }
360
+ updateDirection(position, prePosition) {
361
+ const delta = (position - this._delta) - prePosition;
362
+ this._scrollDirection.add(delta > 0 ? 1 : delta < 0 ? -1 : 0);
363
+ }
364
+ overrideCoordinates(x, y) {
365
+ super.overrideCoordinates(x, y);
366
+ const position = Math.abs(this._$isVertical.getValue() ? y : x);
367
+ this._measureVelocityTimestamp = Date.now();
368
+ this._measureVelocityLastPosition = position;
369
+ this.refreshCoordinate(x, y);
370
+ }
371
+ measureVelocity() {
372
+ const timestamp = Date.now();
373
+ if (timestamp === this._measureVelocityTimestamp) {
374
+ return;
375
+ }
376
+ const position = Math.abs(this._$isVertical.getValue() ? this._y : this._x);
377
+ if (!this.isInfinity) {
378
+ if (position <= 0 || position >= (this._$isVertical.getValue() ? this.scrollHeight : this.scrollWidth)) {
379
+ this._velocities = [0];
380
+ this._$averageVelocity.next(0);
381
+ this._measureVelocityLastPosition = position;
382
+ this._measureVelocityTimestamp = timestamp;
383
+ return;
384
+ }
385
+ }
386
+ if (this._delta !== 0) {
387
+ return;
388
+ }
389
+ const timeDelta = timestamp - this._measureVelocityTimestamp, positionDelta = Math.abs(position - this._measureVelocityLastPosition), velocity = timeDelta > 0 ? positionDelta / timeDelta : 0;
390
+ let avgVelocity = this._velocities.length > 0 ? this._velocities.reduce((p, c) => p + c) : 0;
391
+ if (this._velocities.length >= MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS) {
392
+ this._velocities.shift();
393
+ }
394
+ avgVelocity += velocity;
395
+ this._$velocity.next(velocity);
396
+ this._velocities.push(velocity);
397
+ this._$averageVelocity.next(avgVelocity / MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS);
398
+ this._measureVelocityLastPosition = position;
399
+ this._measureVelocityTimestamp = timestamp;
400
+ }
401
+ stopMoving() { }
402
+ snapIfNecessary(v0, withInitialForce = true, animated = true, force = false) {
403
+ const scrollDirection = this._scrollDirection.get() || (force ? 1 : 0);
404
+ if (scrollDirection === 0) {
405
+ return false;
406
+ }
407
+ const snapToItem = this.snapToItem;
408
+ if (!!snapToItem) {
409
+ const scrollingOneByOne = this.scrollingOneByOne;
410
+ if (scrollingOneByOne) {
411
+ return this.alignPosition();
412
+ }
413
+ if (withInitialForce) {
414
+ return this.snapWithInitialForceIfNecessary(v0, animated, force);
415
+ }
416
+ }
417
+ return false;
418
+ }
419
+ snapWithInitialForceIfNecessary(v0 = null, animated = true, force = false) {
420
+ const t = this.animationParams.snapToItem * .01, s = this.getSnappedComponentSize(), va = s !== null && t !== 0 ? (s / t) : 0;
421
+ if (va >= Math.abs(v0 ?? this.averageVelocity)) {
422
+ return this.alignPosition(animated, force);
423
+ }
424
+ return false;
425
+ }
127
426
  calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities) {
128
- const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = Math.round(dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp), endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
427
+ const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
129
428
  this.calculateAcceleration(velocities, v0, timestamp);
130
429
  return { position, currentPos, endTime, scrollDelta };
131
430
  }
132
431
  cancelOverscroll() {
133
- if (!this.overscrollEnabled()) {
432
+ if (!this.overscrollEnabled) {
134
433
  return;
135
434
  }
136
435
  this._overscrollIteration = 0;
@@ -155,23 +454,25 @@ export class NgScrollView extends BaseScrollView {
155
454
  }
156
455
  }
157
456
  checkOverscroll(e) {
158
- if (!this.overscrollEnabled()) {
457
+ if (!this._overscrollEnabled || !this.overscrollEnabled) {
159
458
  if (e.cancelable) {
160
459
  e.stopImmediatePropagation();
161
460
  e.preventDefault();
162
461
  }
163
462
  return;
164
463
  }
165
- if (this.isVertical()) {
166
- this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
167
- }
168
- else {
169
- this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
464
+ if (this._overscrollEnabled) {
465
+ if (this._$isVertical.getValue()) {
466
+ this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
467
+ }
468
+ else {
469
+ this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
470
+ }
170
471
  }
171
472
  }
172
473
  calculateVelocity(offsets, delta, timestamp, indexOffset = 10) {
173
474
  offsets.push([delta, timestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : timestamp]);
174
- const len = offsets.length, startIndex = len > indexOffset ? len - indexOffset : 0, lastVSign = calculateDirection(offsets), speedScale = this.scrollingSettings()?.speedScale ?? SPEED_SCALE;
475
+ const len = offsets.length, startIndex = len > indexOffset ? len - indexOffset : 0, lastVSign = calculateDirection(offsets), speedScale = this.scrollingSettings?.speedScale ?? SPEED_SCALE;
175
476
  let vSum = 0;
176
477
  for (let i = startIndex, l = offsets.length; i < l; i++) {
177
478
  const p0 = offsets[i];
@@ -188,7 +489,7 @@ export class NgScrollView extends BaseScrollView {
188
489
  velocities.push([delta, timestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : timestamp]);
189
490
  const len = velocities.length, startIndex = len > indexOffset ? len - indexOffset : 0;
190
491
  let aSum = 0, prevV0, iteration = 0, lastVSign = calculateDirection(velocities);
191
- const mass = this.scrollingSettings()?.mass ?? MASS;
492
+ const mass = this.scrollingSettings?.mass ?? MASS;
192
493
  for (let i = startIndex, l = velocities.length; i < l; i++) {
193
494
  const v00 = prevV0, v01 = velocities[i];
194
495
  if (lastVSign !== Math.sign(v01[0])) {
@@ -202,10 +503,14 @@ export class NgScrollView extends BaseScrollView {
202
503
  prevV0 = v01;
203
504
  iteration++;
204
505
  }
205
- const a0 = aSum * (this.scrollingSettings()?.frictionalForce ?? FRICTION_FORCE);
506
+ const a0 = aSum * (this.scrollingSettings?.frictionalForce ?? FRICTION_FORCE);
206
507
  return { a0 };
207
508
  }
208
- stopScrolling() {
509
+ stopScrolling(force = false) {
510
+ if (this._isAlignmentAnimation && !force) {
511
+ return;
512
+ }
513
+ this._isAlignmentAnimation = false;
209
514
  this._animator.stop();
210
515
  }
211
516
  move(isVertical, position, blending = false, userAction = false, fireUpdate = true) {
@@ -213,57 +518,252 @@ export class NgScrollView extends BaseScrollView {
213
518
  }
214
519
  moveWithAcceleration(isVertical, position, v0, v, a0, timestamp) {
215
520
  if (a0 !== 0 && timestamp < MAX_VELOCITY_TIMESTAMP) {
216
- const dvSign = Math.sign(v), mass = this.scrollingSettings()?.mass ?? MASS, duration = DURATION, maxDuration = this.scrollingSettings()?.maxDuration ?? MAX_DURATION, maxDist = this.scrollingSettings()?.maxDistance ?? MAX_DIST, maxDistance = dvSign * maxDist, s = (dvSign * Math.abs((a0 * Math.pow(duration, 2)) * .5) / 1000) / mass, distance = Math.abs(s) < maxDist ? s : maxDistance, positionWithVelocity = position + (this._inversion ? -1 : 1) * distance, vmax = Math.max(Math.abs(v0), Math.abs(v)), ad = Math.abs(vmax !== 0 ? Math.sqrt(vmax) : 0) * 10 / mass, aDuration = ad < maxDuration ? ad : maxDuration, startPosition = isVertical ? this.y : this.x;
521
+ const dvSign = Math.sign(v), mass = this.scrollingSettings?.mass ?? MASS, duration = DURATION, maxDuration = this.scrollingSettings?.maxDuration ?? MAX_DURATION, maxDist = this.scrollingSettings?.maxDistance ?? MAX_DIST, maxDistance = dvSign * maxDist, s = (dvSign * Math.abs((a0 * Math.pow(duration, 2)) * .5) / 1000) / mass, distance = Math.abs(s) < maxDist ? s : maxDistance, positionWithVelocity = position + (this._inversion ? -1 : 1) * distance, vmax = Math.max(Math.abs(v0), Math.abs(v)), ad = Math.abs(vmax !== 0 ? Math.sqrt(vmax) : 0) * 10 / mass, aDuration = ad < maxDuration ? ad : maxDuration, startPosition = isVertical ? this.y : this.x;
217
522
  this.animate(startPosition, Math.round(positionWithVelocity), aDuration, easeOutQuad, true);
218
523
  }
524
+ else {
525
+ this.alignPosition(true, true);
526
+ }
219
527
  }
220
528
  normalizeValue(value) {
221
- const isVertical = this.direction() === ScrollerDirection.VERTICAL, startOffset = this._normalizeValueFromZero ? 0 : this.startOffset(), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, result = value <= startOffset ? startOffset : value > scrollSize ? scrollSize : value;
529
+ if (this.isInfinity) {
530
+ return value;
531
+ }
532
+ const isVertical = this._$isVertical.getValue(), startOffset = this._normalizeValueFromZero ? 0 : this.startOffset, scrollSize = this.scrollable ? ((isVertical ? this.scrollHeight : this.scrollWidth) - this.alignmentEndOffset) : 0, result = this.scrollable ? (value <= startOffset ? startOffset : value > scrollSize ? scrollSize : value) : startOffset;
222
533
  return result;
223
534
  }
224
- animate(startValue, endValue, duration = ANIMATION_DURATION, easingFunction = easeOutQuad, userAction = false) {
225
- const isVertical = this.direction() === ScrollerDirection.VERTICAL;
535
+ animate(startValue, endValue, duration = ANIMATION_DURATION, easingFunction = easeOutQuad, userAction = false, alignmentAtComplete = true, skipOverridedCoordinates = false) {
536
+ const isVertical = this._$isVertical.getValue();
537
+ let iteration = 0, position = startValue;
538
+ this._isAlignmentAnimation = !alignmentAtComplete;
226
539
  this._animator.animate({
227
- startValue, endValue, duration,
540
+ withDelta: this._service.dynamic && !this.isInfinity,
541
+ startValue,
542
+ endValue,
543
+ duration,
228
544
  easingFunction,
229
545
  getPropValue: () => {
230
546
  return isVertical ? this._y : this._x;
231
- }, onUpdate: ({ value }) => {
232
- this.move(isVertical, value, false, userAction);
233
- }, onComplete: ({ value }) => {
234
- this.move(isVertical, value, false, userAction);
547
+ }, onUpdate: ({ value, timestamp, elapsed }) => {
548
+ if (this._isCoordinatesOverrided && !skipOverridedCoordinates) {
549
+ this._isCoordinatesOverrided = false;
550
+ const currentCoordinate = isVertical ? this._y : this._x, delta = endValue - value;
551
+ this.animate(currentCoordinate, currentCoordinate + delta, duration - elapsed, easingFunction, userAction, alignmentAtComplete);
552
+ return;
553
+ }
554
+ const v0 = calculateVelocity(position, value, timestamp) ?? this.averageVelocity;
555
+ position = value;
556
+ if (alignmentAtComplete && !this._isAlignmentAnimation && !skipOverridedCoordinates) {
557
+ if (iteration < MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS || !this.snapIfNecessary(v0)) {
558
+ this.move(isVertical, value, false, userAction);
559
+ }
560
+ }
561
+ else {
562
+ this.move(isVertical, value, false, userAction);
563
+ }
564
+ iteration++;
565
+ this._service.update(true);
566
+ }, onComplete: ({ value, timestamp }) => {
567
+ this._isAlignmentAnimation = false;
568
+ const v0 = calculateVelocity(position, value, timestamp);
569
+ if (alignmentAtComplete && !this._isAlignmentAnimation && !skipOverridedCoordinates) {
570
+ this.snapIfNecessary(v0);
571
+ }
572
+ else {
573
+ this.move(isVertical, value, false, userAction);
574
+ }
235
575
  this._$scrollEnd.next(userAction);
576
+ this._service.update(true);
236
577
  this.onAnimationComplete(value);
237
578
  },
238
579
  });
239
580
  }
581
+ getSnappedComponentSize() {
582
+ const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), sd = this.snappingDistance, snappingDistance = parseFloatOrPersentageValue(sd), isPersentageSnappingDistance = isPercentageValue(sd);
583
+ let size = null;
584
+ const scrollDirection = this._scrollDirection.get(), currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, currentComponentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition), currentComponentSize = isVertical ? currentComponentBounds?.height ?? 0 : currentComponentBounds?.width ?? 0;
585
+ switch (align) {
586
+ case SnapToItemAligns.START: {
587
+ const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition + offset);
588
+ if (!!componentBounds) {
589
+ const { width, height } = componentBounds, compSize = isVertical ? height : width;
590
+ size = compSize;
591
+ }
592
+ break;
593
+ }
594
+ case SnapToItemAligns.CENTER: {
595
+ const viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, offset = (currentComponentSize * .5 - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
596
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
597
+ if (!!componentBounds) {
598
+ const { width, height } = componentBounds, compSize = isVertical ? height : width;
599
+ size = compSize;
600
+ }
601
+ break;
602
+ }
603
+ case SnapToItemAligns.END: {
604
+ const viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
605
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
606
+ if (!!componentBounds) {
607
+ const { width, height } = componentBounds, compSize = isVertical ? height : width;
608
+ size = compSize;
609
+ }
610
+ break;
611
+ }
612
+ }
613
+ return size;
614
+ }
615
+ alignPosition(animated = true, force = false) {
616
+ if (!this.snapToItem || this._isAlignmentAnimation) {
617
+ return false;
618
+ }
619
+ this.stopScrolling(true);
620
+ const scrollDirection = this._scrollDirection.get() || (force ? 1 : 0);
621
+ if (scrollDirection === 0) {
622
+ return false;
623
+ }
624
+ const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, sd = this.snappingDistance, snappingDistance = parseFloatOrPersentageValue(sd), isPersentageSnappingDistance = isPercentageValue(sd);
625
+ let position = null, size = 0;
626
+ const currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, currentComponentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition), currentComponentSize = isVertical ? currentComponentBounds?.height ?? 0 : currentComponentBounds?.width ?? 0;
627
+ switch (align) {
628
+ case SnapToItemAligns.START: {
629
+ const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition + offset);
630
+ if (!!componentBounds) {
631
+ const { x, y, width, height } = componentBounds, startOffset = this.startOffset, alignmentStartOffset = this.alignmentStartOffset, componentPosition = isVertical ? y : x;
632
+ size = isVertical ? height : width;
633
+ const maxPos = (isVertical ? this.scrollHeight : this.scrollWidth) - (startOffset - alignmentStartOffset) + this._startLayoutOffset;
634
+ position = componentPosition - (startOffset - alignmentStartOffset) + this._startLayoutOffset;
635
+ if (this.isInfinity) {
636
+ if (position < 0 || position > maxPos) {
637
+ position = maxPos;
638
+ if (isVertical) {
639
+ this._y = this.scrollHeight;
640
+ }
641
+ else {
642
+ this._x = this.scrollWidth;
643
+ }
644
+ }
645
+ }
646
+ }
647
+ break;
648
+ }
649
+ case SnapToItemAligns.CENTER: {
650
+ const offset = (currentComponentSize * .5 - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
651
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
652
+ if (!!componentBounds) {
653
+ const { x, y, width, height } = componentBounds, startOffset = this.startOffset, alignmentStartOffset = this.alignmentStartOffset, componentPosition = isVertical ? y : x;
654
+ size = isVertical ? height : width;
655
+ const maxPos = (isVertical ? this.scrollHeight : this.scrollWidth) - size * .5 - viewportSize * .5 - (startOffset - alignmentStartOffset) * .5;
656
+ position = componentPosition + size * .5 - viewportSize * .5 - (startOffset - alignmentStartOffset) * .5 + this._startLayoutOffset;
657
+ if (this.isInfinity) {
658
+ if (position <= 0 || position > maxPos) {
659
+ position = maxPos;
660
+ if (isVertical) {
661
+ this._y = this.scrollHeight;
662
+ }
663
+ else {
664
+ this._x = this.scrollWidth;
665
+ }
666
+ }
667
+ }
668
+ }
669
+ break;
670
+ }
671
+ case SnapToItemAligns.END: {
672
+ const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
673
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
674
+ if (!!componentBounds) {
675
+ const { x, y, width, height } = componentBounds, componentPosition = isVertical ? y : x;
676
+ size = isVertical ? height : width;
677
+ position = componentPosition - viewportSize + this._startLayoutOffset;
678
+ }
679
+ break;
680
+ }
681
+ }
682
+ const cPos = (isVertical ? this.scrollTop : this.scrollLeft);
683
+ if (position !== null && position !== cPos) {
684
+ this.stopScrolling(true);
685
+ this.animate(cPos, position, animated ? this.animationParams.snapToItem : 1, easeOutQuad, false, false, true);
686
+ return true;
687
+ }
688
+ return false;
689
+ }
690
+ checkIntersectionComponent() {
691
+ const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
692
+ let componentId = null;
693
+ const currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset;
694
+ switch (align) {
695
+ case SnapToItemAligns.START: {
696
+ const maxPos = isVertical ? this.scrollHeight : this.scrollWidth, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition, maxPos);
697
+ if (!!componentBounds) {
698
+ const { id } = componentBounds;
699
+ componentId = id;
700
+ }
701
+ break;
702
+ }
703
+ case SnapToItemAligns.CENTER: {
704
+ const actualPos = currentPosition + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
705
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos, maxPos);
706
+ if (!!componentBounds) {
707
+ const { id } = componentBounds;
708
+ componentId = id;
709
+ }
710
+ break;
711
+ }
712
+ case SnapToItemAligns.END: {
713
+ const actualPos = currentPosition + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
714
+ const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos, maxPos);
715
+ if (!!componentBounds) {
716
+ const { id } = componentBounds;
717
+ componentId = id;
718
+ }
719
+ break;
720
+ }
721
+ }
722
+ if (componentId !== this._intersectionComponentId && componentId !== null) {
723
+ this._service.setIntersectionElementBySnapToItemAlign(componentId);
724
+ }
725
+ this._intersectionComponentId = componentId;
726
+ }
240
727
  onAnimationComplete(position) { }
241
728
  fireScroll(userAction = false) {
242
- this.stopScrolling();
243
729
  this._$updateScrollBar.next();
244
730
  this.emitScrollableEvent();
245
731
  this.fireScrollEvent(userAction);
246
732
  }
247
- scrollLimits(value) {
248
- const x = value !== undefined ? value : this._x, y = value !== undefined ? value : this._y, isVertical = this.isVertical();
249
- if (isVertical) {
250
- const yy = this.normalizeValue(y);
251
- if (y !== yy) {
252
- this.y = yy;
253
- return true;
733
+ scrollLimits(value, silent = false) {
734
+ if (!this.isInfinity) {
735
+ const x = value !== undefined ? value : this._x, y = value !== undefined ? value : this._y, isVertical = this._$isVertical.getValue();
736
+ if (isVertical) {
737
+ const yy = this.normalizeValue(y);
738
+ if (y !== yy) {
739
+ if (silent) {
740
+ this._y = yy;
741
+ this.refreshCoordinate(this._x, this._y);
742
+ }
743
+ else {
744
+ this.y = yy;
745
+ }
746
+ return true;
747
+ }
254
748
  }
255
- }
256
- else {
257
- const xx = this.normalizeValue(x);
258
- if (x !== xx) {
259
- this.x = xx;
260
- return true;
749
+ else {
750
+ const xx = this.normalizeValue(x);
751
+ if (x !== xx) {
752
+ if (silent) {
753
+ this._x = xx;
754
+ this.refreshCoordinate(this._x, this._y);
755
+ }
756
+ else {
757
+ this.x = xx;
758
+ }
759
+ return true;
760
+ }
261
761
  }
262
762
  }
263
763
  return false;
264
764
  }
265
765
  scroll(params) {
266
- const posX = params.x || params.left || 0, posY = params.y || params.top || 0, userAction = params.userAction ?? false, ease = params.ease || easeOutQuad, fireUpdate = params.fireUpdate ?? true, behavior = params.behavior ?? INSTANT, blending = params.blending ?? true, duration = params.duration ?? ANIMATION_DURATION, isVertical = this.direction() === ScrollerDirection.VERTICAL;
766
+ const posX = params.x || params.left || 0, posY = params.y || params.top || 0, userAction = params.userAction ?? false, snap = params.snap ?? true, normalize = params.normalize ?? true, ease = params.ease || easeOutQuad, fireUpdate = params.fireUpdate ?? true, behavior = params.behavior ?? INSTANT, blending = params.blending ?? true, force = params.force ?? false, duration = params.duration ?? ANIMATION_DURATION, isVertical = this._$isVertical.getValue();
267
767
  const x = this.normalizeValue(posX), y = this.normalizeValue(posY), prevX = this._x, prevY = this._y;
268
768
  if (behavior === AUTO || behavior === SMOOTH) {
269
769
  if (isVertical) {
@@ -279,12 +779,11 @@ export class NgScrollView extends BaseScrollView {
279
779
  }
280
780
  else {
281
781
  if (isVertical) {
282
- if (this._y !== y) {
782
+ if (this._y !== y || force) {
283
783
  if (!blending) {
284
- this.stopScrolling();
784
+ this.stopScrolling(force);
285
785
  }
286
- this.refreshY(y);
287
- this.y = y;
786
+ this.setY(y, snap, normalize);
288
787
  this.emitScrollableEvent();
289
788
  if (fireUpdate) {
290
789
  this.fireScrollEvent(userAction);
@@ -292,12 +791,11 @@ export class NgScrollView extends BaseScrollView {
292
791
  }
293
792
  }
294
793
  else {
295
- if (this._x !== x) {
794
+ if (this._x !== x || force) {
296
795
  if (!blending) {
297
- this.stopScrolling();
796
+ this.stopScrolling(force);
298
797
  }
299
- this.refreshX(x);
300
- this.x = x;
798
+ this.setX(x, snap, normalize);
301
799
  this.emitScrollableEvent();
302
800
  if (fireUpdate) {
303
801
  this.fireScrollEvent(userAction);
@@ -311,13 +809,9 @@ export class NgScrollView extends BaseScrollView {
311
809
  this.cdkScrollable.getElementRef()?.nativeElement?.dispatchEvent(SCROLL_EVENT);
312
810
  }
313
811
  }
314
- refreshX(value) {
315
- const scrollContent = this.scrollContent()?.nativeElement;
316
- scrollContent.style.transform = `translate3d(${(this._inversion ? 1 : -1) * value}px, 0, 0)`;
317
- }
318
- refreshY(value) {
319
- const scrollContent = this.scrollContent()?.nativeElement;
320
- scrollContent.style.transform = `translate3d(0, ${(this._inversion ? 1 : -1) * value}px, 0)`;
812
+ refreshCoordinate(x, y) {
813
+ const scrollContent = this.scrollContent?.nativeElement;
814
+ scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
321
815
  }
322
816
  fireScrollEvent(userAction) {
323
817
  this._$scroll.next(userAction);
@@ -325,15 +819,16 @@ export class NgScrollView extends BaseScrollView {
325
819
  onDragStart() { }
326
820
  reset(offset = 0) {
327
821
  this.stopScrolling();
328
- this.move(this.isVertical(), offset);
822
+ this.move(this._$isVertical.getValue(), offset);
329
823
  }
330
824
  ngOnDestroy() {
825
+ super.ngOnDestroy();
331
826
  if (this._animator) {
332
827
  this._animator.dispose();
333
828
  }
334
829
  }
335
830
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollView, deps: [], target: i0.ɵɵFactoryTarget.Component });
336
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: NgScrollView, selector: "ng-scroll-view", inputs: { scrollBehavior: { classPropertyName: "scrollBehavior", publicName: "scrollBehavior", isSignal: true, isRequired: false, transformFunction: null }, scrollingSettings: { classPropertyName: "scrollingSettings", publicName: "scrollingSettings", isSignal: true, isRequired: false, transformFunction: null }, overscrollEnabled: { classPropertyName: "overscrollEnabled", publicName: "overscrollEnabled", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "cdkScrollable", first: true, predicate: ["scrollViewport"], descendants: true, read: CdkScrollable }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
831
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NgScrollView, selector: "ng-scroll-view", inputs: { scrollBehavior: "scrollBehavior", overscrollEnabled: "overscrollEnabled", scrollingSettings: "scrollingSettings", snapToItem: "snapToItem", scrollingOneByOne: "scrollingOneByOne", snapToItemAlign: "snapToItemAlign", snappingDistance: "snappingDistance", animationParams: "animationParams" }, viewQueries: [{ propertyName: "cdkScrollable", first: true, predicate: ["scrollViewport"], descendants: true, read: CdkScrollable }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
337
832
  }
338
833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollView, decorators: [{
339
834
  type: Component,
@@ -344,5 +839,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
344
839
  }], ctorParameters: () => [], propDecorators: { cdkScrollable: [{
345
840
  type: ViewChild,
346
841
  args: ['scrollViewport', { read: CdkScrollable }]
842
+ }], scrollBehavior: [{
843
+ type: Input
844
+ }], overscrollEnabled: [{
845
+ type: Input
846
+ }], scrollingSettings: [{
847
+ type: Input
848
+ }], snapToItem: [{
849
+ type: Input
850
+ }], scrollingOneByOne: [{
851
+ type: Input
852
+ }], snapToItemAlign: [{
853
+ type: Input
854
+ }], snappingDistance: [{
855
+ type: Input
856
+ }], animationParams: [{
857
+ type: Input
347
858
  }] } });
348
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQVUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0YsT0FBTyxFQUNILGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFDaEosU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUM1QyxNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0gsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFDdkgsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUM1RyxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQUduRTs7Ozs7OztHQU9HO0FBS0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxjQUFjO0lBRW5DLGFBQWEsQ0FBNEI7SUFFekMsY0FBYyxHQUFHLEtBQUssQ0FBaUIsdUJBQXVCLENBQUMsQ0FBQztJQUVoRSxpQkFBaUIsR0FBRyxLQUFLLENBQXFCLDBCQUEwQixDQUFDLENBQUM7SUFFMUUsaUJBQWlCLEdBQUcsS0FBSyxDQUFVLDBCQUEwQixDQUFDLENBQUM7SUFFOUQsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFFeEUsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDbkMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFdEMsV0FBVyxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDdEMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFOUMsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUVqQixTQUFTLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUUzQixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRXRCLG9CQUFvQixHQUFXLENBQUMsQ0FBQztJQUV6QyxJQUFJLEtBQUssQ0FBQyxDQUFTO1FBQ2YsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDcEQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQyxhQUFhLENBQUMsQ0FDN0IsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQy9DLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUMsYUFBYSxDQUFDLENBQzdCLEVBQUUsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBRTFELGFBQWEsQ0FBQyxJQUFJLENBQ2Qsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNwQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxTQUFTLENBQWEsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDakUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDL0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQ2hFLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3ZDLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFLFFBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUYsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFZCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQWEsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDN0Usa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUN2QyxFQUNHLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQzVCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFTixRQUFRLENBQUMsSUFBSSxDQUNULGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sU0FBUyxDQUFhLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM5QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBcUIsQ0FBQztnQkFDdkMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsRUFDdEIsY0FBYyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFDbkQsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQixFQUN2QyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQW9CLEVBQzFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sU0FBUyxDQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3JFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDSixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ1YsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3pILGtCQUFrQixHQUFHLFVBQVUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2xELFNBQVMsR0FBRyxPQUFPLENBQUM7b0JBQ3BCLE9BQU8sSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFhLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQWEsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNKLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQ3RCLFNBQVMsR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUMvQixFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUNoRSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLGdCQUFnQixFQUFFLENBQUM7NEJBQzdDLE9BQU87d0JBQ1gsQ0FBQzt3QkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLENBQ0wsQ0FBQztnQkFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFZCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQWEsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDOUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUN2QyxFQUNHLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUMxQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3BDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRU4sUUFBUSxDQUFDLElBQUksQ0FDVCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3BDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoQixPQUFPLFNBQVMsQ0FBYSxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN2RSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3BDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQy9CLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFxQixDQUFDO2dCQUN2QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUN0QixjQUFjLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQy9HLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBb0IsRUFBRSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQW9CLEVBQ25GLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sU0FBUyxDQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3JFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDcEMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNWLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUN6SCxrQkFBa0IsR0FBRyxVQUFVLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsRCxTQUFTLEdBQUcsT0FBTyxDQUFDO29CQUNwQixPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFhLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUN0QixTQUFTLEdBQUcsT0FBTyxHQUFHLFNBQVMsRUFDL0IsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFDaEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDOzRCQUM3QyxPQUFPO3dCQUNYLENBQUM7d0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzFFLENBQUMsQ0FBQyxDQUNMLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQ0wsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFtQixFQUFFLENBQWdDLEVBQUUsU0FBa0IsRUFBRSxjQUFzQixFQUFFLFNBQWlCLEVBQzFJLGtCQUEwQixFQUFFLE9BQWdDLEVBQUUsVUFBbUM7UUFFakcsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFDL0ksVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsRUFDNUgsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUM3SCxTQUFTLEdBQUcsT0FBTyxHQUFHLFNBQVMsRUFBRSxXQUFXLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLFVBQVUsRUFDN0csRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUM1QixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLHFCQUFxQixDQUFDLENBQVEsRUFBRSxHQUFXLEVBQUUsS0FBYTtRQUM5RCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLDBCQUEwQixFQUFFLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDZixDQUFDLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLENBQVE7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQ0QsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDTCxDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBZ0MsRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxjQUFzQixFQUFFO1FBQ2xILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUvRixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUN2SCxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUNyRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEQsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNuRCxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8scUJBQXFCLENBQUMsVUFBbUMsRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxjQUFzQixFQUFFO1FBQ3pILFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNsRyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLE1BQW9DLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxTQUFTO1lBQ2IsQ0FBQztZQUNELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ04sTUFBTSxFQUFFLEdBQUcsU0FBUyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMxSixJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2IsU0FBUyxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLGVBQWUsSUFBSSxjQUFjLENBQUMsQ0FBQztRQUNoRixPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyxJQUFJLENBQUMsVUFBbUIsRUFBRSxRQUFnQixFQUFFLFdBQW9CLEtBQUssRUFBRSxhQUFzQixLQUFLLEVBQUUsYUFBc0IsSUFBSTtRQUNwSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxVQUFtQixFQUFFLFFBQWdCLEVBQUUsRUFBVSxFQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsU0FBaUI7UUFDdEgsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLElBQUksSUFBSSxFQUM3QyxRQUFRLEdBQUcsUUFBUSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxXQUFXLElBQUksWUFBWSxFQUN4RixPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsV0FBVyxJQUFJLFFBQVEsRUFDM0QsV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQ3hHLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLEdBQUcsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFDM0gsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQzNELFNBQVMsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFDL0MsYUFBYSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxRQUFRLEVBQzlELFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNuRSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUM5RCxNQUFNLEdBQUcsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMxRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsT0FBTyxDQUFDLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRSxRQUFRLEdBQUcsa0JBQWtCLEVBQUUsaUJBQXlCLFdBQVcsRUFDdkgsYUFBc0IsS0FBSztRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssaUJBQWlCLENBQUMsUUFBUSxDQUFDO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBQ25CLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUTtZQUM5QixjQUFjO1lBQ2QsWUFBWSxFQUFFLEdBQUcsRUFBRTtnQkFDZixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxRQUFnQixJQUFJLENBQUM7SUFFbkQsVUFBVSxDQUFDLGFBQXNCLEtBQUs7UUFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBMEI7UUFDbkMsTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzSCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNaLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUF1QjtRQUMxQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUNyQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFDbEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxFQUN2QyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksRUFDdEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksT0FBTyxFQUNyQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQ2xDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLGtCQUFrQixFQUNoRCxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUVqRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUMvQixDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFDN0IsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNiLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDYixJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3pCLENBQUM7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ1gsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzNCLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDckMsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDekIsQ0FBQztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDWCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNyQyxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFUyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRixDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUErQixDQUFDO1FBQzVFLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUM7SUFDakcsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUErQixDQUFDO1FBQzVFLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQztJQUNqRyxDQUFDO0lBRVMsZUFBZSxDQUFDLFVBQW1CO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxXQUFXLEtBQUssQ0FBQztJQUUzQixLQUFLLENBQUMsU0FBaUIsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO3dHQTFjUSxZQUFZOzRGQUFaLFlBQVkseW1CQUNnQixhQUFhLG9EQUh4QyxFQUFFOzs0RkFFSCxZQUFZO2tCQUp4QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxFQUFFO2lCQUNmO3dEQUdZLGFBQWE7c0JBRHJCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgaW5qZWN0LCBpbnB1dCwgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZyb21FdmVudCwgbWFwLCBvZiwgcmFjZSwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTY3JvbGxlckRpcmVjdGlvbiB9IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBBTklNQVRPUl9NSU5fVElNRVNUQU1QLCBBbmltYXRvciwgRWFzaW5nLCBlYXNlT3V0UXVhZCB9IGZyb20gJy4uLy4uL3V0aWxzL2FuaW1hdG9yJztcclxuaW1wb3J0IHtcclxuICAgIEJFSEFWSU9SX0lOU1RBTlQsIERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVELCBERUZBVUxUX1NDUk9MTF9CRUhBVklPUiwgREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1MsIElOVEVSQUNUSVZFLCBNT1VTRV9ET1dOLCBNT1VTRV9NT1ZFLCBNT1VTRV9VUCxcclxuICAgIFRPVUNIX0VORCwgVE9VQ0hfTU9WRSwgVE9VQ0hfU1RBUlQsIFdIRUVMLFxyXG59IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHsgSVNjcm9sbFRvUGFyYW1zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICAgIEFOSU1BVElPTl9EVVJBVElPTiwgQVVUTywgRFVSQVRJT04sIEZSSUNUSU9OX0ZPUkNFLCBJTlNUQU5ULCBMRUZULCBNQVNTLCBNQVhfRElTVCwgTUFYX0RVUkFUSU9OLCBNQVhfVkVMT0NJVFlfVElNRVNUQU1QLFxyXG4gICAgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04sIFNDUk9MTF9FVkVOVCwgU0NST0xMX1ZJRVdfTk9STUFMSVpFX1ZBTFVFX0ZST01fWkVSTywgU01PT1RILCBTUEVFRF9TQ0FMRSwgVE9QLFxyXG59IGZyb20gJy4vY29uc3QnO1xyXG5pbXBvcnQgeyBjYWxjdWxhdGVEaXJlY3Rpb24gfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgQmFzZVNjcm9sbFZpZXcgfSBmcm9tICcuL2Jhc2UvYmFzZS1zY3JvbGwtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJU2Nyb2xsaW5nU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuXHJcbi8qKlxyXG4gKiBOZ1Njcm9sbFZpZXdcclxuICogTWF4aW11bSBwZXJmb3JtYW5jZSBmb3IgZXh0cmVtZWx5IGxhcmdlIGxpc3RzLlxyXG4gKiBJdCBpcyBiYXNlZCBvbiBhbGdvcml0aG1zIGZvciB2aXJ0dWFsaXphdGlvbiBvZiBzY3JlZW4gb2JqZWN0cy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTgueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC12aWV3L25nLXNjcm9sbC12aWV3LmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgQWxleGFuZHJvdmljaCBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZy1zY3JvbGwtdmlldycsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbFZpZXcgZXh0ZW5kcyBCYXNlU2Nyb2xsVmlldyB7XHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxWaWV3cG9ydCcsIHsgcmVhZDogQ2RrU2Nyb2xsYWJsZSB9KVxyXG4gICAgcmVhZG9ubHkgY2RrU2Nyb2xsYWJsZTogQ2RrU2Nyb2xsYWJsZSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICByZWFkb25seSBzY3JvbGxCZWhhdmlvciA9IGlucHV0PFNjcm9sbEJlaGF2aW9yPihERUZBVUxUX1NDUk9MTF9CRUhBVklPUik7XHJcblxyXG4gICAgcmVhZG9ubHkgc2Nyb2xsaW5nU2V0dGluZ3MgPSBpbnB1dDxJU2Nyb2xsaW5nU2V0dGluZ3M+KERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTKTtcclxuXHJcbiAgICByZWFkb25seSBvdmVyc2Nyb2xsRW5hYmxlZCA9IGlucHV0PGJvb2xlYW4+KERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVEKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZVZhbHVlRnJvbVplcm8gPSBpbmplY3QoU0NST0xMX1ZJRVdfTk9STUFMSVpFX1ZBTFVFX0ZST01fWkVSTyk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGwgPSB0aGlzLl8kc2Nyb2xsLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbEVuZCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsRW5kID0gdGhpcy5fJHNjcm9sbEVuZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcml2YXRlIF9zdGFydFBvc2l0aW9uID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2FuaW1hdG9yID0gbmV3IEFuaW1hdG9yKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbnRlcmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfb3ZlcnNjcm9sbEl0ZXJhdGlvbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBzZXQgZGVsdGEodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiArPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgY29uc3QgJHZpZXdwb3J0ID0gdG9PYnNlcnZhYmxlKHRoaXMuc2Nyb2xsVmlld3BvcnQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICAgICAgbWFwKHYgPT4gdiEubmF0aXZlRWxlbWVudCksXHJcbiAgICAgICAgKSwgJGNvbnRlbnQgPSB0b09ic2VydmFibGUodGhpcy5zY3JvbGxDb250ZW50KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgICAgIG1hcCh2ID0+IHYhLm5hdGl2ZUVsZW1lbnQpLFxyXG4gICAgICAgICksICR3aGVlbEVtaXR0ZXIgPSB0aGlzLl9pbnZlcnNpb24gPyAkdmlld3BvcnQgOiAkY29udGVudDtcclxuXHJcbiAgICAgICAgJHdoZWVsRW1pdHRlci5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oY29udGVudCwgV0hFRUwsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLmlzVmVydGljYWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnkgOiB0aGlzLngsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGlzVmVydGljYWwgPyBlLmRlbHRhWSA6IGUuZGVsdGFYLCBkcCA9IChzdGFydFBvcyArIGRlbHRhKSwgcG9zaXRpb24gPSBkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbCh7IFtpc1ZlcnRpY2FsID8gVE9QIDogTEVGVF06IHBvc2l0aW9uLCBiZWhhdmlvcjogSU5TVEFOVCwgdXNlckFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRtb3VzZVVwID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICksXHJcbiAgICAgICAgICAgICRtb3VzZURyYWdDYW5jZWwgPSAkbW91c2VVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhYmJpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfRE9XTiwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVEVSQUNUSVZFKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzaW9uID0gdGhpcy5faW52ZXJzaW9uLCBpc1ZlcnRpY2FsID0gdGhpcy5pc1ZlcnRpY2FsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmFiYmluZy5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb24gPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS5jbGllbnRZIDogZS5jbGllbnRYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdGllcyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCgkbW91c2VEcmFnQ2FuY2VsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24sIGN1cnJlbnRQb3MsIGVuZFRpbWUsIHNjcm9sbERlbHRhIH0gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWwsIGUsIGludmVyc2lvbiwgc3RhcnRDbGllbnRQb3MsIHN0YXJ0VGltZSwgcHJldkNsaWVudFBvc2l0aW9uLCBvZmZzZXRzLCB2ZWxvY2l0aWVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb24gPSBjdXJyZW50UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBlbmRUaW1lIC0gc3RhcnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhMCB9ID0gdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmFiYmluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsQmVoYXZpb3IoKSA9PT0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCwgcG9zaXRpb24sIDAsIHYwLCBhMCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdG91Y2hVcCA9IGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgKSxcclxuICAgICAgICAgICAgJHRvdWNoQ2FuY2VsZXIgPSAkdG91Y2hVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhYmJpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfU1RBUlQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoSU5URVJBQ1RJVkUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNpb24gPSB0aGlzLl9pbnZlcnNpb24sIGlzVmVydGljYWwgPSB0aGlzLmlzVmVydGljYWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyYWJiaW5nLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDbGllbnRQb3NpdGlvbiA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyA9IGlzVmVydGljYWwgPyBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFkgOiBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksIHZlbG9jaXRpZXMgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJHRvdWNoQ2FuY2VsZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwb3NpdGlvbiwgY3VycmVudFBvcywgZW5kVGltZSwgc2Nyb2xsRGVsdGEgfSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oaXNWZXJ0aWNhbCwgZSwgaW52ZXJzaW9uLCBzdGFydENsaWVudFBvcywgc3RhcnRUaW1lLCBwcmV2Q2xpZW50UG9zaXRpb24sIG9mZnNldHMsIHZlbG9jaXRpZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDbGllbnRQb3NpdGlvbiA9IGN1cnJlbnRQb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHBvc2l0aW9uLCB0cnVlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWNlKFtmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHYwIH0gPSB0aGlzLmNhbGN1bGF0ZVZlbG9jaXR5KG9mZnNldHMsIHNjcm9sbERlbHRhLCB0aW1lc3RhbXApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTAgfSA9IHRoaXMuY2FsY3VsYXRlQWNjZWxlcmF0aW9uKHZlbG9jaXRpZXMsIHYwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhYmJpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbEJlaGF2aW9yKCkgPT09IEJFSEFWSU9SX0lOU1RBTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVXaXRoQWNjZWxlcmF0aW9uKGlzVmVydGljYWwsIHBvc2l0aW9uLCAwLCB2MCwgYTAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyLCBvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgdmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT5cclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsIGRlbHRhID0gKGludmVyc2lvbiA/IC0xIDogMSkgKiAoc3RhcnRDbGllbnRQb3MgLSBjdXJyZW50UG9zKSxcclxuICAgICAgICAgICAgZHAgPSB0aGlzLl9zdGFydFBvc2l0aW9uICsgZGVsdGEsIHBvc2l0aW9uID0gTWF0aC5yb3VuZChkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwKSwgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsIHNjcm9sbERlbHRhID0gcHJldkNsaWVudFBvc2l0aW9uID09PSAwID8gMCA6IHByZXZDbGllbnRQb3NpdGlvbiAtIGN1cnJlbnRQb3MsXHJcbiAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgcG9zaXRpb24sIGN1cnJlbnRQb3MsIGVuZFRpbWUsIHNjcm9sbERlbHRhIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYW5jZWxPdmVyc2Nyb2xsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vdmVyc2Nyb2xsRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja092ZXJzY3JvbGxCeUF4aXMoZTogRXZlbnQsIHBvczogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IE1hdGguYWJzKHBvcyk7XHJcbiAgICAgICAgaWYgKHAgPiAwICYmIHAgPCBsaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uIDwgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vdmVyc2Nyb2xsRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc1ZlcnRpY2FsKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feSwgdGhpcy5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsQnlBeGlzKGUsIHRoaXMuX3gsIHRoaXMuc2Nyb2xsV2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVZlbG9jaXR5KG9mZnNldHM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBkZWx0YTogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlciwgaW5kZXhPZmZzZXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICAgICAgb2Zmc2V0cy5wdXNoKFtkZWx0YSwgdGltZXN0YW1wIDwgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCA/IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgOiB0aW1lc3RhbXBdKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuID0gb2Zmc2V0cy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKG9mZnNldHMpLFxyXG4gICAgICAgICAgICBzcGVlZFNjYWxlID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncygpPy5zcGVlZFNjYWxlID8/IFNQRUVEX1NDQUxFO1xyXG4gICAgICAgIGxldCB2U3VtID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleCwgbCA9IG9mZnNldHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHAwID0gb2Zmc2V0c1tpXTtcclxuICAgICAgICAgICAgaWYgKGxhc3RWU2lnbiAhPT0gTWF0aC5zaWduKHAwWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHYwID0gKHAwWzFdICE9PSAwID8gbGFzdFZTaWduICogTWF0aC5hYnMocDBbMF0gLyBwMFsxXSkgKiBzcGVlZFNjYWxlIDogMCk7XHJcbiAgICAgICAgICAgIHZTdW0gKz0gTWF0aC5zaWduKHYwKSAqIE1hdGgucG93KHYwLCA0KSAqIC4wMDM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsID0gTWF0aC5taW4ob2Zmc2V0cy5sZW5ndGgsIGluZGV4T2Zmc2V0KSwgdjAgPSBsID4gMCA/ICh2U3VtIC8gbCkgOiAwO1xyXG4gICAgICAgIHJldHVybiB7IHYwIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sIGRlbHRhOiBudW1iZXIsIHRpbWVzdGFtcDogbnVtYmVyLCBpbmRleE9mZnNldDogbnVtYmVyID0gMTApIHtcclxuICAgICAgICB2ZWxvY2l0aWVzLnB1c2goW2RlbHRhLCB0aW1lc3RhbXAgPCBBTklNQVRPUl9NSU5fVElNRVNUQU1QID8gQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCA6IHRpbWVzdGFtcF0pO1xyXG4gICAgICAgIGNvbnN0IGxlbiA9IHZlbG9jaXRpZXMubGVuZ3RoLCBzdGFydEluZGV4ID0gbGVuID4gaW5kZXhPZmZzZXQgPyBsZW4gLSBpbmRleE9mZnNldCA6IDA7XHJcbiAgICAgICAgbGV0IGFTdW0gPSAwLCBwcmV2VjA6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGl0ZXJhdGlvbiA9IDAsIGxhc3RWU2lnbiA9IGNhbGN1bGF0ZURpcmVjdGlvbih2ZWxvY2l0aWVzKTtcclxuICAgICAgICBjb25zdCBtYXNzID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncygpPy5tYXNzID8/IE1BU1M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSB2ZWxvY2l0aWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2MDAgPSBwcmV2VjAsIHYwMSA9IHZlbG9jaXRpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbih2MDFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhMCA9IHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAgPyAodjAwWzFdICE9PSAwID8gKGxhc3RWU2lnbiAqIE1hdGguYWJzKE1hdGguYWJzKHYwMVswXSkgLSBNYXRoLmFicyh2MDBbMF0pKSkgLyBNYXRoLmFicyh2MDBbMV0pIDogMCkgOiAwLjE7XHJcbiAgICAgICAgICAgICAgICBhU3VtID0gKGFTdW0gKiBtYXNzKSArIGEwO1xyXG4gICAgICAgICAgICAgICAgcHJldlYwID0gdjAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZWMCA9IHYwMTtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhMCA9IGFTdW0gKiAodGhpcy5zY3JvbGxpbmdTZXR0aW5ncygpPy5mcmljdGlvbmFsRm9yY2UgPz8gRlJJQ1RJT05fRk9SQ0UpO1xyXG4gICAgICAgIHJldHVybiB7IGEwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNjcm9sbGluZygpIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1vdmUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgYmxlbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBmaXJlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsKHsgW2lzVmVydGljYWwgPyBUT1AgOiBMRUZUXTogcG9zaXRpb24sIGJlaGF2aW9yOiBJTlNUQU5ULCBibGVuZGluZywgdXNlckFjdGlvbiwgZmlyZVVwZGF0ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgdjA6IG51bWJlciwgdjogbnVtYmVyLCBhMDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChhMCAhPT0gMCAmJiB0aW1lc3RhbXAgPCBNQVhfVkVMT0NJVFlfVElNRVNUQU1QKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGR2U2lnbiA9IE1hdGguc2lnbih2KSxcclxuICAgICAgICAgICAgICAgIG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzKCk/Lm1hc3MgPz8gTUFTUyxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gRFVSQVRJT04sIG1heER1cmF0aW9uID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncygpPy5tYXhEdXJhdGlvbiA/PyBNQVhfRFVSQVRJT04sXHJcbiAgICAgICAgICAgICAgICBtYXhEaXN0ID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncygpPy5tYXhEaXN0YW5jZSA/PyBNQVhfRElTVCxcclxuICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gZHZTaWduICogbWF4RGlzdCwgcyA9IChkdlNpZ24gKiBNYXRoLmFicygoYTAgKiBNYXRoLnBvdyhkdXJhdGlvbiwgMikpICogLjUpIC8gMTAwMCkgLyBtYXNzLFxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhzKSA8IG1heERpc3QgPyBzIDogbWF4RGlzdGFuY2UsIHBvc2l0aW9uV2l0aFZlbG9jaXR5ID0gcG9zaXRpb24gKyAodGhpcy5faW52ZXJzaW9uID8gLTEgOiAxKSAqIGRpc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgdm1heCA9IE1hdGgubWF4KE1hdGguYWJzKHYwKSwgTWF0aC5hYnModikpLFxyXG4gICAgICAgICAgICAgICAgYWQgPSBNYXRoLmFicyh2bWF4ICE9PSAwID8gTWF0aC5zcXJ0KHZtYXgpIDogMCkgKiAxMCAvIG1hc3MsXHJcbiAgICAgICAgICAgICAgICBhRHVyYXRpb24gPSBhZCA8IG1heER1cmF0aW9uID8gYWQgOiBtYXhEdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54O1xyXG4gICAgICAgICAgICB0aGlzLmFuaW1hdGUoc3RhcnRQb3NpdGlvbiwgTWF0aC5yb3VuZChwb3NpdGlvbldpdGhWZWxvY2l0eSksIGFEdXJhdGlvbiwgZWFzZU91dFF1YWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLmRpcmVjdGlvbigpID09PSBTY3JvbGxlckRpcmVjdGlvbi5WRVJUSUNBTCxcclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID8gMCA6IHRoaXMuc3RhcnRPZmZzZXQoKSxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlIDw9IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB2YWx1ZSA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYW5pbWF0ZShzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uID0gQU5JTUFUSU9OX0RVUkFUSU9OLCBlYXNpbmdGdW5jdGlvbjogRWFzaW5nID0gZWFzZU91dFF1YWQsXHJcbiAgICAgICAgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuZGlyZWN0aW9uKCkgPT09IFNjcm9sbGVyRGlyZWN0aW9uLlZFUlRJQ0FMO1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgZHVyYXRpb24sXHJcbiAgICAgICAgICAgIGVhc2luZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICBnZXRQcm9wVmFsdWU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3g7XHJcbiAgICAgICAgICAgIH0sIG9uVXBkYXRlOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgdmFsdWUsIGZhbHNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgfSwgb25Db21wbGV0ZTogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGUodmFsdWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkFuaW1hdGlvbkNvbXBsZXRlKHBvc2l0aW9uOiBudW1iZXIpIHsgfVxyXG5cclxuICAgIGZpcmVTY3JvbGwodXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgdGhpcy5fJHVwZGF0ZVNjcm9sbEJhci5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsTGltaXRzKHZhbHVlPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgeCA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuX3gsIHkgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB0aGlzLl95LCBpc1ZlcnRpY2FsID0gdGhpcy5pc1ZlcnRpY2FsKCk7XHJcbiAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgY29uc3QgeXkgPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHkpO1xyXG4gICAgICAgICAgICBpZiAoeSAhPT0geXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueSA9IHl5O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB4eCA9IHRoaXMubm9ybWFsaXplVmFsdWUoeCk7XHJcbiAgICAgICAgICAgIGlmICh4ICE9PSB4eCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy54ID0geHg7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsKHBhcmFtczogSVNjcm9sbFRvUGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgcG9zWCA9IHBhcmFtcy54IHx8IHBhcmFtcy5sZWZ0IHx8IDAsXHJcbiAgICAgICAgICAgIHBvc1kgPSBwYXJhbXMueSB8fCBwYXJhbXMudG9wIHx8IDAsXHJcbiAgICAgICAgICAgIHVzZXJBY3Rpb24gPSBwYXJhbXMudXNlckFjdGlvbiA/PyBmYWxzZSxcclxuICAgICAgICAgICAgZWFzZSA9IHBhcmFtcy5lYXNlIHx8IGVhc2VPdXRRdWFkLFxyXG4gICAgICAgICAgICBmaXJlVXBkYXRlID0gcGFyYW1zLmZpcmVVcGRhdGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgYmVoYXZpb3IgPSBwYXJhbXMuYmVoYXZpb3IgPz8gSU5TVEFOVCxcclxuICAgICAgICAgICAgYmxlbmRpbmcgPSBwYXJhbXMuYmxlbmRpbmcgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb24gPz8gQU5JTUFUSU9OX0RVUkFUSU9OLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsID0gdGhpcy5kaXJlY3Rpb24oKSA9PT0gU2Nyb2xsZXJEaXJlY3Rpb24uVkVSVElDQUw7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHBvc1gpLFxyXG4gICAgICAgICAgICB5ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShwb3NZKSxcclxuICAgICAgICAgICAgcHJldlggPSB0aGlzLl94LFxyXG4gICAgICAgICAgICBwcmV2WSA9IHRoaXMuX3k7XHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSBBVVRPIHx8IGJlaGF2aW9yID09PSBTTU9PVEgpIHtcclxuICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2WSAhPT0geSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShwcmV2WSwgeSwgZHVyYXRpb24sIGVhc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZYICE9PSB4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRlKHByZXZYLCB4LCBkdXJhdGlvbiwgZWFzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3kgIT09IHkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJsZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hZKHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueSA9IHk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ggIT09IHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJsZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hYKHgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBlbWl0U2Nyb2xsYWJsZUV2ZW50KCkge1xyXG4gICAgICAgIGlmICghIXRoaXMuY2RrU2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNka1Njcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5kaXNwYXRjaEV2ZW50KFNDUk9MTF9FVkVOVCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hYKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxDb250ZW50ID0gdGhpcy5zY3JvbGxDb250ZW50KCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgc2Nyb2xsQ29udGVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHsodGhpcy5faW52ZXJzaW9uID8gMSA6IC0xKSAqIHZhbHVlfXB4LCAwLCAwKWA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFkodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBzY3JvbGxDb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgwLCAkeyh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogdmFsdWV9cHgsIDApYDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb246IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl8kc2Nyb2xsLm5leHQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uRHJhZ1N0YXJ0KCkgeyB9XHJcblxyXG4gICAgcmVzZXQob2Zmc2V0OiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgdGhpcy5tb3ZlKHRoaXMuaXNWZXJ0aWNhbCgpLCBvZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9hbmltYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFVLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFDSCxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSw0QkFBNEIsRUFDN0gsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFDaEksVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQ2xFLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDSCxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHVDQUF1QyxFQUN4SSxzQkFBc0IsRUFBRSwwQkFBMEIs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LFFBQVEsRUFBRSxFQUFFO2lCQUNmO3dEQUdZLGFBQWE7c0JBRHJCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQVFoRCxjQUFjO3NCQURqQixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBV0YsVUFBVTtzQkFEYixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLO2dCQVdGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkZWxheSwgZmlsdGVyLCBmcm9tRXZlbnQsIG1hcCwgb2YsIHJhY2UsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCwgQW5pbWF0b3IsIEVhc2luZywgZWFzZU91dFF1YWQgfSBmcm9tICcuLi8uLi91dGlscy9hbmltYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgICBCRUhBVklPUl9JTlNUQU5ULCBERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMsIERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVELCBERUZBVUxUX1NDUk9MTF9CRUhBVklPUiwgREVGQVVMVF9TQ1JPTExJTkdfT05FX0JZX09ORSxcclxuICAgIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLCBERUZBVUxUX1NOQVBfVE9fSVRFTSwgREVGQVVMVF9TTkFQX1RPX0lURU1fQUxJR04sIERFRkFVTFRfU05BUFBJTkdfRElTVEFOQ0UsIElOVEVSQUNUSVZFLCBNT1VTRV9ET1dOLFxyXG4gICAgTU9VU0VfTU9WRSwgTU9VU0VfVVAsIFRPVUNIX0VORCwgVE9VQ0hfTU9WRSwgVE9VQ0hfU1RBUlQsIFdIRUVMLFxyXG59IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHsgSVNjcm9sbFRvUGFyYW1zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICAgIEFOSU1BVElPTl9EVVJBVElPTiwgQVVUTywgRFVSQVRJT04sIEZSSUNUSU9OX0ZPUkNFLCBJTlNUQU5ULCBMRUZULCBNQVNTLCBNQVhfRElTVCwgTUFYX0RVUkFUSU9OLCBNQVhfSVRFUkFUSU9OU19GT1JfQVZFUkFHRV9DQUxDVUxBVElPTlMsXHJcbiAgICBNQVhfVkVMT0NJVFlfVElNRVNUQU1QLCBPVkVSU0NST0xMX1NUQVJUX0lURVJBVElPTiwgU0NST0xMX0VWRU5ULCBTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPLCBTTU9PVEgsIFNQRUVEX1NDQUxFLCBUT1AsXHJcbn0gZnJvbSAnLi9jb25zdCc7XHJcbmltcG9ydCB7IGNhbGN1bGF0ZURpcmVjdGlvbiwgbWF0cml4M2QgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgQmFzZVNjcm9sbFZpZXcgfSBmcm9tICcuL2Jhc2UvYmFzZS1zY3JvbGwtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQW5pbWF0aW9uUGFyYW1zLCBJU2Nyb2xsaW5nU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU25hcFRvSXRlbUFsaWducyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgTmdWaXJ0dWFsTGlzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9uZy12aXJ0dWFsLWxpc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IElkLCBTbmFwcGluZ0Rpc3RhbmNlLCBTbmFwVG9JdGVtQWxpZ24gfSBmcm9tICcuLi8uLi90eXBlcyc7XHJcbmltcG9ydCB7IHBhcnNlRmxvYXRPclBlcnNlbnRhZ2VWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3BhcnNlLWZsb2F0LW9yLXBlcnNlbnRhZ2UtdmFsdWUnO1xyXG5pbXBvcnQgeyBpc1BlcmNlbnRhZ2VWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2lzLXBlcnNlbnRhZ2UtdmFsdWUnO1xyXG5pbXBvcnQgeyBTY3JvbGxpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi91dGlscy9zY3JvbGxpbmctZGlyZWN0aW9uJztcclxuaW1wb3J0IHsgY2FsY3VsYXRlVmVsb2NpdHkgfSBmcm9tICcuL3V0aWxzL2NhbGN1bGF0ZS12ZWxvY2l0eSc7XHJcblxyXG4vKipcclxuICogTmdTY3JvbGxWaWV3XHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE4LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEFsZXhhbmRyb3ZpY2ggR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmctc2Nyb2xsLXZpZXcnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTY3JvbGxWaWV3IGV4dGVuZHMgQmFzZVNjcm9sbFZpZXcge1xyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsVmlld3BvcnQnLCB7IHJlYWQ6IENka1Njcm9sbGFibGUgfSlcclxuICAgIHJlYWRvbmx5IGNka1Njcm9sbGFibGU6IENka1Njcm9sbGFibGUgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXJ2aWNlID0gaW5qZWN0KE5nVmlydHVhbExpc3RTZXJ2aWNlKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxCZWhhdmlvciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Nyb2xsQmVoYXZpb3I+KERFRkFVTFRfU0NST0xMX0JFSEFWSU9SKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxCZWhhdmlvciA9IHRoaXMuXyRzY3JvbGxCZWhhdmlvci5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsQmVoYXZpb3IodjogU2Nyb2xsQmVoYXZpb3IpIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNjcm9sbEJlaGF2aW9yLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEJlaGF2aW9yLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbEJlaGF2aW9yKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbEJlaGF2aW9yLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRvdmVyc2Nyb2xsRW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9PVkVSU0NST0xMX0VOQUJMRUQpO1xyXG4gICAgcmVhZG9ubHkgJG92ZXJzY3JvbGxFbmFibGVkID0gdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBvdmVyc2Nyb2xsRW5hYmxlZCh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBvdmVyc2Nyb2xsRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsaW5nU2V0dGluZ3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElTY3JvbGxpbmdTZXR0aW5ncz4oREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1MpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbGluZ1NldHRpbmdzID0gdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzY3JvbGxpbmdTZXR0aW5ncyh2OiBJU2Nyb2xsaW5nU2V0dGluZ3MpIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbGluZ1NldHRpbmdzKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzbmFwVG9JdGVtID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NOQVBfVE9fSVRFTSk7XHJcbiAgICByZWFkb25seSAkc25hcFRvSXRlbSA9IHRoaXMuXyRzbmFwVG9JdGVtLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzbmFwVG9JdGVtKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc25hcFRvSXRlbS5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzbmFwVG9JdGVtKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbGluZ09uZUJ5T25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NDUk9MTElOR19PTkVfQllfT05FKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxpbmdPbmVCeU9uZSA9IHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsaW5nT25lQnlPbmUodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc2Nyb2xsaW5nT25lQnlPbmUoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNuYXBUb0l0ZW1BbGlnbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U25hcFRvSXRlbUFsaWduPihERUZBVUxUX1NOQVBfVE9fSVRFTV9BTElHTik7XHJcbiAgICByZWFkb25seSAkc25hcFRvSXRlbUFsaWduID0gdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc25hcFRvSXRlbUFsaWduKHY6IFNuYXBUb0l0ZW1BbGlnbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc25hcFRvSXRlbUFsaWduLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzbmFwVG9JdGVtQWxpZ24oKSB7IHJldHVybiB0aGlzLl8kc25hcFRvSXRlbUFsaWduLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzbmFwcGluZ0Rpc3RhbmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTbmFwcGluZ0Rpc3RhbmNlPihERUZBVUxUX1NOQVBQSU5HX0RJU1RBTkNFKTtcclxuICAgIHJlYWRvbmx5ICRzbmFwcGluZ0Rpc3RhbmNlID0gdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNuYXBwaW5nRGlzdGFuY2UodjogU25hcHBpbmdEaXN0YW5jZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzbmFwcGluZ0Rpc3RhbmNlLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNuYXBwaW5nRGlzdGFuY2UoKSB7IHJldHVybiB0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kYW5pbWF0aW9uUGFyYW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQW5pbWF0aW9uUGFyYW1zPihERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMpO1xyXG4gICAgcmVhZG9ubHkgJGFuaW1hdGlvblBhcmFtcyA9IHRoaXMuXyRhbmltYXRpb25QYXJhbXMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGFuaW1hdGlvblBhcmFtcyh2OiBJQW5pbWF0aW9uUGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGFuaW1hdGlvblBhcmFtcygpIHsgcmV0dXJuIHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplVmFsdWVGcm9tWmVybyA9IGluamVjdChTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsc1RvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zY3JvbGxEaXJlY3Rpb24gPSBuZXcgU2Nyb2xsaW5nRGlyZWN0aW9uKCk7XHJcbiAgICBnZXQgc2Nyb2xsRGlyZWN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0ICRzY3JvbGxEaXJlY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uJGRpcmVjdGlvbjsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHdoZWVsID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG4gICAgcmVhZG9ubHkgJHdoZWVsID0gdGhpcy5fJHdoZWVsLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsID0gdGhpcy5fJHNjcm9sbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxFbmQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbEVuZCA9IHRoaXMuXyRzY3JvbGxFbmQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF92ZWxvY2l0aWVzOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kdmVsb2NpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgICBwcm90ZWN0ZWQgJHZlbG9jaXR5ID0gdGhpcy5fJHZlbG9jaXR5LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgZ2V0IHZlbG9jaXR5KCkgeyByZXR1cm4gdGhpcy5fJHZlbG9jaXR5LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRhdmVyYWdlVmVsb2NpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgICBwcm90ZWN0ZWQgJGF2ZXJhZ2VWZWxvY2l0eSA9IHRoaXMuXyRhdmVyYWdlVmVsb2NpdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBnZXQgYXZlcmFnZVZlbG9jaXR5KCkgeyByZXR1cm4gdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgIHByaXZhdGUgX21lYXN1cmVWZWxvY2l0eUxhc3RQb3NpdGlvbjogbnVtYmVyID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IHRoaXMuX3kgOiB0aGlzLl94O1xyXG5cclxuICAgIHByaXZhdGUgX3N0YXJ0UG9zaXRpb24gPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYW5pbWF0b3IgPSBuZXcgQW5pbWF0b3IoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2ludGVyYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9vdmVyc2Nyb2xsSXRlcmF0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIG92ZXJyaWRlIHNldCB4KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuc2V0WCh2KTtcclxuICAgIH1cclxuICAgIG92ZXJyaWRlIGdldCB4KCkgeyByZXR1cm4gdGhpcy5feDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRYKHg6IG51bWJlciwgc25hcDogYm9vbGVhbiA9IHRydWUsIG5vcm1hbGl6ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoeCAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNOYU4oeCkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oeCwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5fYWN0dWFsWSA9IHg7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVNjcm9sbFNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVZlbG9jaXR5KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHNldCB5KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuc2V0WSh2KTtcclxuICAgIH1cclxuICAgIG92ZXJyaWRlIGdldCB5KCkgeyByZXR1cm4gdGhpcy5feTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRZKHk6IG51bWJlciwgc25hcDogYm9vbGVhbiA9IHRydWUsIG5vcm1hbGl6ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoeSAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNOYU4oeSkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oeSwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5fYWN0dWFsWSA9IHk7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVNjcm9sbFNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVZlbG9jaXR5KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBzZXQgZGVsdGEodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsdGEgPSB2O1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gKz0gdjtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQgc3RhcnRMYXlvdXRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ID0gdjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb3ZlcnJpZGUgZ2V0IHN0YXJ0TGF5b3V0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2ludGVyc2VjdGlvbkNvbXBvbmVudElkOiBJZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBsZXQgbW91c2VDYW5jZWxlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0ICR2aWV3cG9ydEJvdW5kcyA9IHRoaXMuJHZpZXdwb3J0Qm91bmRzO1xyXG4gICAgICAgICR2aWV3cG9ydEJvdW5kcy5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghbW91c2VDYW5jZWxlZCB8fCAhdG91Y2hDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRvdWNoQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSB8fCB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR3aGVlbCA9IHRoaXMuJHdoZWVsO1xyXG4gICAgICAgICR3aGVlbC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKHYgPT4gb2YodGhpcy5hdmVyYWdlVmVsb2NpdHkpKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgICAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc25hcFdpdGhJbml0aWFsRm9yY2VJZk5lY2Vzc2FyeSh2KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdmlld3BvcnQgPSBvZih0aGlzLnNjcm9sbFZpZXdwb3J0KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICAgICAgbWFwKHYgPT4gdiEubmF0aXZlRWxlbWVudCksXHJcbiAgICAgICAgKSwgJGNvbnRlbnQgPSBvZih0aGlzLnNjcm9sbENvbnRlbnQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgICBtYXAodiA9PiB2IS5uYXRpdmVFbGVtZW50KSxcclxuICAgICAgICApLCAkd2hlZWxFbWl0dGVyID0gdGhpcy5faW52ZXJzaW9uID8gJHZpZXdwb3J0IDogJGNvbnRlbnQ7XHJcblxyXG4gICAgICAgICR3aGVlbEVtaXR0ZXIucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oY29udGVudCwgV0hFRUwsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBpc1ZlcnRpY2FsID8gZS5kZWx0YVkgOiBlLmRlbHRhWCwgZHAgPSAoc3RhcnRQb3MgKyBkZWx0YSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaXNJbmZpbml0eSA/IGRwIDogKGRwIDwgMCA/IDAgOiBkcCA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogZHApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbCh7IFtpc1ZlcnRpY2FsID8gVE9QIDogTEVGVF06IHBvc2l0aW9uLCBiZWhhdmlvcjogSU5TVEFOVCwgdXNlckFjdGlvbjogdHJ1ZSwgYmxlbmRpbmc6IGZhbHNlLCBmaXJlVXBkYXRlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kd2hlZWwubmV4dChkZWx0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkbW91c2VVcCA9IHJhY2UoW1xyXG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiB0cnVlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX1VQLCB7IHBhc3NpdmU6IHRydWUgfSkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgXSksXHJcbiAgICAgICAgICAgICRtb3VzZURyYWdDYW5jZWwgPSAkbW91c2VVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICBkZWxheSgwKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3VzZUNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtICYmIHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfRE9XTiwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdXNlQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfRE9XTiwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcih2ID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhJTlRFUkFDVElWRSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludmVyc2lvbiA9IHRoaXMuX2ludmVyc2lvbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gZS5jbGllbnRZIDogZS5jbGllbnRYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgPSBwcmV2Q2xpZW50UG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0aWVzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRHJhZ0NhbmNlbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvbiwgb2Zmc2V0cywgdmVsb2NpdGllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uID0gY3VycmVudFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGguYWJzKHBvc2l0aW9uKSAtIE1hdGguYWJzKGlzVmVydGljYWwgPyB0aGlzLl95IDogdGhpcy5feCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IChzY3JvbGxTaXplIC0gdmlld3BvcnRTaXplICogLjUpIHx8IHBvc2l0aW9uIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgLT0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWNlKFtmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pXSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCgkbW91c2VEcmFnQ2FuY2VsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGEwIH0gPSB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc25hcElmTmVjZXNzYXJ5KHYwLCBmYWxzZSkgJiYgdGhpcy5zY3JvbGxCZWhhdmlvciAhPT0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCwgcG9zaXRpb24sIDAsIHYwLCBhMCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdG91Y2hVcCA9IHJhY2UoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgKSxcclxuICAgICAgICAgICAgJHRvdWNoQ2FuY2VsZXIgPSAkdG91Y2hVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICBkZWxheSgwKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaENhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtICYmIHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfU1RBUlQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdWNoQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfU1RBUlQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RhcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVEVSQUNUSVZFKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzaW9uID0gdGhpcy5faW52ZXJzaW9uLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDbGllbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFkgOiBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyA9IHByZXZDbGllbnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSwgdmVsb2NpdGllcyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCR0b3VjaENhbmNlbGVyKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24sIGN1cnJlbnRQb3MsIGVuZFRpbWUsIHNjcm9sbERlbHRhIH0gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWwsIGUsIGludmVyc2lvbiwgc3RhcnRDbGllbnRQb3MsIHN0YXJ0VGltZSwgcHJldkNsaWVudFBvc2l0aW9uLCBvZmZzZXRzLCB2ZWxvY2l0aWVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb24gPSBjdXJyZW50UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5hYnMocG9zaXRpb24pIC0gTWF0aC5hYnMoaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gKHNjcm9sbFNpemUgLSB2aWV3cG9ydFNpemUgKiAuNSkgfHwgcG9zaXRpb24gPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyAtPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJHRvdWNoQ2FuY2VsZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHYwIH0gPSB0aGlzLmNhbGN1bGF0ZVZlbG9jaXR5KG9mZnNldHMsIHNjcm9sbERlbHRhLCB0aW1lc3RhbXApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTAgfSA9IHRoaXMuY2FsY3VsYXRlQWNjZWxlcmF0aW9uKHZlbG9jaXRpZXMsIHYwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zbmFwSWZOZWNlc3NhcnkodjAsIGZhbHNlKSAmJiB0aGlzLnNjcm9sbEJlaGF2aW9yICE9PSBCRUhBVklPUl9JTlNUQU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgMCwgdjAsIGEwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBJZk5lY2Vzc2FyeSh2MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZURpcmVjdGlvbihwb3NpdGlvbjogbnVtYmVyLCBwcmVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSAocG9zaXRpb24gLSB0aGlzLl9kZWx0YSkgLSBwcmVQb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uYWRkKGRlbHRhID4gMCA/IDEgOiBkZWx0YSA8IDAgPyAtMSA6IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvdmVycmlkZUNvb3JkaW5hdGVzKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIub3ZlcnJpZGVDb29yZGluYXRlcyh4LCB5KTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB5IDogeCk7XHJcbiAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtZWFzdXJlVmVsb2NpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGltZXN0YW1wID09PSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLl95IDogdGhpcy5feCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWxvY2l0aWVzID0gWzBdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5TGFzdFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGltZURlbHRhID0gdGltZXN0YW1wIC0gdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkRlbHRhID0gTWF0aC5hYnMocG9zaXRpb24gLSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24pLFxyXG4gICAgICAgICAgICB2ZWxvY2l0eSA9IHRpbWVEZWx0YSA+IDAgPyBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhIDogMDtcclxuICAgICAgICBsZXQgYXZnVmVsb2NpdHkgPSB0aGlzLl92ZWxvY2l0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl92ZWxvY2l0aWVzLnJlZHVjZSgocCwgYykgPT4gcCArIGMpIDogMDtcclxuICAgICAgICBpZiAodGhpcy5fdmVsb2NpdGllcy5sZW5ndGggPj0gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXZnVmVsb2NpdHkgKz0gdmVsb2NpdHk7XHJcbiAgICAgICAgdGhpcy5fJHZlbG9jaXR5Lm5leHQodmVsb2NpdHkpO1xyXG4gICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMucHVzaCh2ZWxvY2l0eSk7XHJcbiAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KGF2Z1ZlbG9jaXR5IC8gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0b3BNb3ZpbmcoKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHNuYXBJZk5lY2Vzc2FyeSh2MDogbnVtYmVyLCB3aXRoSW5pdGlhbEZvcmNlOiBib29sZWFuID0gdHJ1ZSwgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbTtcclxuICAgICAgICBpZiAoISFzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGluZ09uZUJ5T25lID0gdGhpcy5zY3JvbGxpbmdPbmVCeU9uZTtcclxuICAgICAgICAgICAgaWYgKHNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdpdGhJbml0aWFsRm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3NhcnkodjAsIGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzbmFwV2l0aEluaXRpYWxGb3JjZUlmTmVjZXNzYXJ5KHYwOiBudW1iZXIgfCBudWxsID0gbnVsbCwgYW5pbWF0ZWQgPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNuYXBUb0l0ZW0gKiAuMDEsIHMgPSB0aGlzLmdldFNuYXBwZWRDb21wb25lbnRTaXplKCksXHJcbiAgICAgICAgICAgIHZhID0gcyAhPT0gbnVsbCAmJiB0ICE9PSAwID8gKHMgLyB0KSA6IDA7XHJcbiAgICAgICAgaWYgKHZhID49IE1hdGguYWJzKHYwID8/IHRoaXMuYXZlcmFnZVZlbG9jaXR5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyLCBvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgdmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT5cclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsIGRlbHRhID0gKGludmVyc2lvbiA/IC0xIDogMSkgKiAoc3RhcnRDbGllbnRQb3MgLSBjdXJyZW50UG9zKSxcclxuICAgICAgICAgICAgZHAgPSB0aGlzLl9zdGFydFBvc2l0aW9uICsgZGVsdGEsIHBvc2l0aW9uID0gdGhpcy5pc0luZmluaXR5ID8gZHAgOiBkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwLFxyXG4gICAgICAgICAgICBlbmRUaW1lID0gRGF0ZS5ub3coKSwgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSwgc2Nyb2xsRGVsdGEgPSBwcmV2Q2xpZW50UG9zaXRpb24gPT09IDAgPyAwIDogcHJldkNsaWVudFBvc2l0aW9uIC0gY3VycmVudFBvcyxcclxuICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICByZXR1cm4geyBwb3NpdGlvbiwgY3VycmVudFBvcywgZW5kVGltZSwgc2Nyb2xsRGVsdGEgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbmNlbE92ZXJzY3JvbGwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJzY3JvbGxFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja092ZXJzY3JvbGxCeUF4aXMoZTogRXZlbnQsIHBvczogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IE1hdGguYWJzKHBvcyk7XHJcbiAgICAgICAgaWYgKHAgPiAwICYmIHAgPCBsaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uIDwgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3ZlcnNjcm9sbEVuYWJsZWQgfHwgIXRoaXMub3ZlcnNjcm9sbEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feSwgdGhpcy5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feCwgdGhpcy5zY3JvbGxXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIG9mZnNldHMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9mZnNldHMubGVuZ3RoLCBzdGFydEluZGV4ID0gbGVuID4gaW5kZXhPZmZzZXQgPyBsZW4gLSBpbmRleE9mZnNldCA6IDAsIGxhc3RWU2lnbiA9IGNhbGN1bGF0ZURpcmVjdGlvbihvZmZzZXRzKSxcclxuICAgICAgICAgICAgc3BlZWRTY2FsZSA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/LnNwZWVkU2NhbGUgPz8gU1BFRURfU0NBTEU7XHJcbiAgICAgICAgbGV0IHZTdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4LCBsID0gb2Zmc2V0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcDAgPSBvZmZzZXRzW2ldO1xyXG4gICAgICAgICAgICBpZiAobGFzdFZTaWduICE9PSBNYXRoLnNpZ24ocDBbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdjAgPSAocDBbMV0gIT09IDAgPyBsYXN0VlNpZ24gKiBNYXRoLmFicyhwMFswXSAvIHAwWzFdKSAqIHNwZWVkU2NhbGUgOiAwKTtcclxuICAgICAgICAgICAgdlN1bSArPSBNYXRoLnNpZ24odjApICogTWF0aC5wb3codjAsIDQpICogLjAwMztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGwgPSBNYXRoLm1pbihvZmZzZXRzLmxlbmd0aCwgaW5kZXhPZmZzZXQpLCB2MCA9IGwgPiAwID8gKHZTdW0gLyBsKSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHsgdjAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIHZlbG9jaXRpZXMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gdmVsb2NpdGllcy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMDtcclxuICAgICAgICBsZXQgYVN1bSA9IDAsIHByZXZWMDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgaXRlcmF0aW9uID0gMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKHZlbG9jaXRpZXMpO1xyXG4gICAgICAgIGNvbnN0IG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSB2ZWxvY2l0aWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2MDAgPSBwcmV2VjAsIHYwMSA9IHZlbG9jaXRpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbih2MDFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhMCA9IHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAgPyAodjAwWzFdICE9PSAwID8gKGxhc3RWU2lnbiAqIE1hdGguYWJzKE1hdGguYWJzKHYwMVswXSkgLSBNYXRoLmFicyh2MDBbMF0pKSkgLyBNYXRoLmFicyh2MDBbMV0pIDogMCkgOiAwLjE7XHJcbiAgICAgICAgICAgICAgICBhU3VtID0gKGFTdW0gKiBtYXNzKSArIGEwO1xyXG4gICAgICAgICAgICAgICAgcHJldlYwID0gdjAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZWMCA9IHYwMTtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhMCA9IGFTdW0gKiAodGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8uZnJpY3Rpb25hbEZvcmNlID8/IEZSSUNUSU9OX0ZPUkNFKTtcclxuICAgICAgICByZXR1cm4geyBhMCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BTY3JvbGxpbmcoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhZm9yY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZShpc1ZlcnRpY2FsOiBib29sZWFuLCBwb3NpdGlvbjogbnVtYmVyLCBibGVuZGluZzogYm9vbGVhbiA9IGZhbHNlLCB1c2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2UsIGZpcmVVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGwoeyBbaXNWZXJ0aWNhbCA/IFRPUCA6IExFRlRdOiBwb3NpdGlvbiwgYmVoYXZpb3I6IElOU1RBTlQsIGJsZW5kaW5nLCB1c2VyQWN0aW9uLCBmaXJlVXBkYXRlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsOiBib29sZWFuLCBwb3NpdGlvbjogbnVtYmVyLCB2MDogbnVtYmVyLCB2OiBudW1iZXIsIGEwOiBudW1iZXIsIHRpbWVzdGFtcDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGEwICE9PSAwICYmIHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVApIHtcclxuICAgICAgICAgICAgY29uc3QgZHZTaWduID0gTWF0aC5zaWduKHYpLFxyXG4gICAgICAgICAgICAgICAgbWFzcyA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1hc3MgPz8gTUFTUyxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gRFVSQVRJT04sIG1heER1cmF0aW9uID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8ubWF4RHVyYXRpb24gPz8gTUFYX0RVUkFUSU9OLFxyXG4gICAgICAgICAgICAgICAgbWF4RGlzdCA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1heERpc3RhbmNlID8/IE1BWF9ESVNULFxyXG4gICAgICAgICAgICAgICAgbWF4RGlzdGFuY2UgPSBkdlNpZ24gKiBtYXhEaXN0LCBzID0gKGR2U2lnbiAqIE1hdGguYWJzKChhMCAqIE1hdGgucG93KGR1cmF0aW9uLCAyKSkgKiAuNSkgLyAxMDAwKSAvIG1hc3MsXHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKHMpIDwgbWF4RGlzdCA/IHMgOiBtYXhEaXN0YW5jZSwgcG9zaXRpb25XaXRoVmVsb2NpdHkgPSBwb3NpdGlvbiArICh0aGlzLl9pbnZlcnNpb24gPyAtMSA6IDEpICogZGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICB2bWF4ID0gTWF0aC5tYXgoTWF0aC5hYnModjApLCBNYXRoLmFicyh2KSksXHJcbiAgICAgICAgICAgICAgICBhZCA9IE1hdGguYWJzKHZtYXggIT09IDAgPyBNYXRoLnNxcnQodm1heCkgOiAwKSAqIDEwIC8gbWFzcyxcclxuICAgICAgICAgICAgICAgIGFEdXJhdGlvbiA9IGFkIDwgbWF4RHVyYXRpb24gPyBhZCA6IG1heER1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB0aGlzLnkgOiB0aGlzLng7XHJcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShzdGFydFBvc2l0aW9uLCBNYXRoLnJvdW5kKHBvc2l0aW9uV2l0aFZlbG9jaXR5KSwgYUR1cmF0aW9uLCBlYXNlT3V0UXVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID8gMCA6IHRoaXMuc3RhcnRPZmZzZXQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSB0aGlzLnNjcm9sbGFibGUgPyAoKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpIC0gdGhpcy5hbGlnbm1lbnRFbmRPZmZzZXQpIDogMCxcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zY3JvbGxhYmxlID8gKHZhbHVlIDw9IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB2YWx1ZSA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogdmFsdWUpIDogc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYW5pbWF0ZShzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uID0gQU5JTUFUSU9OX0RVUkFUSU9OLCBlYXNpbmdGdW5jdGlvbjogRWFzaW5nID0gZWFzZU91dFF1YWQsXHJcbiAgICAgICAgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBhbGlnbm1lbnRBdENvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSwgc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICBsZXQgaXRlcmF0aW9uID0gMCwgcG9zaXRpb24gPSBzdGFydFZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gIWFsaWdubWVudEF0Q29tcGxldGU7XHJcblxyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICB3aXRoRGVsdGE6IHRoaXMuX3NlcnZpY2UuZHluYW1pYyAmJiAhdGhpcy5pc0luZmluaXR5LFxyXG4gICAgICAgICAgICBzdGFydFZhbHVlLFxyXG4gICAgICAgICAgICBlbmRWYWx1ZSxcclxuICAgICAgICAgICAgZHVyYXRpb24sXHJcbiAgICAgICAgICAgIGVhc2luZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICBnZXRQcm9wVmFsdWU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3g7XHJcbiAgICAgICAgICAgIH0sIG9uVXBkYXRlOiAoeyB2YWx1ZSwgdGltZXN0YW1wLCBlbGFwc2VkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0Nvb3JkaW5hdGVzT3ZlcnJpZGVkICYmICFza2lwT3ZlcnJpZGVkQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0Nvb3JkaW5hdGVzT3ZlcnJpZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENvb3JkaW5hdGUgPSBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gsIGRlbHRhID0gZW5kVmFsdWUgLSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUoY3VycmVudENvb3JkaW5hdGUsIGN1cnJlbnRDb29yZGluYXRlICsgZGVsdGEsIGR1cmF0aW9uIC0gZWxhcHNlZCwgZWFzaW5nRnVuY3Rpb24sIHVzZXJBY3Rpb24sIGFsaWdubWVudEF0Q29tcGxldGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gY2FsY3VsYXRlVmVsb2NpdHkocG9zaXRpb24sIHZhbHVlLCB0aW1lc3RhbXApID8/IHRoaXMuYXZlcmFnZVZlbG9jaXR5O1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChhbGlnbm1lbnRBdENvbXBsZXRlICYmICF0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbiA8IE1BWF9JVEVSQVRJT05TX0ZPUl9BVkVSQUdFX0NBTENVTEFUSU9OUyB8fCAhdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCB2YWx1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlcnZpY2UudXBkYXRlKHRydWUpO1xyXG4gICAgICAgICAgICB9LCBvbkNvbXBsZXRlOiAoeyB2YWx1ZSwgdGltZXN0YW1wIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IGNhbGN1bGF0ZVZlbG9jaXR5KHBvc2l0aW9uLCB2YWx1ZSwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgIGlmIChhbGlnbm1lbnRBdENvbXBsZXRlICYmICF0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgdmFsdWUsIGZhbHNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlcnZpY2UudXBkYXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0U25hcHBlZENvbXBvbmVudFNpemUoKSB7XHJcbiAgICAgICAgY29uc3QgYWxpZ24gPSB0aGlzLnNuYXBUb0l0ZW1BbGlnbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksIHNkID0gdGhpcy5zbmFwcGluZ0Rpc3RhbmNlLFxyXG4gICAgICAgICAgICBzbmFwcGluZ0Rpc3RhbmNlID0gcGFyc2VGbG9hdE9yUGVyc2VudGFnZVZhbHVlKHNkKSxcclxuICAgICAgICAgICAgaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA9IGlzUGVyY2VudGFnZVZhbHVlKHNkKTtcclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpLFxyXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KSAtIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0LFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiksXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnRTaXplID0gaXNWZXJ0aWNhbCA/IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LmhlaWdodCA/PyAwIDogY3VycmVudENvbXBvbmVudEJvdW5kcz8ud2lkdGggPz8gMDtcclxuICAgICAgICBzd2l0Y2ggKGFsaWduKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5TVEFSVDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKChzY3JvbGxEaXJlY3Rpb24gPT09IDEgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSA6IDApIC0gKGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSAqIHNuYXBwaW5nRGlzdGFuY2UgOiBzbmFwcGluZ0Rpc3RhbmNlKSkgKiBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNvbXBvbmVudEJvdW5kcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNvbXBTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkNFTlRFUjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChjdXJyZW50Q29tcG9uZW50U2l6ZSAqIC41IC0gKGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSAqIHNuYXBwaW5nRGlzdGFuY2UgOiBzbmFwcGluZ0Rpc3RhbmNlKSkgKiBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgb2Zmc2V0ICsgdmlld3BvcnRTaXplICogLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wU2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gY29tcFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuRU5EOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKChzY3JvbGxEaXJlY3Rpb24gPT09IDEgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSA6IDApIC0gKGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSAqIHNuYXBwaW5nRGlzdGFuY2UgOiBzbmFwcGluZ0Rpc3RhbmNlKSkgKiBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgb2Zmc2V0ICsgdmlld3BvcnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNvbXBvbmVudEJvdW5kcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNvbXBTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFsaWduUG9zaXRpb24oYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxpZ24gPSB0aGlzLnNuYXBUb0l0ZW1BbGlnbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgc2QgPSB0aGlzLnNuYXBwaW5nRGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHNuYXBwaW5nRGlzdGFuY2UgPSBwYXJzZUZsb2F0T3JQZXJzZW50YWdlVmFsdWUoc2QpLFxyXG4gICAgICAgICAgICBpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID0gaXNQZXJjZW50YWdlVmFsdWUoc2QpO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwsIHNpemU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pLFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50U2l6ZSA9IGlzVmVydGljYWwgPyBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy5oZWlnaHQgPz8gMCA6IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LndpZHRoID8/IDA7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIChzdGFydE9mZnNldCAtIGFsaWdubWVudFN0YXJ0T2Zmc2V0KSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29tcG9uZW50UG9zaXRpb24gLSAoc3RhcnRPZmZzZXQgLSBhbGlnbm1lbnRTdGFydE9mZnNldCkgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiBtYXhQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbWF4UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSB0aGlzLnNjcm9sbFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkNFTlRFUjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKGN1cnJlbnRDb21wb25lbnRTaXplICogLjUgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUgKiAuNSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjU7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiArIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjUgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSAwIHx8IHBvc2l0aW9uID4gbWF4UG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1heFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHRoaXMuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5zY3JvbGxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5FTkQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHkgOiB4O1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiAtIHZpZXdwb3J0U2l6ZSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNQb3MgPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uICE9PSBjUG9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRlKGNQb3MsIHBvc2l0aW9uLCBhbmltYXRlZCA/IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNuYXBUb0l0ZW0gOiAxLCBlYXNlT3V0UXVhZCwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY2hlY2tJbnRlcnNlY3Rpb25Db21wb25lbnQoKSB7XHJcbiAgICAgICAgY29uc3QgYWxpZ24gPSB0aGlzLnNuYXBUb0l0ZW1BbGlnbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aDtcclxuICAgICAgICBsZXQgY29tcG9uZW50SWQ6IElkIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICBzd2l0Y2ggKGFsaWduKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5TVEFSVDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24oY3VycmVudFBvc2l0aW9uLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gY29tcG9uZW50Qm91bmRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuQ0VOVEVSOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyB2aWV3cG9ydFNpemUgKiAuNSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBjb21wb25lbnRCb3VuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5FTkQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBjb21wb25lbnRCb3VuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29tcG9uZW50SWQgIT09IHRoaXMuX2ludGVyc2VjdGlvbkNvbXBvbmVudElkICYmIGNvbXBvbmVudElkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlcnZpY2Uuc2V0SW50ZXJzZWN0aW9uRWxlbWVudEJ5U25hcFRvSXRlbUFsaWduKGNvbXBvbmVudElkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faW50ZXJzZWN0aW9uQ29tcG9uZW50SWQgPSBjb21wb25lbnRJZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25BbmltYXRpb25Db21wbGV0ZShwb3NpdGlvbjogbnVtYmVyKSB7IH1cclxuXHJcbiAgICBmaXJlU2Nyb2xsKHVzZXJBY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuXyR1cGRhdGVTY3JvbGxCYXIubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbExpbWl0cyh2YWx1ZT86IG51bWJlciB8IHVuZGVmaW5lZCwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICBjb25zdCB4ID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdGhpcy5feCwgeSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuX3ksIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeXkgPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHkgIT09IHl5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0geXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ID0geXk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeHggPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHggIT09IHh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0geHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54ID0geHg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGwocGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMpIHtcclxuICAgICAgICBjb25zdCBwb3NYID0gcGFyYW1zLnggfHwgcGFyYW1zLmxlZnQgfHwgMCxcclxuICAgICAgICAgICAgcG9zWSA9IHBhcmFtcy55IHx8IHBhcmFtcy50b3AgfHwgMCxcclxuICAgICAgICAgICAgdXNlckFjdGlvbiA9IHBhcmFtcy51c2VyQWN0aW9uID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBzbmFwID0gcGFyYW1zLnNuYXAgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgbm9ybWFsaXplID0gcGFyYW1zLm5vcm1hbGl6ZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICBlYXNlID0gcGFyYW1zLmVhc2UgfHwgZWFzZU91dFF1YWQsXHJcbiAgICAgICAgICAgIGZpcmVVcGRhdGUgPSBwYXJhbXMuZmlyZVVwZGF0ZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICBiZWhhdmlvciA9IHBhcmFtcy5iZWhhdmlvciA/PyBJTlNUQU5ULFxyXG4gICAgICAgICAgICBibGVuZGluZyA9IHBhcmFtcy5ibGVuZGluZyA/PyB0cnVlLFxyXG4gICAgICAgICAgICBmb3JjZSA9IHBhcmFtcy5mb3JjZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb24gPz8gQU5JTUFUSU9OX0RVUkFUSU9OLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IHRoaXMubm9ybWFsaXplVmFsdWUocG9zWCksXHJcbiAgICAgICAgICAgIHkgPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHBvc1kpLFxyXG4gICAgICAgICAgICBwcmV2WCA9IHRoaXMuX3gsXHJcbiAgICAgICAgICAgIHByZXZZID0gdGhpcy5feTtcclxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09IEFVVE8gfHwgYmVoYXZpb3IgPT09IFNNT09USCkge1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZZICE9PSB5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRlKHByZXZZLCB5LCBkdXJhdGlvbiwgZWFzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlggIT09IHgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUocHJldlgsIHgsIGR1cmF0aW9uLCBlYXNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5feSAhPT0geSB8fCBmb3JjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYmxlbmRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKGZvcmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRZKHksIHNuYXAsIG5vcm1hbGl6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ggIT09IHggfHwgZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJsZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyhmb3JjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0WCh4LCBzbmFwLCBub3JtYWxpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZW1pdFNjcm9sbGFibGVFdmVudCgpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmNka1Njcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jZGtTY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uZGlzcGF0Y2hFdmVudChTQ1JPTExfRVZFTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQ29vcmRpbmF0ZSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQ/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgc2Nyb2xsQ29udGVudC5zdHlsZS50cmFuc2Zvcm0gPSBtYXRyaXgzZCgodGhpcy5faW52ZXJzaW9uID8gMSA6IC0xKSAqIHggKyAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IDAgOiB0aGlzLl9zdGFydExheW91dE9mZnNldCksXHJcbiAgICAgICAgICAgICh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogeSArICh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpID8gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQgOiAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpcmVTY3JvbGxFdmVudCh1c2VyQWN0aW9uOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbC5uZXh0KHVzZXJBY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkRyYWdTdGFydCgpIHsgfVxyXG5cclxuICAgIHJlc2V0KG9mZnNldDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgIHRoaXMubW92ZSh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBvZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hbmltYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19