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.
- package/README.md +115 -111
- package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +170 -61
- package/esm2022/lib/components/ng-list-item/const/index.mjs +41 -2
- package/esm2022/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +55 -51
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +5 -5
- package/esm2022/lib/components/ng-list-item/utils/create-display-id.mjs +7 -1
- package/esm2022/lib/components/ng-list-item/utils/get-element-by-index.mjs +17 -3
- package/esm2022/lib/components/ng-list-item/utils/index.mjs +3 -2
- package/esm2022/lib/components/ng-list-item/utils/matrix-3d.mjs +18 -0
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +172 -47
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +32 -16
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +5 -5
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +58 -34
- package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +37 -7
- package/esm2022/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
- package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +58 -28
- package/esm2022/lib/components/ng-scroll-bar/const/index.mjs +8 -1
- package/esm2022/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +236 -88
- package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +170 -44
- package/esm2022/lib/components/ng-scroll-view/const/index.mjs +4 -2
- package/esm2022/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
- package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +610 -99
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +7 -1
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +12 -0
- package/esm2022/lib/components/ng-scroll-view/utils/get-dir.mjs +10 -0
- package/esm2022/lib/components/ng-scroll-view/utils/index.mjs +4 -2
- package/esm2022/lib/components/ng-scroll-view/utils/matrix-3d.mjs +15 -0
- package/esm2022/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
- package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +342 -160
- package/esm2022/lib/const/index.mjs +50 -10
- package/esm2022/lib/core/cache-map.mjs +1 -54
- package/esm2022/lib/core/const/index.mjs +3 -0
- package/esm2022/lib/core/enums/index.mjs +3 -0
- package/esm2022/lib/core/enums/item-display-methods.mjs +14 -0
- package/esm2022/lib/core/events/index.mjs +3 -0
- package/esm2022/lib/core/events/track-box-events.mjs +12 -0
- package/esm2022/lib/core/interfaces/get-item-position-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/get-metrics-returns.mjs +2 -0
- package/esm2022/lib/core/interfaces/index.mjs +2 -0
- package/esm2022/lib/core/interfaces/item.mjs +2 -0
- package/esm2022/lib/core/interfaces/metrics.mjs +2 -0
- package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/update-collection-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/update-collection-returns.mjs +2 -0
- package/esm2022/lib/core/track-box.mjs +601 -191
- package/esm2022/lib/core/tracker.mjs +14 -8
- package/esm2022/lib/core/types/cache-map-events.mjs +2 -0
- package/esm2022/lib/core/types/cache-map-listeners.mjs +2 -0
- package/esm2022/lib/core/types/cache.mjs +2 -0
- package/esm2022/lib/core/types/index.mjs +2 -0
- package/esm2022/lib/core/types/on-change-event-listener.mjs +2 -0
- package/esm2022/lib/core/types/on-tick-event-listener.mjs +2 -0
- package/esm2022/lib/core/utils/get-service-id-prop.mjs +10 -0
- package/esm2022/lib/core/utils/index.mjs +3 -0
- package/esm2022/lib/directives/index.mjs +3 -3
- package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +34 -13
- package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +67 -0
- package/esm2022/lib/directives/virtual-click/virtual-click.module.mjs +19 -0
- package/esm2022/lib/enums/alignments.mjs +12 -0
- package/esm2022/lib/enums/collapsing-modes.mjs +22 -0
- package/esm2022/lib/enums/index.mjs +8 -4
- package/esm2022/lib/enums/selecting-modes-types.mjs +22 -0
- package/esm2022/lib/enums/selecting-modes.mjs +22 -0
- package/esm2022/lib/enums/snap-to-item-aligns.mjs +22 -0
- package/esm2022/lib/enums/spreading-modes.mjs +18 -0
- package/esm2022/lib/interfaces/animation-params.mjs +1 -1
- package/esm2022/lib/interfaces/base-virtual-list-item-component.mjs +2 -9
- package/esm2022/lib/interfaces/index.mjs +1 -1
- package/esm2022/lib/interfaces/item-transformation.mjs +2 -0
- package/esm2022/lib/interfaces/point.mjs +2 -0
- package/esm2022/lib/interfaces/scroll-options.mjs +1 -1
- package/esm2022/lib/interfaces/scroll-params.mjs +1 -1
- package/esm2022/lib/models/item-config-map.model.mjs +1 -1
- package/esm2022/lib/models/item.model.mjs +1 -1
- package/esm2022/lib/models/render-item-config.model.mjs +1 -1
- package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
- package/esm2022/lib/ng-virtual-list-public.service.mjs +6 -7
- package/esm2022/lib/ng-virtual-list.component.mjs +2033 -903
- package/esm2022/lib/ng-virtual-list.service.mjs +91 -30
- package/esm2022/lib/transformations/deck-of-cards-3d.mjs +57 -0
- package/esm2022/lib/transformations/deck-of-cards.mjs +54 -0
- package/esm2022/lib/transformations/event-horizon.mjs +47 -0
- package/esm2022/lib/transformations/index.mjs +13 -0
- package/esm2022/lib/transformations/linear.mjs +47 -0
- package/esm2022/lib/transformations/swipe-3d.mjs +51 -0
- package/esm2022/lib/types/alignment.mjs +2 -0
- package/esm2022/lib/types/arithmetic-expression.mjs +2 -0
- package/esm2022/lib/types/collapsing-mode.mjs +2 -0
- package/esm2022/lib/types/collection-mode.mjs +2 -0
- package/esm2022/lib/types/color.mjs +2 -0
- package/esm2022/lib/types/direction.mjs +2 -0
- package/esm2022/lib/types/float-or-persentage-value.mjs +2 -0
- package/esm2022/lib/types/focus-item-params.mjs +1 -1
- package/esm2022/lib/types/gradient-color-position.mjs +1 -1
- package/esm2022/lib/types/index.mjs +1 -1
- package/esm2022/lib/types/item-transform.mjs +2 -0
- package/esm2022/lib/types/scroll-direction.mjs +1 -1
- package/esm2022/lib/types/selecting-mode.mjs +2 -0
- package/esm2022/lib/types/snap-to-item-align.mjs +2 -0
- package/esm2022/lib/types/snapping-distance.mjs +2 -0
- package/esm2022/lib/types/snapping-method.mjs +2 -0
- package/esm2022/lib/types/spreading-mode.mjs +2 -0
- package/esm2022/lib/types/text-direction.mjs +2 -0
- package/esm2022/lib/utils/animator/animator.mjs +28 -8
- package/esm2022/lib/utils/animator/const/index.mjs +2 -0
- package/esm2022/lib/utils/animator/index.mjs +3 -2
- package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +2 -0
- package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
- package/esm2022/lib/utils/animator/interfaces/index.mjs +2 -0
- package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
- package/esm2022/lib/utils/disposable-component.mjs +27 -0
- package/esm2022/lib/utils/event-emitter/event-emitter.mjs +1 -1
- package/esm2022/lib/utils/get-scroll-state-version.mjs +12 -0
- package/esm2022/lib/utils/is-collapse-mode.mjs +18 -0
- package/esm2022/lib/utils/is-collection-mode.mjs +1 -1
- package/esm2022/lib/utils/is-direction.mjs +1 -1
- package/esm2022/lib/utils/is-persentage-value.mjs +14 -0
- package/esm2022/lib/utils/is-select-mode.mjs +18 -0
- package/esm2022/lib/utils/is-spreading-mode.mjs +15 -0
- package/esm2022/lib/utils/list-validators.mjs +1 -1
- package/esm2022/lib/utils/normalize-collection.mjs +42 -0
- package/esm2022/lib/utils/object.mjs +1 -1
- package/esm2022/lib/utils/parse-arithmetic-expression.mjs +53 -0
- package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +17 -0
- package/esm2022/lib/utils/scrolling-direction.mjs +29 -0
- package/esm2022/lib/utils/snapping-method.mjs +1 -1
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/ng-virtual-list.mjs +7545 -3904
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +40 -16
- package/lib/components/ng-list-item/const/index.d.ts +3 -1
- package/lib/components/ng-list-item/interfaces/template-context.d.ts +1 -1
- package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +5 -2
- package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +2 -2
- package/lib/components/ng-list-item/utils/create-display-id.d.ts +6 -0
- package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -1
- package/lib/components/ng-list-item/utils/index.d.ts +2 -1
- package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -0
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +69 -26
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +2 -2
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +2 -2
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +33 -12
- package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +1 -0
- package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +20 -17
- package/lib/components/ng-scroll-bar/const/index.d.ts +2 -0
- package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +2 -2
- package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +75 -24
- package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +49 -16
- package/lib/components/ng-scroll-view/const/index.d.ts +3 -1
- package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +4 -1
- package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +79 -11
- package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +6 -0
- package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -0
- package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -0
- package/lib/components/ng-scroll-view/utils/index.d.ts +3 -1
- package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -0
- package/lib/components/ng-scroller/enums/scroller-directions.d.ts +2 -1
- package/lib/components/ng-scroller/ng-scroller.component.d.ts +111 -47
- package/lib/const/index.d.ts +46 -5
- package/lib/core/cache-map.d.ts +0 -10
- package/lib/core/const/index.d.ts +1 -0
- package/lib/core/enums/index.d.ts +2 -0
- package/lib/core/enums/item-display-methods.d.ts +12 -0
- package/lib/core/events/index.d.ts +2 -0
- package/lib/core/events/track-box-events.d.ts +10 -0
- package/lib/core/interfaces/get-item-position-options.d.ts +10 -0
- package/lib/core/interfaces/get-metrics-returns.d.ts +11 -0
- package/lib/core/interfaces/index.d.ts +8 -0
- package/lib/core/interfaces/item.d.ts +9 -0
- package/lib/core/interfaces/metrics.d.ts +51 -0
- package/lib/core/interfaces/recalculate-metrics-options.d.ts +32 -0
- package/lib/core/interfaces/update-collection-options.d.ts +10 -0
- package/lib/core/interfaces/update-collection-returns.d.ts +14 -0
- package/lib/core/track-box.d.ts +25 -95
- package/lib/core/tracker.d.ts +1 -1
- package/lib/core/types/cache-map-events.d.ts +8 -0
- package/lib/core/types/cache-map-listeners.d.ts +9 -0
- package/lib/core/types/cache.d.ts +12 -0
- package/lib/core/types/index.d.ts +6 -0
- package/lib/core/types/on-change-event-listener.d.ts +7 -0
- package/lib/core/types/on-tick-event-listener.d.ts +7 -0
- package/lib/core/utils/get-service-id-prop.d.ts +7 -0
- package/lib/core/utils/index.d.ts +2 -0
- package/lib/directives/index.d.ts +2 -2
- package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +16 -6
- package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -0
- package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -0
- package/lib/enums/alignments.d.ts +10 -0
- package/lib/enums/collapsing-modes.d.ts +20 -0
- package/lib/enums/index.d.ts +7 -9
- package/lib/enums/{method-for-selecting-types.d.ts → selecting-modes-types.d.ts} +3 -3
- package/lib/enums/{methods-for-selecting.d.ts → selecting-modes.d.ts} +3 -3
- package/lib/enums/snap-to-item-aligns.d.ts +20 -0
- package/lib/enums/spreading-modes.d.ts +16 -0
- package/lib/interfaces/animation-params.d.ts +1 -0
- package/lib/interfaces/base-virtual-list-item-component.d.ts +13 -13
- package/lib/interfaces/index.d.ts +3 -2
- package/lib/interfaces/item-transformation.d.ts +22 -0
- package/lib/interfaces/point.d.ts +16 -0
- package/lib/interfaces/scroll-options.d.ts +4 -0
- package/lib/interfaces/scroll-params.d.ts +3 -2
- package/lib/models/item-config-map.model.d.ts +5 -0
- package/lib/models/item.model.d.ts +7 -0
- package/lib/models/render-item-config.model.d.ts +50 -0
- package/lib/models/render-item-measures.model.d.ts +71 -0
- package/lib/ng-virtual-list-public.service.d.ts +4 -5
- package/lib/ng-virtual-list.component.d.ts +462 -135
- package/lib/ng-virtual-list.service.d.ts +33 -12
- package/lib/transformations/deck-of-cards-3d.d.ts +54 -0
- package/lib/transformations/deck-of-cards.d.ts +50 -0
- package/lib/transformations/event-horizon.d.ts +26 -0
- package/lib/transformations/index.d.ts +7 -0
- package/lib/transformations/linear.d.ts +26 -0
- package/lib/transformations/swipe-3d.d.ts +38 -0
- package/lib/types/alignment.d.ts +8 -0
- package/lib/types/arithmetic-expression.d.ts +10 -0
- package/lib/types/collapsing-mode.d.ts +8 -0
- package/lib/{enums → types}/collection-mode.d.ts +1 -1
- package/lib/types/color.d.ts +4 -0
- package/lib/{enums → types}/direction.d.ts +1 -1
- package/lib/types/float-or-persentage-value.d.ts +7 -0
- package/lib/types/focus-item-params.d.ts +6 -0
- package/lib/types/gradient-color-position.d.ts +1 -1
- package/lib/types/index.d.ts +15 -1
- package/lib/types/item-transform.d.ts +9 -0
- package/lib/types/scroll-direction.d.ts +2 -0
- package/lib/types/selecting-mode.d.ts +8 -0
- package/lib/types/snap-to-item-align.d.ts +8 -0
- package/lib/types/snapping-distance.d.ts +8 -0
- package/lib/{enums → types}/snapping-method.d.ts +1 -1
- package/lib/types/spreading-mode.d.ts +8 -0
- package/lib/{enums → types}/text-direction.d.ts +1 -1
- package/lib/utils/animator/animator.d.ts +10 -17
- package/lib/utils/animator/const/index.d.ts +1 -0
- package/lib/utils/animator/index.d.ts +2 -1
- package/lib/utils/animator/interfaces/animator-params.d.ts +18 -0
- package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -0
- package/lib/utils/animator/interfaces/index.d.ts +3 -0
- package/lib/utils/animator/types/easing.d.ts +6 -0
- package/lib/utils/disposable-component.d.ts +15 -0
- package/lib/utils/get-scroll-state-version.d.ts +1 -0
- package/lib/utils/is-collapse-mode.d.ts +8 -0
- package/lib/utils/is-collection-mode.d.ts +1 -1
- package/lib/utils/is-direction.d.ts +1 -1
- package/lib/utils/is-persentage-value.d.ts +7 -0
- package/lib/utils/is-select-mode.d.ts +8 -0
- package/lib/utils/is-spreading-mode.d.ts +8 -0
- package/lib/utils/list-validators.d.ts +1 -1
- package/lib/utils/normalize-collection.d.ts +8 -0
- package/lib/utils/object.d.ts +1 -1
- package/lib/utils/parse-arithmetic-expression.d.ts +8 -0
- package/lib/utils/parse-float-or-persentage-value.d.ts +7 -0
- package/lib/utils/scrolling-direction.d.ts +17 -0
- package/lib/utils/snapping-method.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/esm2022/lib/components/ng-scroller/const/index.mjs +0 -2
- package/esm2022/lib/directives/item-click/item-click.directive.mjs +0 -59
- package/esm2022/lib/directives/item-click/item-click.module.mjs +0 -19
- package/esm2022/lib/enums/collection-mode.mjs +0 -2
- package/esm2022/lib/enums/direction.mjs +0 -2
- package/esm2022/lib/enums/method-for-selecting-types.mjs +0 -22
- package/esm2022/lib/enums/method-for-selecting.mjs +0 -2
- package/esm2022/lib/enums/methods-for-selecting.mjs +0 -22
- package/esm2022/lib/enums/snapping-method.mjs +0 -2
- package/esm2022/lib/enums/text-direction.mjs +0 -2
- package/esm2022/lib/utils/is-method-for-selecting.mjs +0 -18
- package/lib/components/ng-scroller/const/index.d.ts +0 -1
- package/lib/directives/item-click/item-click.directive.d.ts +0 -19
- package/lib/directives/item-click/item-click.module.d.ts +0 -8
- package/lib/enums/method-for-selecting.d.ts +0 -8
- package/lib/utils/is-method-for-selecting.d.ts +0 -8
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import { CACHE_BOX_CHANGE_EVENT_NAME, CacheMap } from "./cache-map";
|
|
2
2
|
import { Tracker } from "./tracker";
|
|
3
|
-
import { HEIGHT_PROP_NAME, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME, } from "../const";
|
|
3
|
+
import { DEFAULT_DIVIDES, HEIGHT_PROP_NAME, SERVICE_PROP_DUMMY, SERVICE_PROP_DUMMY_ENABLED, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME, } from "../const";
|
|
4
4
|
import { debounce } from "../utils";
|
|
5
5
|
import { bufferInterpolation } from "../utils/buffer-interpolation";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
(function (ItemDisplayMethods) {
|
|
13
|
-
ItemDisplayMethods[ItemDisplayMethods["CREATE"] = 0] = "CREATE";
|
|
14
|
-
ItemDisplayMethods[ItemDisplayMethods["UPDATE"] = 1] = "UPDATE";
|
|
15
|
-
ItemDisplayMethods[ItemDisplayMethods["DELETE"] = 2] = "DELETE";
|
|
16
|
-
ItemDisplayMethods[ItemDisplayMethods["NOT_CHANGED"] = 3] = "NOT_CHANGED";
|
|
17
|
-
})(ItemDisplayMethods || (ItemDisplayMethods = {}));
|
|
18
|
-
const DEFAULT_BUFFER_EXTREMUM_THRESHOLD = 15, DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH = 30, DEFAULT_RESET_BUFFER_SIZE_TIMEOUT = 10000, IS_NEW = 'n';
|
|
6
|
+
import { objectAsReadonly } from "../utils/object";
|
|
7
|
+
import { getServiceIdProp } from "./utils";
|
|
8
|
+
import { DEFAULT_BUFFER_EXTREMUM_THRESHOLD, DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH, DEFAULT_RESET_BUFFER_SIZE_TIMEOUT, END_COLLECTION_PREFIX_ID, IS_NEW, START_COLLECTION_PREFIX_ID, } from "./const";
|
|
9
|
+
import { Z_INDEX_0, Z_INDEX_1, Z_INDEX_2, Z_INDEX_3, } from '../const';
|
|
10
|
+
import { TrackBoxEvents } from "./events";
|
|
11
|
+
import { ItemDisplayMethods } from "./enums";
|
|
19
12
|
/**
|
|
20
13
|
* An object that performs tracking, calculations and caching.
|
|
21
14
|
* @link https://github.com/DjonnyX/ng-virtual-list/blob/18.x/projects/ng-virtual-list/src/lib/core/track-box.ts
|
|
@@ -45,6 +38,36 @@ export class TrackBox extends CacheMap {
|
|
|
45
38
|
}
|
|
46
39
|
this._snappedDisplayComponents = v;
|
|
47
40
|
}
|
|
41
|
+
_scrollDirection = 0;
|
|
42
|
+
set scrollDirection(v) {
|
|
43
|
+
if (this._scrollDirection === v) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this._scrollDirection = v;
|
|
47
|
+
}
|
|
48
|
+
get scrollDirection() { return this._scrollDirection; }
|
|
49
|
+
_trackBy = TRACK_BY_PROPERTY_NAME;
|
|
50
|
+
set trackBy(v) {
|
|
51
|
+
if (this._trackBy === v) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this._trackBy = v;
|
|
55
|
+
}
|
|
56
|
+
get trackBy() { return this._trackBy; }
|
|
57
|
+
_divides = DEFAULT_DIVIDES;
|
|
58
|
+
set divides(v) {
|
|
59
|
+
if (this._divides === v) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this._divides = v;
|
|
63
|
+
}
|
|
64
|
+
_isInfinity = false;
|
|
65
|
+
set isInfinity(v) {
|
|
66
|
+
if (this._isInfinity === v) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this._isInfinity = v;
|
|
70
|
+
}
|
|
48
71
|
_isSnappingMethodAdvanced = false;
|
|
49
72
|
set isSnappingMethodAdvanced(v) {
|
|
50
73
|
if (this._isSnappingMethodAdvanced === v) {
|
|
@@ -66,20 +89,20 @@ export class TrackBox extends CacheMap {
|
|
|
66
89
|
this._trackingPropertyName = this._tracker.trackingPropertyName = v;
|
|
67
90
|
}
|
|
68
91
|
_trackingPropertyName = TRACK_BY_PROPERTY_NAME;
|
|
92
|
+
_isScrollStart = false;
|
|
69
93
|
set isScrollStart(v) {
|
|
70
94
|
this._isScrollStart = v;
|
|
71
95
|
if (v) {
|
|
72
96
|
this._isScrollSnapToStart = true;
|
|
73
97
|
}
|
|
74
98
|
}
|
|
75
|
-
|
|
99
|
+
_isScrollEnd = false;
|
|
76
100
|
set isScrollEnd(v) {
|
|
77
101
|
this._isScrollEnd = v;
|
|
78
102
|
if (v) {
|
|
79
103
|
this._isScrollSnapToEnd = true;
|
|
80
104
|
}
|
|
81
105
|
}
|
|
82
|
-
_isScrollEnd = false;
|
|
83
106
|
_isScrollSnapToStart = false;
|
|
84
107
|
get isSnappedToStart() {
|
|
85
108
|
return this._isScrollStart || this._isScrollSnapToStart;
|
|
@@ -180,9 +203,9 @@ export class TrackBox extends CacheMap {
|
|
|
180
203
|
if (previousCollection) {
|
|
181
204
|
// deleted
|
|
182
205
|
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
183
|
-
const item = previousCollection[i], id = item[trackBy];
|
|
206
|
+
const item = previousCollection[i], id = item?.[trackBy];
|
|
184
207
|
crudDetected = true;
|
|
185
|
-
if (this._map.has(id)) {
|
|
208
|
+
if (!!item && this._map.has(id)) {
|
|
186
209
|
this._map.delete(id);
|
|
187
210
|
}
|
|
188
211
|
}
|
|
@@ -194,8 +217,10 @@ export class TrackBox extends CacheMap {
|
|
|
194
217
|
// added
|
|
195
218
|
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
196
219
|
crudDetected = true;
|
|
197
|
-
const item = currentCollection[i], id = item[trackBy];
|
|
198
|
-
|
|
220
|
+
const item = currentCollection[i], id = item?.[trackBy];
|
|
221
|
+
if (!!item) {
|
|
222
|
+
this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
|
|
223
|
+
}
|
|
199
224
|
}
|
|
200
225
|
}
|
|
201
226
|
return;
|
|
@@ -203,14 +228,14 @@ export class TrackBox extends CacheMap {
|
|
|
203
228
|
const collectionDict = {};
|
|
204
229
|
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
205
230
|
const item = currentCollection[i];
|
|
206
|
-
if (item) {
|
|
231
|
+
if (!!item) {
|
|
207
232
|
collectionDict[item[trackBy]] = item;
|
|
208
233
|
}
|
|
209
234
|
}
|
|
210
235
|
const notChangedMap = {}, deletedMap = {}, deletedItemsMap = {}, updatedMap = {};
|
|
211
236
|
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
212
|
-
const item = previousCollection[i], id = item[trackBy];
|
|
213
|
-
if (item) {
|
|
237
|
+
const item = previousCollection[i], id = item?.[trackBy];
|
|
238
|
+
if (!!item) {
|
|
214
239
|
if (collectionDict.hasOwnProperty(id)) {
|
|
215
240
|
if (item === collectionDict[id]) {
|
|
216
241
|
// not changed
|
|
@@ -240,8 +265,8 @@ export class TrackBox extends CacheMap {
|
|
|
240
265
|
}
|
|
241
266
|
}
|
|
242
267
|
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
243
|
-
const item = currentCollection[i], id = item[trackBy];
|
|
244
|
-
if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) &&
|
|
268
|
+
const item = currentCollection[i], id = item?.[trackBy];
|
|
269
|
+
if (!!item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) &&
|
|
245
270
|
!notChangedMap.hasOwnProperty(id)) {
|
|
246
271
|
this._newItems.push(id);
|
|
247
272
|
// added
|
|
@@ -256,7 +281,7 @@ export class TrackBox extends CacheMap {
|
|
|
256
281
|
* Finds the position of a collection element by the given Id
|
|
257
282
|
*/
|
|
258
283
|
getItemPosition(id, itemConfigMap, options) {
|
|
259
|
-
const opt = { fromItemId: id, itemConfigMap, ...options };
|
|
284
|
+
const opt = { fromItemId: id ?? options.fromItemId, itemConfigMap, ...options };
|
|
260
285
|
this._defaultBufferSize = opt.bufferSize;
|
|
261
286
|
this._maxBufferSize = opt.maxBufferSize;
|
|
262
287
|
const { scrollSize, isFromItemIdFound } = this.recalculateMetrics({
|
|
@@ -315,8 +340,8 @@ export class TrackBox extends CacheMap {
|
|
|
315
340
|
if (opt.dynamicSize) {
|
|
316
341
|
this.snapshot();
|
|
317
342
|
}
|
|
318
|
-
const displayItems = this.generateDisplayCollection(items, itemConfigMap, { ...metrics, });
|
|
319
|
-
return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected };
|
|
343
|
+
const displayItems = this.generateDisplayCollection(metrics.items, items, itemConfigMap, { ...metrics, });
|
|
344
|
+
return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected, leftLayoutOffset: metrics.leftLayoutOffset };
|
|
320
345
|
}
|
|
321
346
|
_previousScrollSize = 0;
|
|
322
347
|
updateAdaptiveBufferParams(metrics, totalItemsLength) {
|
|
@@ -367,36 +392,39 @@ export class TrackBox extends CacheMap {
|
|
|
367
392
|
* Calculates list metrics
|
|
368
393
|
*/
|
|
369
394
|
recalculateMetrics(options) {
|
|
370
|
-
const { fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, bufferSize: minBufferSize, scrollSize,
|
|
371
|
-
const trackBy = this._trackingPropertyName, bufferSize = Math.max(minBufferSize, this._bufferSize), { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, totalLength = collection.length, typicalItemSize = itemSize, w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height, map = this._map, snapshot = this._snapshot,
|
|
395
|
+
const { fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize: minBufferSize, scrollSize, stickyEnabled, itemConfigMap, enabledBufferOptimization, previousTotalSize, snapToItem, snapToItemAlign, deletedItemsMap, itemTransform } = options, roundedScrollSize = Math.round(scrollSize);
|
|
396
|
+
const trackBy = this._trackingPropertyName, bufferSize = Math.max(minBufferSize, this._bufferSize), { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, totalLength = collection.length, typicalItemSize = itemSize, w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height, map = this._map, snapshot = this._snapshot, divides = this._divides, stickyPos = Math.floor(scrollSize) + this._scrollStartOffset, leftItemsOrRowsWeights = [], isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)
|
|
372
397
|
|| (typeof fromItemId === 'string' && fromItemId > '-1');
|
|
373
398
|
let leftItemsOffset = 0, rightItemsOffset = 0;
|
|
374
399
|
if (enabledBufferOptimization) {
|
|
375
|
-
switch (this.
|
|
400
|
+
switch (this._scrollDirection) {
|
|
376
401
|
case 1: {
|
|
377
402
|
leftItemsOffset = 0;
|
|
378
|
-
rightItemsOffset = bufferSize;
|
|
403
|
+
rightItemsOffset = bufferSize * divides;
|
|
379
404
|
break;
|
|
380
405
|
}
|
|
381
406
|
case -1: {
|
|
382
|
-
leftItemsOffset = bufferSize;
|
|
407
|
+
leftItemsOffset = bufferSize * divides;
|
|
383
408
|
rightItemsOffset = 0;
|
|
384
409
|
break;
|
|
385
410
|
}
|
|
386
411
|
case 0:
|
|
387
412
|
default: {
|
|
388
|
-
leftItemsOffset = rightItemsOffset = bufferSize;
|
|
413
|
+
leftItemsOffset = rightItemsOffset = bufferSize * divides;
|
|
389
414
|
}
|
|
390
415
|
}
|
|
391
416
|
}
|
|
392
417
|
else {
|
|
393
|
-
leftItemsOffset = rightItemsOffset = bufferSize;
|
|
418
|
+
leftItemsOffset = rightItemsOffset = bufferSize * divides;
|
|
394
419
|
}
|
|
395
|
-
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, deltaOfNewItems = 0, leftSizeOfAddedItems = 0, leftSizeOfUpdatedItems = 0, leftSizeOfDeletedItems = 0, itemById =
|
|
420
|
+
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, deltaOfNewItems = 0, leftSizeOfAddedItems = 0, leftSizeOfUpdatedItems = 0, leftSizeOfDeletedItems = 0, itemById = null, itemByIdPos = this._scrollStartOffset, isTargetInOverscroll = false, actualScrollSize = itemByIdPos, totalSize = this._scrollStartOffset + this._scrollEndOffset, startIndex, isFromItemIdFound = false, deltaFromStartCreation = 0, isUpdating = false, leftYOffset = 0, leftLayoutOffset = 0, leftLayoutIndexOffset = 0, rightLayoutIndexOffset = 0;
|
|
396
421
|
const isStart = ((roundedScrollSize === 0) || this.isSnappedToStart);
|
|
397
422
|
let stickyItemId, isNew = false;
|
|
423
|
+
let items;
|
|
398
424
|
// If the list is dynamic or there are new elements in the collection, then it switches to the long algorithm.
|
|
399
425
|
if (dynamicSize) {
|
|
426
|
+
items = [];
|
|
427
|
+
const serviceIdProp = getServiceIdProp(trackBy);
|
|
400
428
|
if (isFromId) {
|
|
401
429
|
for (let stickyId = undefined, i = 0, l = collection.length; i < l; i++) {
|
|
402
430
|
const item = collection[i], id = item?.[trackBy];
|
|
@@ -406,15 +434,51 @@ export class TrackBox extends CacheMap {
|
|
|
406
434
|
if (!itemConfigMap[id]?.sticky) {
|
|
407
435
|
stickyItemId = stickyId;
|
|
408
436
|
}
|
|
409
|
-
if (id
|
|
437
|
+
if (id == fromItemId) {
|
|
410
438
|
break;
|
|
411
439
|
}
|
|
412
440
|
}
|
|
413
441
|
}
|
|
414
|
-
let y = this._scrollStartOffset, stickyComponentSize = 0
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
442
|
+
let y = this._scrollStartOffset, stickyComponentSize = 0, row = {
|
|
443
|
+
startItemIndex: 0,
|
|
444
|
+
endItemIndex: 0,
|
|
445
|
+
size: 0,
|
|
446
|
+
snapshotSize: 0,
|
|
447
|
+
deltaFromStartCreation: 0,
|
|
448
|
+
leftSizeOfAddedItems: 0,
|
|
449
|
+
leftSizeOfUpdatedItems: 0,
|
|
450
|
+
leftSizeOfDeletedItems: 0,
|
|
451
|
+
deltaOfNewItems: 0,
|
|
452
|
+
leftItemsOrRowsWeights: null,
|
|
453
|
+
rightItemsWeight: 0,
|
|
454
|
+
leftHiddenItemsWeight: 0,
|
|
455
|
+
totalItemsToDisplayEndWeight: 0,
|
|
456
|
+
};
|
|
457
|
+
const calculate = (i, l, li, isPrecollection = false, idPrefix = null) => {
|
|
458
|
+
const ii = i + 1;
|
|
459
|
+
if (ii > l) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
const collectionItem = collection[i], id = collectionItem[trackBy], sticky = itemConfigMap?.[id]?.sticky ?? 0, isNewRow = i % divides === 0, isLastItemInRow = ii % divides === 0, isLastItem = i === li, isRowEnd = (isLastItemInRow || (!isLastItemInRow && isLastItem));
|
|
463
|
+
items.push(isPrecollection ? { ...collectionItem, [serviceIdProp]: `_${idPrefix}-${id}_` } : collectionItem);
|
|
464
|
+
if (isNewRow || row === null) {
|
|
465
|
+
row = {
|
|
466
|
+
startItemIndex: i + 1,
|
|
467
|
+
endItemIndex: i + divides,
|
|
468
|
+
size: 0,
|
|
469
|
+
snapshotSize: 0,
|
|
470
|
+
deltaFromStartCreation: 0,
|
|
471
|
+
leftSizeOfAddedItems: 0,
|
|
472
|
+
leftSizeOfUpdatedItems: 0,
|
|
473
|
+
leftSizeOfDeletedItems: 0,
|
|
474
|
+
deltaOfNewItems: 0,
|
|
475
|
+
leftItemsOrRowsWeights: null,
|
|
476
|
+
rightItemsWeight: 0,
|
|
477
|
+
leftHiddenItemsWeight: 0,
|
|
478
|
+
totalItemsToDisplayEndWeight: 0,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
let componentSize = 0, rowSizeDelta = 0, itemDisplayMethod = ItemDisplayMethods.NOT_CHANGED;
|
|
418
482
|
if (map.has(id)) {
|
|
419
483
|
const cache = map.get(id);
|
|
420
484
|
componentSize = cache[sizeProperty] > 0 ? cache[sizeProperty] : typicalItemSize;
|
|
@@ -424,42 +488,49 @@ export class TrackBox extends CacheMap {
|
|
|
424
488
|
if (isNew) {
|
|
425
489
|
isUpdating = true;
|
|
426
490
|
}
|
|
427
|
-
const snapshotBounds = snapshot.get(id),
|
|
428
|
-
|
|
491
|
+
const snapshotBounds = snapshot.get(id), snapshotSize = snapshotBounds ? snapshotBounds[sizeProperty] : typicalItemSize;
|
|
492
|
+
row.size = Math.max(row.size, componentSize);
|
|
493
|
+
row.snapshotSize = Math.max(row.snapshotSize, snapshotSize);
|
|
494
|
+
rowSizeDelta = row.size - row.snapshotSize;
|
|
429
495
|
switch (itemDisplayMethod) {
|
|
430
496
|
case ItemDisplayMethods.UPDATE: {
|
|
431
497
|
map.set(id, { ...cache, method: isNew ? ItemDisplayMethods.UPDATE : ItemDisplayMethods.NOT_CHANGED, [IS_NEW]: isNew });
|
|
432
|
-
if (isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
|
|
433
|
-
deltaFromStartCreation
|
|
434
|
-
|
|
498
|
+
if (isRowEnd && isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
|
|
499
|
+
row.deltaFromStartCreation = rowSizeDelta;
|
|
500
|
+
rowSizeDelta = 0;
|
|
435
501
|
}
|
|
436
502
|
break;
|
|
437
503
|
}
|
|
438
504
|
case ItemDisplayMethods.CREATE: {
|
|
439
|
-
|
|
505
|
+
rowSizeDelta = typicalItemSize;
|
|
440
506
|
map.set(id, { ...cache, method: ItemDisplayMethods.UPDATE, [IS_NEW]: isNew });
|
|
441
|
-
if (isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
|
|
442
|
-
deltaFromStartCreation
|
|
443
|
-
|
|
507
|
+
if (isRowEnd && isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
|
|
508
|
+
row.deltaFromStartCreation = rowSizeDelta;
|
|
509
|
+
rowSizeDelta = 0;
|
|
444
510
|
}
|
|
445
511
|
break;
|
|
446
512
|
}
|
|
447
513
|
}
|
|
448
514
|
}
|
|
515
|
+
else {
|
|
516
|
+
componentSize = typicalItemSize;
|
|
517
|
+
row.size = Math.max(row.size, componentSize);
|
|
518
|
+
row.snapshotSize = row.size;
|
|
519
|
+
rowSizeDelta = row.size - row.snapshotSize;
|
|
520
|
+
}
|
|
449
521
|
if (deletedItemsMap.hasOwnProperty(i)) {
|
|
450
522
|
const cache = deletedItemsMap[i], size = cache?.[sizeProperty] ?? typicalItemSize;
|
|
451
523
|
if (y < scrollSize + this._scrollStartOffset - size) {
|
|
452
|
-
leftSizeOfDeletedItems
|
|
524
|
+
row.leftSizeOfDeletedItems = Math.max(row.leftSizeOfDeletedItems, size);
|
|
453
525
|
}
|
|
454
526
|
}
|
|
455
|
-
totalSize += componentSize;
|
|
456
527
|
if (isFromId) {
|
|
457
|
-
if (itemById ===
|
|
458
|
-
if (id
|
|
528
|
+
if (itemById === null) {
|
|
529
|
+
if (id != fromItemId && id === stickyItemId && sticky === 1) {
|
|
459
530
|
stickyComponentSize = componentSize;
|
|
460
531
|
y -= stickyComponentSize;
|
|
461
532
|
}
|
|
462
|
-
if (id
|
|
533
|
+
if (id == fromItemId) {
|
|
463
534
|
isFromItemIdFound = true;
|
|
464
535
|
const { num, offset } = this.getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical), leftViewportSize = size - offset;
|
|
465
536
|
if (leftViewportSize > 0) {
|
|
@@ -468,96 +539,280 @@ export class TrackBox extends CacheMap {
|
|
|
468
539
|
itemsFromStartToScrollEnd -= deltaNum;
|
|
469
540
|
rightItemsWeight = rightItemLength = 0;
|
|
470
541
|
leftHiddenItemsWeight -= deltaOffset;
|
|
471
|
-
|
|
542
|
+
leftItemsOrRowsWeights.splice(leftItemsOrRowsWeights.length - deltaNum, deltaNum);
|
|
472
543
|
y -= deltaOffset;
|
|
473
544
|
}
|
|
474
545
|
itemById = collectionItem;
|
|
475
546
|
itemByIdPos = y;
|
|
476
547
|
}
|
|
477
548
|
else {
|
|
478
|
-
|
|
549
|
+
leftItemsOrRowsWeights.push(componentSize);
|
|
479
550
|
leftHiddenItemsWeight += componentSize;
|
|
480
|
-
itemsFromStartToScrollEnd =
|
|
551
|
+
itemsFromStartToScrollEnd = row.startItemIndex;
|
|
481
552
|
}
|
|
482
553
|
}
|
|
483
554
|
}
|
|
484
555
|
else if (y <= scrollSize - componentSize) {
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
556
|
+
if (row.leftItemsOrRowsWeights === null) {
|
|
557
|
+
row.leftItemsOrRowsWeights = 0;
|
|
558
|
+
}
|
|
559
|
+
row.leftItemsOrRowsWeights = Math.max(row.leftItemsOrRowsWeights, componentSize);
|
|
560
|
+
row.leftHiddenItemsWeight = Math.max(row.leftHiddenItemsWeight, componentSize);
|
|
561
|
+
if (!isPrecollection) {
|
|
562
|
+
itemsFromStartToScrollEnd = row.startItemIndex;
|
|
563
|
+
}
|
|
488
564
|
}
|
|
489
565
|
if (isFromId) {
|
|
490
|
-
if (itemById ===
|
|
491
|
-
itemsFromStartToDisplayEnd =
|
|
566
|
+
if (itemById === null || y < itemByIdPos + size + componentSize) {
|
|
567
|
+
itemsFromStartToDisplayEnd = row.endItemIndex;
|
|
492
568
|
totalItemsToDisplayEndWeight += componentSize;
|
|
493
569
|
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
|
|
494
570
|
}
|
|
495
571
|
}
|
|
496
572
|
else if (y <= scrollSize + size + componentSize) {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
573
|
+
if (!isPrecollection) {
|
|
574
|
+
itemsFromStartToDisplayEnd = row.endItemIndex;
|
|
575
|
+
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
|
|
576
|
+
}
|
|
577
|
+
row.totalItemsToDisplayEndWeight = Math.max(row.totalItemsToDisplayEndWeight, componentSize);
|
|
578
|
+
if (isRowEnd && y <= scrollSize + componentSize) {
|
|
501
579
|
switch (itemDisplayMethod) {
|
|
502
580
|
case ItemDisplayMethods.CREATE: {
|
|
503
|
-
leftSizeOfAddedItems
|
|
581
|
+
row.leftSizeOfAddedItems = rowSizeDelta;
|
|
504
582
|
break;
|
|
505
583
|
}
|
|
506
584
|
case ItemDisplayMethods.UPDATE:
|
|
507
585
|
case ItemDisplayMethods.NOT_CHANGED: {
|
|
508
|
-
leftSizeOfUpdatedItems
|
|
586
|
+
row.leftSizeOfUpdatedItems = rowSizeDelta;
|
|
509
587
|
break;
|
|
510
588
|
}
|
|
511
589
|
case ItemDisplayMethods.DELETE: {
|
|
512
|
-
leftSizeOfDeletedItems
|
|
590
|
+
row.leftSizeOfDeletedItems = rowSizeDelta;
|
|
513
591
|
break;
|
|
514
592
|
}
|
|
515
593
|
}
|
|
516
594
|
}
|
|
517
|
-
if (itemDisplayMethod === ItemDisplayMethods.CREATE) {
|
|
518
|
-
deltaOfNewItems
|
|
595
|
+
if (isRowEnd && itemDisplayMethod === ItemDisplayMethods.CREATE) {
|
|
596
|
+
row.deltaOfNewItems = rowSizeDelta;
|
|
519
597
|
}
|
|
520
598
|
}
|
|
521
599
|
else {
|
|
522
|
-
if (i < itemsFromDisplayEndToOffsetEnd) {
|
|
523
|
-
rightItemsWeight
|
|
600
|
+
if (isRowEnd && i < itemsFromDisplayEndToOffsetEnd) {
|
|
601
|
+
row.rightItemsWeight = Math.max(row.rightItemsWeight, componentSize);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (isRowEnd) {
|
|
605
|
+
if (!isPrecollection) {
|
|
606
|
+
deltaFromStartCreation += row.deltaFromStartCreation;
|
|
607
|
+
leftSizeOfAddedItems += row.leftSizeOfAddedItems;
|
|
608
|
+
leftSizeOfUpdatedItems += row.leftSizeOfUpdatedItems;
|
|
609
|
+
leftSizeOfDeletedItems += row.leftSizeOfDeletedItems;
|
|
610
|
+
deltaOfNewItems += row.deltaOfNewItems;
|
|
611
|
+
rightItemsWeight += row.rightItemsWeight;
|
|
612
|
+
totalItemsToDisplayEndWeight += row.totalItemsToDisplayEndWeight;
|
|
613
|
+
leftHiddenItemsWeight += row.leftHiddenItemsWeight;
|
|
614
|
+
if (row.leftItemsOrRowsWeights !== null) {
|
|
615
|
+
leftItemsOrRowsWeights.push(row.leftItemsOrRowsWeights);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
totalSize += row.size;
|
|
619
|
+
y += row.size;
|
|
620
|
+
}
|
|
621
|
+
return true;
|
|
622
|
+
};
|
|
623
|
+
if (this._isInfinity) {
|
|
624
|
+
const viewportSize = isVertical ? height : width;
|
|
625
|
+
let buffSize = -1;
|
|
626
|
+
if (scrollSize <= viewportSize) {
|
|
627
|
+
let i = 0, l = collection.length, li = l > 0 ? (l - 1) : 0;
|
|
628
|
+
if (l > 0) {
|
|
629
|
+
const limit = viewportSize;
|
|
630
|
+
while (y <= limit || buffSize > -1) {
|
|
631
|
+
const ii = i + 1;
|
|
632
|
+
if (buffSize === -1) {
|
|
633
|
+
buffSize = leftItemsOffset;
|
|
634
|
+
}
|
|
635
|
+
if (y >= limit) {
|
|
636
|
+
buffSize--;
|
|
637
|
+
}
|
|
638
|
+
if (!calculate(li - i, l, li, true, START_COLLECTION_PREFIX_ID)) {
|
|
639
|
+
break;
|
|
640
|
+
}
|
|
641
|
+
if (ii === l) {
|
|
642
|
+
i = 0;
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
i++;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
items.reverse();
|
|
649
|
+
leftYOffset = y;
|
|
650
|
+
leftLayoutOffset = viewportSize * .5;
|
|
651
|
+
leftLayoutIndexOffset = i;
|
|
652
|
+
y = this._scrollStartOffset;
|
|
653
|
+
totalSize = this._scrollStartOffset + this._scrollEndOffset;
|
|
654
|
+
itemsFromStartToDisplayEnd = itemsFromDisplayEndToOffsetEnd = 0;
|
|
655
|
+
row = null;
|
|
524
656
|
}
|
|
525
657
|
}
|
|
526
|
-
y += componentSize;
|
|
527
658
|
}
|
|
659
|
+
for (let i = 0, l = collection.length, li = l - 1; i < l; i++) {
|
|
660
|
+
if (!calculate(i, l, li)) {
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
if (this._isInfinity) {
|
|
665
|
+
row = null;
|
|
666
|
+
const yy = y, currentTotalSize = totalSize, viewportSize = isVertical ? height : width, normalizedTotalSize = totalSize + viewportSize;
|
|
667
|
+
row = {
|
|
668
|
+
startItemIndex: 0,
|
|
669
|
+
endItemIndex: 0,
|
|
670
|
+
size: 0,
|
|
671
|
+
snapshotSize: 0,
|
|
672
|
+
deltaFromStartCreation: 0,
|
|
673
|
+
leftSizeOfAddedItems: 0,
|
|
674
|
+
leftSizeOfUpdatedItems: 0,
|
|
675
|
+
leftSizeOfDeletedItems: 0,
|
|
676
|
+
deltaOfNewItems: 0,
|
|
677
|
+
leftItemsOrRowsWeights: null,
|
|
678
|
+
rightItemsWeight: 0,
|
|
679
|
+
leftHiddenItemsWeight: 0,
|
|
680
|
+
totalItemsToDisplayEndWeight: 0,
|
|
681
|
+
};
|
|
682
|
+
const l = collection.length, li = l - 1;
|
|
683
|
+
let i = 0, count = 0;
|
|
684
|
+
while (y < normalizedTotalSize) {
|
|
685
|
+
const ii = i + 1;
|
|
686
|
+
if (!calculate(i, l, li, true, END_COLLECTION_PREFIX_ID)) {
|
|
687
|
+
break;
|
|
688
|
+
}
|
|
689
|
+
if (ii === l) {
|
|
690
|
+
i = 0;
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
i++;
|
|
694
|
+
}
|
|
695
|
+
count++;
|
|
696
|
+
}
|
|
697
|
+
y = yy;
|
|
698
|
+
totalSize = currentTotalSize;
|
|
699
|
+
rightLayoutIndexOffset = count;
|
|
700
|
+
}
|
|
701
|
+
actualScrollSize = (isFromId ? itemByIdPos : scrollSize);
|
|
528
702
|
if (itemsFromStartToScrollEnd <= -1) {
|
|
529
703
|
itemsFromStartToScrollEnd = 0;
|
|
530
704
|
}
|
|
531
705
|
if (itemsFromStartToDisplayEnd <= -1) {
|
|
532
706
|
itemsFromStartToDisplayEnd = 0;
|
|
533
707
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
leftItemsWeights.forEach(v => {
|
|
708
|
+
leftItemsOrRowsWeights.splice(0, leftItemsOrRowsWeights.length - bufferSize);
|
|
709
|
+
leftItemsOrRowsWeights.forEach(v => {
|
|
537
710
|
leftItemsWeight += v;
|
|
538
711
|
});
|
|
539
712
|
leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);
|
|
540
713
|
rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength
|
|
541
714
|
? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;
|
|
715
|
+
startIndex = (Math.ceil(Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0) / divides) * divides);
|
|
542
716
|
}
|
|
543
717
|
else
|
|
544
718
|
// Buffer optimization does not work on fast linear algorithm
|
|
545
719
|
{
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
720
|
+
const dividedTypicalItemSize = typicalItemSize / divides, bufferItemNumbers = bufferSize * divides;
|
|
721
|
+
itemsFromStartToScrollEnd = Math.floor(dividedTypicalItemSize !== 0 ? (scrollSize / dividedTypicalItemSize) : 0);
|
|
722
|
+
itemsFromStartToDisplayEnd = Math.ceil(dividedTypicalItemSize !== 0 ? ((scrollSize + size) / dividedTypicalItemSize) : 0);
|
|
723
|
+
leftItemLength = Math.min(itemsFromStartToScrollEnd, bufferSize * divides);
|
|
724
|
+
rightItemLength = (itemsFromStartToDisplayEnd + bufferItemNumbers) > totalLength
|
|
725
|
+
? totalLength - itemsFromStartToDisplayEnd : bufferItemNumbers;
|
|
726
|
+
leftItemsWeight = Math.floor(leftItemLength * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
|
|
727
|
+
rightItemsWeight = Math.floor(rightItemLength * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
|
|
728
|
+
leftHiddenItemsWeight = Math.floor(itemsFromStartToScrollEnd * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
|
|
729
|
+
totalItemsToDisplayEndWeight = Math.floor(itemsFromStartToDisplayEnd * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
|
|
730
|
+
totalSize = (totalLength * dividedTypicalItemSize) + this._scrollStartOffset + this._scrollEndOffset;
|
|
556
731
|
const k = totalSize !== 0 ? previousTotalSize / totalSize : 0;
|
|
557
|
-
|
|
732
|
+
if (isFromId) {
|
|
733
|
+
const index = collection.findIndex(item => item[trackBy] == fromItemId);
|
|
734
|
+
if (index > -1) {
|
|
735
|
+
itemByIdPos = this._scrollStartOffset + Math.floor(index * dividedTypicalItemSize / divides);
|
|
736
|
+
isFromItemIdFound = true;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
actualScrollSize = (isFromId ? itemByIdPos : scrollSize * k);
|
|
740
|
+
items = [];
|
|
741
|
+
if (this._isInfinity) {
|
|
742
|
+
const viewportSize = isVertical ? height : width;
|
|
743
|
+
let buffSize = -1, y = this._scrollStartOffset;
|
|
744
|
+
if (scrollSize <= viewportSize) {
|
|
745
|
+
let i = 0, l = collection.length, li = l > 0 ? (l - 1) : 0;
|
|
746
|
+
if (l > 0) {
|
|
747
|
+
const limit = viewportSize;
|
|
748
|
+
while (y <= limit || buffSize > -1) {
|
|
749
|
+
const ii = i + 1;
|
|
750
|
+
if (buffSize === -1) {
|
|
751
|
+
buffSize = leftItemsOffset;
|
|
752
|
+
}
|
|
753
|
+
if (y >= limit) {
|
|
754
|
+
buffSize--;
|
|
755
|
+
}
|
|
756
|
+
const itemIndex = li - i;
|
|
757
|
+
if (collection.length > itemIndex) {
|
|
758
|
+
items.push(collection[itemIndex]);
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
break;
|
|
762
|
+
}
|
|
763
|
+
const isLastItemInRow = ii % divides === 0, isLastItem = i === li;
|
|
764
|
+
if (isLastItemInRow || (!isLastItemInRow && isLastItem)) {
|
|
765
|
+
y += dividedTypicalItemSize;
|
|
766
|
+
}
|
|
767
|
+
if (ii === l) {
|
|
768
|
+
i = 0;
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
i++;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
items.reverse();
|
|
775
|
+
leftYOffset = y;
|
|
776
|
+
leftLayoutOffset = viewportSize * .5;
|
|
777
|
+
leftLayoutIndexOffset = i;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
items.push(...collection);
|
|
782
|
+
if (this._isInfinity) {
|
|
783
|
+
let y = Math.floor(totalSize / dividedTypicalItemSize) * dividedTypicalItemSize;
|
|
784
|
+
const viewportSize = isVertical ? height : width, normalizedTotalSize = totalSize + viewportSize;
|
|
785
|
+
const l = collection.length, li = l - 1;
|
|
786
|
+
let i = 0, count = 0;
|
|
787
|
+
while (y < normalizedTotalSize) {
|
|
788
|
+
const ii = i + 1;
|
|
789
|
+
if (collection.length <= i) {
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
items.push(collection[i]);
|
|
793
|
+
const isLastItemInRow = ii % divides === 0, isLastItem = i === li;
|
|
794
|
+
if (isLastItemInRow || (!isLastItemInRow && isLastItem)) {
|
|
795
|
+
y += dividedTypicalItemSize;
|
|
796
|
+
}
|
|
797
|
+
if (ii === l) {
|
|
798
|
+
i = 0;
|
|
799
|
+
}
|
|
800
|
+
else {
|
|
801
|
+
i++;
|
|
802
|
+
}
|
|
803
|
+
count++;
|
|
804
|
+
}
|
|
805
|
+
rightLayoutIndexOffset = count;
|
|
806
|
+
leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);
|
|
807
|
+
rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength
|
|
808
|
+
? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;
|
|
809
|
+
startIndex = (Math.ceil(Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0) / divides) * divides);
|
|
810
|
+
}
|
|
811
|
+
else {
|
|
812
|
+
startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);
|
|
813
|
+
}
|
|
558
814
|
}
|
|
559
|
-
|
|
560
|
-
const itemsOnDisplayWeight = totalItemsToDisplayEndWeight - leftItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd, startPosition = this._scrollStartOffset + leftHiddenItemsWeight - leftItemsWeight, renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength, startCreationDelta = deltaFromStartCreation > 0 ? deltaFromStartCreation : 0, delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems + startCreationDelta;
|
|
815
|
+
const itemsOnDisplayWeight = totalItemsToDisplayEndWeight - leftItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd, startPosition = this._scrollStartOffset + leftHiddenItemsWeight - leftItemsWeight - leftYOffset, renderItems = (Math.ceil((itemsOnDisplayLength + leftItemLength + rightItemLength) / divides) * divides) + rightLayoutIndexOffset, startCreationDelta = deltaFromStartCreation > 0 ? deltaFromStartCreation : 0, delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems + startCreationDelta;
|
|
561
816
|
this._deltaOfNewItems = deltaOfNewItems;
|
|
562
817
|
if (isFromId && !isTargetInOverscroll) {
|
|
563
818
|
actualScrollSize -= this._scrollStartOffset;
|
|
@@ -569,7 +824,11 @@ export class TrackBox extends CacheMap {
|
|
|
569
824
|
width,
|
|
570
825
|
height,
|
|
571
826
|
dynamicSize,
|
|
827
|
+
divides,
|
|
572
828
|
itemSize,
|
|
829
|
+
minItemSize,
|
|
830
|
+
maxItemSize,
|
|
831
|
+
items,
|
|
573
832
|
itemsFromStartToScrollEnd,
|
|
574
833
|
itemsFromStartToDisplayEnd,
|
|
575
834
|
itemsOnDisplayWeight,
|
|
@@ -578,14 +837,16 @@ export class TrackBox extends CacheMap {
|
|
|
578
837
|
leftHiddenItemsWeight,
|
|
579
838
|
leftItemLength,
|
|
580
839
|
leftItemsWeight,
|
|
840
|
+
leftLayoutOffset,
|
|
841
|
+
leftLayoutIndexOffset,
|
|
581
842
|
renderItems,
|
|
582
843
|
rightItemLength,
|
|
583
844
|
rightItemsWeight,
|
|
584
845
|
scrollSize: actualScrollSize,
|
|
585
846
|
leftSizeOfAddedItems,
|
|
586
847
|
sizeProperty,
|
|
587
|
-
|
|
588
|
-
|
|
848
|
+
stickyEnabled,
|
|
849
|
+
stickyPos,
|
|
589
850
|
startIndex,
|
|
590
851
|
startPosition,
|
|
591
852
|
totalItemsToDisplayEndWeight,
|
|
@@ -594,17 +855,17 @@ export class TrackBox extends CacheMap {
|
|
|
594
855
|
typicalItemSize,
|
|
595
856
|
isFromItemIdFound,
|
|
596
857
|
isUpdating,
|
|
858
|
+
snapToItem,
|
|
859
|
+
snapToItemAlign,
|
|
860
|
+
itemTransform,
|
|
597
861
|
};
|
|
598
862
|
return metrics;
|
|
599
863
|
}
|
|
600
864
|
refreshCache(cache) {
|
|
601
865
|
this._prerenderedCache = cache;
|
|
602
866
|
}
|
|
603
|
-
clearDelta(
|
|
867
|
+
clearDelta() {
|
|
604
868
|
this._delta = this._deltaOfNewItems = 0;
|
|
605
|
-
if (clearDirectionDetector) {
|
|
606
|
-
this.clearScrollDirectionCache();
|
|
607
|
-
}
|
|
608
869
|
}
|
|
609
870
|
changes(immediately = false, force = false) {
|
|
610
871
|
if (immediately) {
|
|
@@ -646,25 +907,44 @@ export class TrackBox extends CacheMap {
|
|
|
646
907
|
}
|
|
647
908
|
return false;
|
|
648
909
|
}
|
|
649
|
-
generateDisplayCollection(items, itemConfigMap, metrics) {
|
|
650
|
-
const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, renderItems: renderItemsLength, scrollSize, sizeProperty,
|
|
910
|
+
generateDisplayCollection(items, actualItems, itemConfigMap, metrics) {
|
|
911
|
+
const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, divides, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, leftLayoutOffset: layoutOffset, leftLayoutIndexOffset: layoutIndexOffset, renderItems: renderItemsLength, scrollSize, sizeProperty, stickyEnabled, stickyPos, startPosition, totalLength, startIndex, typicalItemSize, minItemSize, maxItemSize, snapToItem, snapToItemAlign, itemTransform, } = metrics, displayItems = [];
|
|
651
912
|
if (items.length) {
|
|
652
|
-
const trackBy = this._trackingPropertyName, actualSnippedPosition =
|
|
653
|
-
let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0, endStickyItem, nextEndSticky, endStickyItemIndex = -1, endStickyItemSize = 0
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
913
|
+
const trackBy = this._trackingPropertyName, actualSnippedPosition = stickyPos, isSnappingMethodAdvanced = this._isSnappingMethodAdvanced, deltaOffet = (isSnappingMethodAdvanced ? scrollSize : 0), scrollDirection = this._scrollDirection, boundsSize = isVertical ? height : width, actualEndSnippedPosition = scrollSize + boundsSize - this._scrollEndOffset;
|
|
914
|
+
let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0, endStickyItem, nextEndSticky, endStickyItemIndex = -1, endStickyItemSize = 0;
|
|
915
|
+
const li = layoutIndexOffset + actualItems.length - 1;
|
|
916
|
+
if (stickyEnabled) {
|
|
917
|
+
for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? (divides > 1 ? (itemsFromStartToScrollEnd - 1) : itemsFromStartToScrollEnd) : 0, totalLength - 1); i >= 0; i--) {
|
|
918
|
+
const collectionItem = items[i], isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED);
|
|
919
|
+
if (!collectionItem || isDummy) {
|
|
658
920
|
continue;
|
|
659
921
|
}
|
|
660
|
-
const id = collectionItem[trackBy], cache = this.get(id), sticky = itemConfigMap[id]?.sticky ?? 0, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, size = dynamicSize ? cache?.[sizeProperty] > 0 ? cache?.[sizeProperty] : typicalItemSize : typicalItemSize, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio);
|
|
922
|
+
const rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), id = collectionItem[trackBy], cache = this.get(id), sticky = itemConfigMap[id]?.sticky ?? 0, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, size = dynamicSize ? cache?.[sizeProperty] > 0 ? cache?.[sizeProperty] : typicalItemSize : typicalItemSize, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? 0 : actualSnippedPosition, y = isVertical ? actualSnippedPosition : 0;
|
|
661
923
|
if (sticky === 1) {
|
|
662
|
-
const isOdd = i % 2 != 0, measures = {
|
|
663
|
-
x
|
|
664
|
-
y
|
|
924
|
+
const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, measures = {
|
|
925
|
+
x,
|
|
926
|
+
y,
|
|
927
|
+
transformedX: x,
|
|
928
|
+
transformedY: y,
|
|
929
|
+
z: 0,
|
|
930
|
+
rotationX: 0,
|
|
931
|
+
rotationY: 0,
|
|
932
|
+
rotationZ: 0,
|
|
933
|
+
scaleX: 1,
|
|
934
|
+
scaleY: 1,
|
|
935
|
+
scaleZ: 1,
|
|
665
936
|
width: isVertical ? normalizedItemWidth : size,
|
|
666
937
|
height: isVertical ? size : normalizedItemHeight,
|
|
938
|
+
minWidth: minItemSize,
|
|
939
|
+
minHeight: minItemSize,
|
|
940
|
+
maxWidth: maxItemSize,
|
|
941
|
+
maxHeight: maxItemSize,
|
|
667
942
|
size,
|
|
943
|
+
row: {
|
|
944
|
+
size,
|
|
945
|
+
odd: rowIndex % 2 != 0,
|
|
946
|
+
even: rowIndex % 2 == 0,
|
|
947
|
+
},
|
|
668
948
|
position: pos,
|
|
669
949
|
boundsSize,
|
|
670
950
|
scrollSize,
|
|
@@ -672,8 +952,12 @@ export class TrackBox extends CacheMap {
|
|
|
672
952
|
absoluteStartPositionPercent,
|
|
673
953
|
absoluteEndPosition,
|
|
674
954
|
absoluteEndPositionPercent,
|
|
955
|
+
scrollDirection,
|
|
675
956
|
delta: sticky === 1 ? this._scrollStartOffset : sticky === 2 ? actualEndSnippedPosition - deltaOffet - size : 0,
|
|
676
957
|
}, config = {
|
|
958
|
+
fullSize: true,
|
|
959
|
+
isFirst: i === layoutIndexOffset,
|
|
960
|
+
isLast: i === li,
|
|
677
961
|
new: cache?.[IS_NEW] === true,
|
|
678
962
|
odd: isOdd,
|
|
679
963
|
even: !isOdd,
|
|
@@ -681,13 +965,20 @@ export class TrackBox extends CacheMap {
|
|
|
681
965
|
collapsable,
|
|
682
966
|
selectable,
|
|
683
967
|
sticky,
|
|
684
|
-
snap,
|
|
968
|
+
snap: stickyEnabled,
|
|
685
969
|
snapped: true,
|
|
686
970
|
snappedOut: false,
|
|
687
971
|
dynamic: dynamicSize,
|
|
688
972
|
isSnappingMethodAdvanced,
|
|
689
|
-
|
|
690
|
-
|
|
973
|
+
layoutOffset,
|
|
974
|
+
layoutIndexOffset,
|
|
975
|
+
totalItems: items.length,
|
|
976
|
+
snapToItem,
|
|
977
|
+
snapToItemAlign,
|
|
978
|
+
tabIndex: i - layoutIndexOffset,
|
|
979
|
+
divides,
|
|
980
|
+
opacity: 1,
|
|
981
|
+
zIndex: Z_INDEX_1,
|
|
691
982
|
};
|
|
692
983
|
const itemData = collectionItem;
|
|
693
984
|
stickyItem = {
|
|
@@ -697,26 +988,39 @@ export class TrackBox extends CacheMap {
|
|
|
697
988
|
stickyItemIndex = i;
|
|
698
989
|
stickyItemSize = size;
|
|
699
990
|
displayItems.push(stickyItem);
|
|
700
|
-
count++;
|
|
701
991
|
break;
|
|
702
992
|
}
|
|
703
993
|
}
|
|
704
994
|
}
|
|
705
|
-
if (
|
|
995
|
+
if (stickyEnabled) {
|
|
706
996
|
const si = itemsFromStartToScrollEnd + itemsOnDisplayLength - 1, startIndex = si < 0 ? si : si;
|
|
707
|
-
for (let i = Math.min(startIndex, totalLength > 0 ? totalLength - 1 : 0), l = totalLength; i < l; i++) {
|
|
708
|
-
const collectionItem = items[i];
|
|
709
|
-
if (!collectionItem) {
|
|
997
|
+
for (let i = Math.min(startIndex, totalLength > 0 ? totalLength - 1 : 0), rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), l = totalLength; i < l; i++) {
|
|
998
|
+
const collectionItem = items[i], isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED);
|
|
999
|
+
if (!collectionItem || isDummy) {
|
|
710
1000
|
continue;
|
|
711
1001
|
}
|
|
712
1002
|
const id = collectionItem[trackBy], cache = this.get(id), sticky = itemConfigMap[id]?.sticky ?? 0, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, size = dynamicSize
|
|
713
1003
|
? cache?.[sizeProperty] || typicalItemSize
|
|
714
1004
|
: typicalItemSize;
|
|
715
1005
|
if (sticky === 2) {
|
|
716
|
-
const isOdd = i % 2 != 0, w = isVertical ? normalizedItemWidth : size, h = isVertical ? size : normalizedItemHeight, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), measures = {
|
|
717
|
-
x
|
|
718
|
-
y
|
|
1006
|
+
const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, w = isVertical ? normalizedItemWidth : size, h = isVertical ? size : normalizedItemHeight, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? 0 : actualEndSnippedPosition - w, y = isVertical ? actualEndSnippedPosition - h : 0, measures = {
|
|
1007
|
+
x,
|
|
1008
|
+
y,
|
|
1009
|
+
transformedX: x,
|
|
1010
|
+
transformedY: y,
|
|
1011
|
+
z: 0,
|
|
1012
|
+
rotationX: 0,
|
|
1013
|
+
rotationY: 0,
|
|
1014
|
+
rotationZ: 0,
|
|
1015
|
+
scaleX: 1,
|
|
1016
|
+
scaleY: 1,
|
|
1017
|
+
scaleZ: 1,
|
|
719
1018
|
size,
|
|
1019
|
+
row: {
|
|
1020
|
+
size,
|
|
1021
|
+
odd: rowIndex % 2 != 0,
|
|
1022
|
+
even: rowIndex % 2 == 0,
|
|
1023
|
+
},
|
|
720
1024
|
position: pos,
|
|
721
1025
|
boundsSize,
|
|
722
1026
|
scrollSize,
|
|
@@ -726,8 +1030,16 @@ export class TrackBox extends CacheMap {
|
|
|
726
1030
|
absoluteEndPositionPercent,
|
|
727
1031
|
width: w,
|
|
728
1032
|
height: h,
|
|
1033
|
+
minWidth: minItemSize,
|
|
1034
|
+
minHeight: minItemSize,
|
|
1035
|
+
maxWidth: maxItemSize,
|
|
1036
|
+
maxHeight: maxItemSize,
|
|
1037
|
+
scrollDirection,
|
|
729
1038
|
delta: actualEndSnippedPosition - deltaOffet - size,
|
|
730
1039
|
}, config = {
|
|
1040
|
+
fullSize: true,
|
|
1041
|
+
isFirst: i === layoutIndexOffset,
|
|
1042
|
+
isLast: i === li,
|
|
731
1043
|
new: cache?.[IS_NEW] === true,
|
|
732
1044
|
odd: isOdd,
|
|
733
1045
|
even: !isOdd,
|
|
@@ -735,13 +1047,20 @@ export class TrackBox extends CacheMap {
|
|
|
735
1047
|
collapsable,
|
|
736
1048
|
selectable,
|
|
737
1049
|
sticky,
|
|
738
|
-
snap,
|
|
1050
|
+
snap: stickyEnabled,
|
|
739
1051
|
snapped: true,
|
|
740
1052
|
snappedOut: false,
|
|
741
1053
|
dynamic: dynamicSize,
|
|
742
1054
|
isSnappingMethodAdvanced,
|
|
743
|
-
|
|
744
|
-
|
|
1055
|
+
layoutOffset,
|
|
1056
|
+
layoutIndexOffset,
|
|
1057
|
+
totalItems: items.length,
|
|
1058
|
+
snapToItem,
|
|
1059
|
+
snapToItemAlign,
|
|
1060
|
+
tabIndex: i - layoutIndexOffset,
|
|
1061
|
+
divides,
|
|
1062
|
+
opacity: 1,
|
|
1063
|
+
zIndex: Z_INDEX_1,
|
|
745
1064
|
};
|
|
746
1065
|
const itemData = collectionItem;
|
|
747
1066
|
endStickyItem = {
|
|
@@ -755,79 +1074,123 @@ export class TrackBox extends CacheMap {
|
|
|
755
1074
|
}
|
|
756
1075
|
}
|
|
757
1076
|
}
|
|
758
|
-
|
|
1077
|
+
const collectionLength = items.length;
|
|
1078
|
+
let i = startIndex, ci = 0, row = {
|
|
1079
|
+
size: 0,
|
|
1080
|
+
odd: false,
|
|
1081
|
+
even: false,
|
|
1082
|
+
};
|
|
759
1083
|
while (renderItems > 0) {
|
|
760
|
-
|
|
761
|
-
if (iterations > totalLength || i >= totalLength) {
|
|
1084
|
+
if (i >= collectionLength) {
|
|
762
1085
|
break;
|
|
763
1086
|
}
|
|
764
1087
|
const collectionItem = items[i];
|
|
765
1088
|
if (!collectionItem) {
|
|
766
|
-
|
|
1089
|
+
break;
|
|
767
1090
|
}
|
|
768
|
-
const id = collectionItem[trackBy], cache = this.get(id), size = dynamicSize ? cache?.[sizeProperty] || typicalItemSize : typicalItemSize;
|
|
769
|
-
if (
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
y: isVertical ? pos : 0,
|
|
1091
|
+
const isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED), ii = i + 1, rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), id = collectionItem[trackBy], cache = this.get(id), size = isDummy ? typicalItemSize : (dynamicSize ? cache?.[sizeProperty] || typicalItemSize : typicalItemSize), divSize = (isVertical ? normalizedItemWidth : normalizedItemHeight) / divides;
|
|
1092
|
+
if (i % divides === 0) {
|
|
1093
|
+
ci = 0;
|
|
1094
|
+
row = {
|
|
773
1095
|
size,
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
scrollSize,
|
|
777
|
-
absoluteStartPosition,
|
|
778
|
-
absoluteStartPositionPercent,
|
|
779
|
-
absoluteEndPosition,
|
|
780
|
-
absoluteEndPositionPercent,
|
|
781
|
-
width: isVertical ? normalizedItemWidth : size,
|
|
782
|
-
height: isVertical ? size : normalizedItemHeight,
|
|
783
|
-
delta: sticky === 1 ? actualSnippedPosition : sticky === 2 ? actualEndSnippedPosition - deltaOffet - size : 0,
|
|
784
|
-
}, config = {
|
|
785
|
-
new: cache?.[IS_NEW] === true,
|
|
786
|
-
odd: isOdd,
|
|
787
|
-
even: !isOdd,
|
|
788
|
-
isVertical,
|
|
789
|
-
collapsable,
|
|
790
|
-
selectable,
|
|
791
|
-
sticky: sticky,
|
|
792
|
-
snap,
|
|
793
|
-
snapped: false,
|
|
794
|
-
snappedOut: false,
|
|
795
|
-
dynamic: dynamicSize,
|
|
796
|
-
isSnappingMethodAdvanced,
|
|
797
|
-
tabIndex: count,
|
|
798
|
-
isStub: (isSnappingMethodAdvanced && id === stickyItem?.id),
|
|
799
|
-
zIndex: '0',
|
|
1096
|
+
odd: rowIndex % 2 !== 0,
|
|
1097
|
+
even: rowIndex % 2 === 0,
|
|
800
1098
|
};
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
1099
|
+
}
|
|
1100
|
+
else {
|
|
1101
|
+
row.size = Math.max(row.size, size);
|
|
1102
|
+
ci++;
|
|
1103
|
+
}
|
|
1104
|
+
if (!isDummy) {
|
|
1105
|
+
if ((isSnappingMethodAdvanced || id !== stickyItem?.id) && id !== endStickyItem?.id) {
|
|
1106
|
+
const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, sticky = itemConfigMap[id]?.sticky ?? 0, fullSize = itemConfigMap[id]?.fullSize ?? false, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, snapped = stickyEnabled && (sticky === 1 && (pos <= scrollSize + this._scrollStartOffset) || sticky === 2 && (pos >= scrollSize + boundsSize - size)), absoluteStartPosition = pos - scrollSize, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? divSize * ((sticky || fullSize) ? 0 : ci) : pos, y = isVertical ? pos : divSize * ((sticky || fullSize) ? 0 : ci), measures = {
|
|
1107
|
+
x,
|
|
1108
|
+
y,
|
|
1109
|
+
transformedX: x,
|
|
1110
|
+
transformedY: y,
|
|
1111
|
+
z: 0,
|
|
1112
|
+
rotationX: 0,
|
|
1113
|
+
rotationY: 0,
|
|
1114
|
+
rotationZ: 0,
|
|
1115
|
+
scaleX: 1,
|
|
1116
|
+
scaleY: 1,
|
|
1117
|
+
scaleZ: 1,
|
|
1118
|
+
size,
|
|
1119
|
+
row,
|
|
1120
|
+
position: pos,
|
|
1121
|
+
boundsSize,
|
|
1122
|
+
scrollSize,
|
|
1123
|
+
absoluteStartPosition,
|
|
1124
|
+
absoluteStartPositionPercent,
|
|
1125
|
+
absoluteEndPosition,
|
|
1126
|
+
absoluteEndPositionPercent,
|
|
1127
|
+
width: isVertical ? ((sticky || fullSize) ? normalizedItemWidth : (normalizedItemWidth / divides)) : size,
|
|
1128
|
+
height: isVertical ? size : ((sticky || fullSize) ? normalizedItemHeight : (normalizedItemHeight / divides)),
|
|
1129
|
+
minWidth: minItemSize,
|
|
1130
|
+
minHeight: minItemSize,
|
|
1131
|
+
maxWidth: maxItemSize,
|
|
1132
|
+
maxHeight: maxItemSize,
|
|
1133
|
+
scrollDirection,
|
|
1134
|
+
delta: sticky === 1 ? actualSnippedPosition : sticky === 2 ? actualEndSnippedPosition - deltaOffet - size : 0,
|
|
1135
|
+
}, config = {
|
|
1136
|
+
isFirst: i === layoutIndexOffset,
|
|
1137
|
+
isLast: i === li,
|
|
1138
|
+
new: cache?.[IS_NEW] === true,
|
|
1139
|
+
odd: isOdd,
|
|
1140
|
+
even: !isOdd,
|
|
1141
|
+
isVertical,
|
|
1142
|
+
collapsable,
|
|
1143
|
+
selectable,
|
|
1144
|
+
sticky: sticky,
|
|
1145
|
+
snap: stickyEnabled,
|
|
1146
|
+
snapped: false,
|
|
1147
|
+
snappedOut: false,
|
|
1148
|
+
dynamic: dynamicSize,
|
|
1149
|
+
isSnappingMethodAdvanced,
|
|
1150
|
+
layoutOffset,
|
|
1151
|
+
layoutIndexOffset,
|
|
1152
|
+
totalItems: items.length,
|
|
1153
|
+
snapToItem,
|
|
1154
|
+
snapToItemAlign,
|
|
1155
|
+
tabIndex: i - layoutIndexOffset,
|
|
1156
|
+
isStub: (isSnappingMethodAdvanced && id === stickyItem?.id),
|
|
1157
|
+
divides,
|
|
1158
|
+
opacity: 1,
|
|
1159
|
+
zIndex: Z_INDEX_0,
|
|
1160
|
+
fullSize,
|
|
1161
|
+
};
|
|
1162
|
+
if (snapped) {
|
|
1163
|
+
config.zIndex = Z_INDEX_2;
|
|
1164
|
+
}
|
|
1165
|
+
const itemData = collectionItem;
|
|
1166
|
+
const item = {
|
|
1167
|
+
index: i, id, measures, data: itemData, previouseData: i > 0 ? items[i - 1] : null,
|
|
1168
|
+
nextData: i < totalLength ? items[i + 1] : null, config,
|
|
1169
|
+
};
|
|
1170
|
+
if (!nextSticky && stickyItemIndex < i && sticky === 1 && (pos <= scrollSize + this._scrollStartOffset + size + stickyItemSize)) {
|
|
1171
|
+
item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;
|
|
1172
|
+
item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;
|
|
1173
|
+
nextSticky = item;
|
|
1174
|
+
nextSticky.config.snapped = snapped;
|
|
1175
|
+
nextSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
|
|
1176
|
+
nextSticky.config.zIndex = Z_INDEX_3;
|
|
1177
|
+
}
|
|
1178
|
+
if (!nextEndSticky && endStickyItemIndex > i && sticky === 2 &&
|
|
1179
|
+
(pos >= actualEndSnippedPosition - size - endStickyItemSize)) {
|
|
1180
|
+
item.measures.x = isVertical ? 0 : snapped ? actualEndSnippedPosition - size : pos;
|
|
1181
|
+
item.measures.y = isVertical ? snapped ? actualEndSnippedPosition - size : pos : 0;
|
|
1182
|
+
nextEndSticky = item;
|
|
1183
|
+
nextEndSticky.config.zIndex = Z_INDEX_3;
|
|
1184
|
+
nextEndSticky.config.snapped = snapped;
|
|
1185
|
+
nextEndSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
|
|
1186
|
+
}
|
|
1187
|
+
displayItems.push(item);
|
|
804
1188
|
}
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
if (!nextSticky && stickyItemIndex < i && sticky === 1 && (pos <= scrollSize + this._scrollStartOffset + size + stickyItemSize)) {
|
|
811
|
-
item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;
|
|
812
|
-
item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;
|
|
813
|
-
nextSticky = item;
|
|
814
|
-
nextSticky.config.snapped = snapped;
|
|
815
|
-
nextSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
|
|
816
|
-
nextSticky.config.zIndex = '3';
|
|
817
|
-
}
|
|
818
|
-
if (!nextEndSticky && endStickyItemIndex > i && sticky === 2 &&
|
|
819
|
-
(pos >= actualEndSnippedPosition - size - endStickyItemSize)) {
|
|
820
|
-
item.measures.x = isVertical ? 0 : snapped ? actualEndSnippedPosition - size : pos;
|
|
821
|
-
item.measures.y = isVertical ? snapped ? actualEndSnippedPosition - size : pos : 0;
|
|
822
|
-
nextEndSticky = item;
|
|
823
|
-
nextEndSticky.config.zIndex = '3';
|
|
824
|
-
nextEndSticky.config.snapped = snapped;
|
|
825
|
-
nextEndSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
|
|
826
|
-
}
|
|
827
|
-
displayItems.push(item);
|
|
828
|
-
}
|
|
829
|
-
renderItems -= 1;
|
|
830
|
-
pos += size;
|
|
1189
|
+
}
|
|
1190
|
+
renderItems--;
|
|
1191
|
+
if (ii % divides === 0 || renderItems <= 0) {
|
|
1192
|
+
pos += row.size;
|
|
1193
|
+
}
|
|
831
1194
|
i++;
|
|
832
1195
|
}
|
|
833
1196
|
const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;
|
|
@@ -861,13 +1224,32 @@ export class TrackBox extends CacheMap {
|
|
|
861
1224
|
endStickyItem.measures[axis] = nextEndSticky.measures[axis] + nextEndSticky.measures[sizeProperty];
|
|
862
1225
|
}
|
|
863
1226
|
}
|
|
1227
|
+
if (itemTransform !== null) {
|
|
1228
|
+
for (let i = 0, l = displayItems.length; i < l; i++) {
|
|
1229
|
+
const item = displayItems[i];
|
|
1230
|
+
if (!!item) {
|
|
1231
|
+
const transformation = itemTransform(item.index, objectAsReadonly(item.measures), objectAsReadonly(item.config));
|
|
1232
|
+
item.measures.transformedX = transformation.x;
|
|
1233
|
+
item.measures.transformedY = transformation.y;
|
|
1234
|
+
item.measures.z = transformation.z;
|
|
1235
|
+
item.measures.rotationX = transformation.rotationX;
|
|
1236
|
+
item.measures.rotationY = transformation.rotationY;
|
|
1237
|
+
item.measures.rotationZ = transformation.rotationZ;
|
|
1238
|
+
item.measures.scaleX = transformation.scaleX;
|
|
1239
|
+
item.measures.scaleY = transformation.scaleY;
|
|
1240
|
+
item.measures.scaleZ = transformation.scaleZ;
|
|
1241
|
+
item.config.opacity = transformation.opacity;
|
|
1242
|
+
item.config.filter = transformation.filter;
|
|
1243
|
+
item.config.blendColor = transformation.blendColor;
|
|
1244
|
+
item.config.zIndex = String(transformation.zIndex);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
864
1248
|
}
|
|
865
1249
|
return displayItems;
|
|
866
1250
|
}
|
|
867
1251
|
resetPositions() {
|
|
868
1252
|
this._tracker.clearTrackMap();
|
|
869
|
-
this.clearScrollDirectionCache(false);
|
|
870
|
-
this.deltaDirection = 0;
|
|
871
1253
|
this.track();
|
|
872
1254
|
}
|
|
873
1255
|
/**
|
|
@@ -877,7 +1259,7 @@ export class TrackBox extends CacheMap {
|
|
|
877
1259
|
if (!this._items || !this._displayComponents) {
|
|
878
1260
|
return;
|
|
879
1261
|
}
|
|
880
|
-
this._tracker.track(this._items, this._displayComponents, this._snappedDisplayComponents, this.
|
|
1262
|
+
this._tracker.track(this._items, this._displayComponents, this._snappedDisplayComponents, this._scrollDirection, this._trackBy);
|
|
881
1263
|
}
|
|
882
1264
|
setDisplayObjectIndexMapById(v) {
|
|
883
1265
|
this._tracker.displayObjectIndexMapById = v;
|
|
@@ -891,6 +1273,34 @@ export class TrackBox extends CacheMap {
|
|
|
891
1273
|
}
|
|
892
1274
|
return null;
|
|
893
1275
|
}
|
|
1276
|
+
getComponentBoundsByIntersectionPosition(position, maxPosition = null) {
|
|
1277
|
+
const components = this._displayComponents;
|
|
1278
|
+
let first = null, last = null;
|
|
1279
|
+
if (!!components) {
|
|
1280
|
+
for (const comp of components) {
|
|
1281
|
+
const id = comp.instance.itemId ?? null, isVertical = comp.instance.item?.config?.isVertical, x = comp.instance.item?.measures?.x ?? 0, y = comp.instance.item?.measures?.y ?? 0, isFirst = comp.instance.item?.config?.isFirst ?? false, isLast = comp.instance.item?.config?.isLast ?? false, { width, height } = comp.instance.getBounds(), pos = position;
|
|
1282
|
+
if (isVertical && (pos >= y && pos < y + height)) {
|
|
1283
|
+
return { id, x, y, width, height, isFirst, isLast };
|
|
1284
|
+
}
|
|
1285
|
+
else if (!isVertical && (pos >= x && pos < x + width)) {
|
|
1286
|
+
return { id, x, y, width, height, isFirst, isLast };
|
|
1287
|
+
}
|
|
1288
|
+
if (isFirst) {
|
|
1289
|
+
first = { id, x, y, width, height, isFirst, isLast };
|
|
1290
|
+
}
|
|
1291
|
+
else if (isLast) {
|
|
1292
|
+
last = { id, x, y, width, height, isFirst, isLast };
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
if (position < 0) {
|
|
1297
|
+
return first;
|
|
1298
|
+
}
|
|
1299
|
+
if (maxPosition !== null && position > maxPosition) {
|
|
1300
|
+
return last;
|
|
1301
|
+
}
|
|
1302
|
+
return null;
|
|
1303
|
+
}
|
|
894
1304
|
_debouncedIsScrollStartOff = debounce(() => {
|
|
895
1305
|
this._isScrollStart = false;
|
|
896
1306
|
});
|
|
@@ -940,4 +1350,4 @@ export class TrackBox extends CacheMap {
|
|
|
940
1350
|
}
|
|
941
1351
|
}
|
|
942
1352
|
}
|
|
943
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2stYm94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29yZS90cmFjay1ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFDSCxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFdBQVcsR0FDdEYsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlwRSxNQUFNLENBQU4sSUFBWSxjQUdYO0FBSEQsV0FBWSxjQUFjO0lBQ3RCLG1DQUFpQixDQUFBO0lBQ2pCLCtCQUFhLENBQUE7QUFDakIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBbUVELE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDMUIsK0RBQU0sQ0FBQTtJQUNOLCtEQUFNLENBQUE7SUFDTiwrREFBTSxDQUFBO0lBQ04seUVBQVcsQ0FBQTtBQUNmLENBQUMsRUFMVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBSzdCO0FBbUJELE1BQU0saUNBQWlDLEdBQUcsRUFBRSxFQUN4QyxrQ0FBa0MsR0FBRyxFQUFFLEVBQ3ZDLGlDQUFpQyxHQUFHLEtBQUssRUFDekMsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUlqQjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxRQUNULFNBQVEsUUFBc0Q7SUFFcEQsUUFBUSxDQUFjO0lBRXRCLE1BQU0sQ0FBa0Q7SUFFbEUsSUFBSSxLQUFLLENBQUMsQ0FBa0Q7UUFDeEQsSUFBSSxJ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QUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uLCB9IGZyb20gXCIuLi9tb2RlbHMvcmVuZGVyLWNvbGxlY3Rpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvcmVuZGVyLWl0ZW0ubW9kZWxcIjtcclxuaW1wb3J0IHsgSWQgfSBmcm9tIFwiLi4vdHlwZXMvaWRcIjtcclxuaW1wb3J0IHsgQ0FDSEVfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCBDYWNoZU1hcCB9IGZyb20gXCIuL2NhY2hlLW1hcFwiO1xyXG5pbXBvcnQgeyBUcmFja2VyIH0gZnJvbSBcIi4vdHJhY2tlclwiO1xyXG5pbXBvcnQgeyBJU2l6ZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBIRUlHSFRfUFJPUF9OQU1FLCBUUkFDS19CWV9QUk9QRVJUWV9OQU1FLCBXSURUSF9QUk9QX05BTUUsIFhfUFJPUF9OQU1FLCBZX1BST1BfTkFNRSxcclxufSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0SXRlbUNvbmZpZywgSVJlbmRlclZpcnR1YWxMaXN0SXRlbU1lYXN1cmVzLCBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBDTWFwIH0gZnJvbSAnLi4vdXRpbHMvY21hcCc7XHJcbmltcG9ydCB7IGJ1ZmZlckludGVycG9sYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvYnVmZmVyLWludGVycG9sYXRpb25cIjtcclxuaW1wb3J0IHsgQmFzZVZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRzL25nLWxpc3QtaXRlbS9iYXNlXCI7XHJcbmltcG9ydCB7IFByZXJlbmRlckNhY2hlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctcHJlcmVuZGVyLWNvbnRhaW5lci90eXBlcy9jYWNoZVwiO1xyXG5cclxuZXhwb3J0IGVudW0gVHJhY2tCb3hFdmVudHMge1xyXG4gICAgQ0hBTkdFID0gJ2NoYW5nZScsXHJcbiAgICBUSUNLID0gJ3RpY2snLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZXRyaWNzIHtcclxuICAgIGRlbHRhOiBudW1iZXI7XHJcbiAgICBub3JtYWxpemVkSXRlbVdpZHRoOiBudW1iZXI7XHJcbiAgICBub3JtYWxpemVkSXRlbUhlaWdodDogbnVtYmVyO1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG4gICAgZHluYW1pY1NpemU6IGJvb2xlYW47XHJcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZDogbnVtYmVyO1xyXG4gICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQ6IG51bWJlcjtcclxuICAgIGl0ZW1zT25EaXNwbGF5V2VpZ2h0OiBudW1iZXI7XHJcbiAgICBpdGVtc09uRGlzcGxheUxlbmd0aDogbnVtYmVyO1xyXG4gICAgaXNWZXJ0aWNhbDogYm9vbGVhbjtcclxuICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgbGVmdEl0ZW1MZW5ndGg6IG51bWJlcjtcclxuICAgIGxlZnRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgcmVuZGVySXRlbXM6IG51bWJlcjtcclxuICAgIHJpZ2h0SXRlbUxlbmd0aDogbnVtYmVyO1xyXG4gICAgcmlnaHRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IG51bWJlcjtcclxuICAgIHNpemVQcm9wZXJ0eTogdHlwZW9mIEhFSUdIVF9QUk9QX05BTUUgfCB0eXBlb2YgV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIHNuaXBlZFBvczogbnVtYmVyO1xyXG4gICAgc3RhcnRJbmRleDogbnVtYmVyO1xyXG4gICAgc3RhcnRQb3NpdGlvbjogbnVtYmVyO1xyXG4gICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodDogbnVtYmVyO1xyXG4gICAgdG90YWxMZW5ndGg6IG51bWJlcjtcclxuICAgIHRvdGFsU2l6ZTogbnVtYmVyO1xyXG4gICAgdHlwaWNhbEl0ZW1TaXplOiBudW1iZXI7XHJcbiAgICBpc0Zyb21JdGVtSWRGb3VuZDogYm9vbGVhbjtcclxuICAgIGlzVXBkYXRpbmc6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+IHtcclxuICAgIGJvdW5kczogSVNpemU7XHJcbiAgICBjb2xsZWN0aW9uOiBDO1xyXG4gICAgaXNWZXJ0aWNhbDogYm9vbGVhbjtcclxuICAgIGl0ZW1TaXplOiBudW1iZXI7XHJcbiAgICBidWZmZXJTaXplOiBudW1iZXI7XHJcbiAgICBtYXhCdWZmZXJTaXplOiBudW1iZXI7XHJcbiAgICBkeW5hbWljU2l6ZTogYm9vbGVhbjtcclxuICAgIHNjcm9sbFNpemU6IG51bWJlcjtcclxuICAgIHNuYXA6IGJvb2xlYW47XHJcbiAgICBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uOiBib29sZWFuO1xyXG4gICAgZnJvbUl0ZW1JZD86IElkO1xyXG4gICAgcHJldmlvdXNUb3RhbFNpemU6IG51bWJlcjtcclxuICAgIGNydWREZXRlY3RlZDogYm9vbGVhbjtcclxuICAgIGRlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplOyB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PlxyXG4gICAgZXh0ZW5kcyBPbWl0PElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+LCAncHJldmlvdXNUb3RhbFNpemUnIHwgJ2NydWREZXRlY3RlZCcgfCAnZGVsZXRlZEl0ZW1zTWFwJz4geyB9XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVcGRhdGVDb2xsZWN0aW9uT3B0aW9uczxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ2NvbGxlY3Rpb24nIHwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxuZXhwb3J0IHR5cGUgQ2FjaGVNYXBFdmVudHMgPSBUcmFja0JveEV2ZW50cztcclxuXHJcbmV4cG9ydCB0eXBlIE9uQ2hhbmdlRXZlbnRMaXN0ZW5lciA9ICh2ZXJzaW9uOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgdHlwZSBPblRpY2tFdmVudExpc3RlbmVyID0gKCkgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCB0eXBlIENhY2hlTWFwTGlzdGVuZXJzID0gT25DaGFuZ2VFdmVudExpc3RlbmVyIHwgT25UaWNrRXZlbnRMaXN0ZW5lcjtcclxuXHJcbmV4cG9ydCBlbnVtIEl0ZW1EaXNwbGF5TWV0aG9kcyB7XHJcbiAgICBDUkVBVEUsXHJcbiAgICBVUERBVEUsXHJcbiAgICBERUxFVEUsXHJcbiAgICBOT1RfQ0hBTkdFRCxcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uO1xyXG4gICAgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHZXRNZXRyaWNzUmV0dXJucyB7XHJcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgIGRlbHRhOiBudW1iZXI7XHJcbiAgICBjcnVkRGV0ZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJSXRlbTxJID0gYW55PiB7XHJcbiAgICBbcHJvcDogc3RyaW5nXTogSTtcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9CVUZGRVJfRVhUUkVNVU1fVEhSRVNIT0xEID0gMTUsXHJcbiAgICBERUZBVUxUX01BWF9CVUZGRVJfU0VRVUVOQ0VfTEVOR1RIID0gMzAsXHJcbiAgICBERUZBVUxUX1JFU0VUX0JVRkZFUl9TSVpFX1RJTUVPVVQgPSAxMDAwMCxcclxuICAgIElTX05FVyA9ICduJztcclxuXHJcbnR5cGUgQ2FjaGUgPSBJU2l6ZSAmIHsgbWV0aG9kPzogSXRlbURpc3BsYXlNZXRob2RzIH0gJiBJSXRlbTtcclxuXHJcbi8qKlxyXG4gKiBBbiBvYmplY3QgdGhhdCBwZXJmb3JtcyB0cmFja2luZywgY2FsY3VsYXRpb25zIGFuZCBjYWNoaW5nLlxyXG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vRGpvbm55WC9uZy12aXJ0dWFsLWxpc3QvYmxvYi8xOC54L3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL2NvcmUvdHJhY2stYm94LnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBBbGV4YW5kcm92aWNoIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRyYWNrQm94PEMgZXh0ZW5kcyBCYXNlVmlydHVhbExpc3RJdGVtQ29tcG9uZW50ID0gYW55PlxyXG4gICAgZXh0ZW5kcyBDYWNoZU1hcDxJZCwgQ2FjaGUsIENhY2hlTWFwRXZlbnRzLCBDYWNoZU1hcExpc3RlbmVycz4ge1xyXG5cclxuICAgIHByb3RlY3RlZCBfdHJhY2tlciE6IFRyYWNrZXI8Qz47XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgc2V0IGl0ZW1zKHY6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2Rpc3BsYXlDb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8Qz4+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBzZXQgZGlzcGxheUNvbXBvbmVudHModjogQXJyYXk8Q29tcG9uZW50UmVmPEM+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc25hcHBlZERpc3BsYXlDb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8Qz4+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBzZXQgc25hcHBlZERpc3BsYXlDb21wb25lbnRzKHY6IEFycmF5PENvbXBvbmVudFJlZjxDPj4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50cyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZCA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNMYXp5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzTGF6eSh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzTGF6eSA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc0xhenkgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0cmFja0J5IHByb3BlcnR5XHJcbiAgICAgKi9cclxuICAgIHNldCB0cmFja2luZ1Byb3BlcnR5TmFtZSh2OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSA9IHRoaXMuX3RyYWNrZXIudHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdHJhY2tpbmdQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFRSQUNLX0JZX1BST1BFUlRZX05BTUU7XHJcblxyXG4gICAgc2V0IGlzU2Nyb2xsU3RhcnQodjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsU3RhcnQgPSB2O1xyXG4gICAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU2Nyb2xsU25hcFRvU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzZXQgaXNTY3JvbGxFbmQodjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsRW5kID0gdjtcclxuICAgICAgICBpZiAodikge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Njcm9sbFNuYXBUb0VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTY3JvbGxFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsU25hcFRvU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgaXNTbmFwcGVkVG9TdGFydCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTY3JvbGxTdGFydCB8fCB0aGlzLl9pc1Njcm9sbFNuYXBUb1N0YXJ0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTY3JvbGxTbmFwVG9FbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgaXNTbmFwcGVkVG9FbmQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Nyb2xsRW5kIHx8IHRoaXMuX2lzU2Nyb2xsU25hcFRvRW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2Nyb2xsU3RhcnRPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgICBzZXQgc2Nyb2xsU3RhcnRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgPSB2O1xyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbFN0YXJ0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxTdGFydE9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbEVuZE9mZnNldDogbnVtYmVyID0gMDtcclxuICAgIHNldCBzY3JvbGxFbmRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0ID0gdjtcclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxFbmRPZmZzZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVuZE9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlciA9IG5ldyBUcmFja2VyKHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQoaWQ6IElkLCBjYWNoZTogQ2FjaGUpOiBDTWFwPElkLCBJU2l6ZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCBiID0gdGhpcy5fbWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgIGlmIChiPy53aWR0aCA9PT0gY2FjaGUud2lkdGggJiYgYj8uaGVpZ2h0ID09PSBjYWNoZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLl9tYXAuc2V0KGlkLCBjYWNoZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZpb3VzQ29sbGVjdGlvbjogQXJyYXk8SUl0ZW0+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG4gICAgZ2V0IGNydWREZXRlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX2NydWREZXRlY3RlZDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2hhbmdlSWZOZWVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5nZXNEZXRlY3RlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goVHJhY2tCb3hFdmVudHMuQ0hBTkdFLCB0aGlzLl92ZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpcmVUaWNrKCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2goVHJhY2tCb3hFdmVudHMuVElDSyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9wcmV2aW91c1RvdGFsU2l6ZSA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWx0YU9mTmV3SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICBnZXQgZGVsdGFPZk5ld0l0ZW1zKCkgeyByZXR1cm4gdGhpcy5fZGVsdGFPZk5ld0l0ZW1zOyB9XHJcblxyXG4gICAgaXNBZGFwdGl2ZUJ1ZmZlciA9IHRydWU7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9idWZmZXJTZXF1ZW5jZUV4dHJhVGhyZXNob2xkID0gREVGQVVMVF9CVUZGRVJfRVhUUkVNVU1fVEhSRVNIT0xEO1xyXG5cclxuICAgIHByb3RlY3RlZCBfbWF4QnVmZmVyU2VxdWVuY2VMZW5ndGggPSBERUZBVUxUX01BWF9CVUZGRVJfU0VRVUVOQ0VfTEVOR1RIO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYnVmZmVyU2l6ZVNlcXVlbmNlOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIF9idWZmZXJTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgZ2V0IGJ1ZmZlclNpemUoKSB7IHJldHVybiB0aGlzLl9idWZmZXJTaXplOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0QnVmZmVyU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX21heEJ1ZmZlclNpemU6IG51bWJlciA9IHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcmVzZXRCdWZmZXJTaXplVGltZW91dDogbnVtYmVyID0gREVGQVVMVF9SRVNFVF9CVUZGRVJfU0laRV9USU1FT1VUO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcmVzZXRCdWZmZXJTaXplVGltZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzUmVzZXRlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcmVuZGVyZWRDYWNoZTogUHJlcmVuZGVyQ2FjaGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9uZXdJdGVtczogQXJyYXk8SWQ+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGxpZmVDaXJjbGUoKSB7XHJcbiAgICAgICAgdGhpcy5maXJlQ2hhbmdlSWZOZWVkKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmlyZVRpY2soKTtcclxuXHJcbiAgICAgICAgdGhpcy5saWZlQ2lyY2xlRG8oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYW5zIHRoZSBjb2xsZWN0aW9uIGZvciBkZWxldGVkIGl0ZW1zIGFuZCBmbHVzaGVzIHRoZSBkZWxldGVkIGl0ZW0gY2FjaGUuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Q29sbGVjdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oY3VycmVudENvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29sbGVjdGlvbiAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50Q29sbGVjdGlvbiA9PT0gdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQXR0ZW50aW9uISBUaGUgY29sbGVjdGlvbiBtdXN0IGJlIGltbXV0YWJsZS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzZXRlZCA9ICgoIXRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiB8fCB0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSAmJlxyXG4gICAgICAgICAgICAoISFjdXJyZW50Q29sbGVjdGlvbiAmJiBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGggPiAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzUmVzZXRlZCA9IHJlc2V0ZWQ7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUodGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uLCBjdXJyZW50Q29sbGVjdGlvbiwgaXRlbVNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24gPSBbLi4uKGN1cnJlbnRDb2xsZWN0aW9uIHx8IFtdKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGNhY2hlIG9mIGl0ZW1zIGZyb20gdGhlIGxpc3RcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUNhY2hlPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihwcmV2aW91c0NvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGN1cnJlbnRDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBpdGVtU2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lO1xyXG4gICAgICAgIGxldCBjcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9uZXdJdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIWN1cnJlbnRDb2xsZWN0aW9uIHx8IGN1cnJlbnRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAocHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHByZXZpb3VzQ29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gcHJldmlvdXNDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW1bdHJhY2tCeV07XHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbGxlY3Rpb24gfHwgcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGFkZGVkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGN1cnJlbnRDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW1bdHJhY2tCeV07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChpZCwgeyB3aWR0aDogaXRlbVNpemUsIGhlaWdodDogaXRlbVNpemUsIG1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25EaWN0OiBJSXRlbTxJPiA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25EaWN0W2l0ZW1bdHJhY2tCeV1dID0gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBub3RDaGFuZ2VkTWFwOiBJSXRlbTxJPiA9IHt9LCBkZWxldGVkTWFwOiBJSXRlbTxJPiA9IHt9LCBkZWxldGVkSXRlbXNNYXA6IHsgW2luZGV4OiBudW1iZXJdOiBJU2l6ZSB9ID0ge30sXHJcbiAgICAgICAgICAgIHVwZGF0ZWRNYXA6IElJdGVtPEk+ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbVt0cmFja0J5XTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uRGljdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sbGVjdGlvbkRpY3RbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENoYW5nZWRNYXBbaXRlbVt0cmFja0J5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4odGhpcy5fbWFwLmdldChpZCkgfHwgeyB3aWR0aDogaXRlbVNpemUsIGhlaWdodDogaXRlbVNpemUgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkTWFwW2l0ZW1bdHJhY2tCeV1dID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChpZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHRoaXMuX21hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZFxyXG4gICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZWRNYXBbaWRdID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcFtpXSA9IHRoaXMuX21hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtW3RyYWNrQnldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiAhZGVsZXRlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIXVwZGF0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmXHJcbiAgICAgICAgICAgICAgICAhbm90Q2hhbmdlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25ld0l0ZW1zLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGNydWREZXRlY3RlZDtcclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSBkZWxldGVkSXRlbXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgcG9zaXRpb24gb2YgYSBjb2xsZWN0aW9uIGVsZW1lbnQgYnkgdGhlIGdpdmVuIElkXHJcbiAgICAgKi9cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaWQ6IElkLCBpdGVtQ29uZmlnTWFwOiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEksIEM+KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGZyb21JdGVtSWQ6IGlkLCBpdGVtQ29uZmlnTWFwLCAuLi5vcHRpb25zIH07XHJcbiAgICAgICAgdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgPSBvcHQuYnVmZmVyU2l6ZTtcclxuICAgICAgICB0aGlzLl9tYXhCdWZmZXJTaXplID0gb3B0Lm1heEJ1ZmZlclNpemU7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsU2l6ZSwgaXNGcm9tSXRlbUlkRm91bmQgfSA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZTogdGhpcy5fY3J1ZERldGVjdGVkIHx8IG9wdC5keW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemU6IHRoaXMuX3ByZXZpb3VzVG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcnVkRGV0ZWN0ZWQ6IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwOiB0aGlzLl9kZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRnJvbUl0ZW1JZEZvdW5kID8gc2Nyb2xsU2l6ZSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXZlbnRTY3JvbGxTbmFwcGluZyhjbGVhckJ1ZmZlcjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5faXNTY3JvbGxTdGFydCA9IHRoaXMuX2lzU2Nyb2xsRW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChjbGVhckJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Njcm9sbFNuYXBUb1N0YXJ0ID0gdGhpcy5faXNTY3JvbGxTbmFwVG9FbmQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xsZWN0aW9uIG9mIGRpc3BsYXkgb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICBnZXRNZXRyaWNzPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpdGVtczogQywgaXRlbUNvbmZpZ01hcDogSVZpcnR1YWxMaXN0SXRlbUNvbmZpZ01hcCxcclxuICAgICAgICBvcHRpb25zOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSwgQz4pOiBJR2V0TWV0cmljc1JldHVybnMge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHsgaXRlbUNvbmZpZ01hcCwgLi4ub3B0aW9ucyB9LCBjcnVkRGV0ZWN0ZWQgPSB0aGlzLl9jcnVkRGV0ZWN0ZWQsXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCA9IHRoaXMuX2RlbGV0ZWRJdGVtc01hcDtcclxuICAgICAgICB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA9IG9wdC5idWZmZXJTaXplO1xyXG4gICAgICAgIHRoaXMuX21heEJ1ZmZlclNpemUgPSBvcHQubWF4QnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBpdGVtcyxcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemU6IHRoaXMuX3ByZXZpb3VzVG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcnVkRGV0ZWN0ZWQ6IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4geyB0b3RhbFNpemU6IG1ldHJpY3MudG90YWxTaXplLCBkZWx0YTogbWV0cmljcy5kZWx0YSwgY3J1ZERldGVjdGVkIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xsZWN0aW9uIG9mIGRpc3BsYXkgb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVDb2xsZWN0aW9uPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpdGVtczogQywgaXRlbUNvbmZpZ01hcDogSVZpcnR1YWxMaXN0SXRlbUNvbmZpZ01hcCxcclxuICAgICAgICBvcHRpb25zOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSwgQz4pOiBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHsgaXRlbUNvbmZpZ01hcCwgLi4ub3B0aW9ucyB9LCBkeW5hbWljU2l6ZSA9IG9wdC5keW5hbWljU2l6ZSwgY3J1ZERldGVjdGVkID0gdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAgPSB0aGlzLl9kZWxldGVkSXRlbXNNYXA7XHJcbiAgICAgICAgaWYgKGR5bmFtaWNTaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVFbGVtZW50cyhvcHQuaXNWZXJ0aWNhbCwgb3B0Lml0ZW1TaXplKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgPSBvcHQuYnVmZmVyU2l6ZTtcclxuICAgICAgICB0aGlzLl9tYXhCdWZmZXJTaXplID0gb3B0Lm1heEJ1ZmZlclNpemU7XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLnJlY2FsY3VsYXRlTWV0cmljcyh7XHJcbiAgICAgICAgICAgIC4uLm9wdCxcclxuICAgICAgICAgICAgY29sbGVjdGlvbjogaXRlbXMsXHJcbiAgICAgICAgICAgIHByZXZpb3VzVG90YWxTaXplOiB0aGlzLl9wcmV2aW91c1RvdGFsU2l6ZSxcclxuICAgICAgICAgICAgY3J1ZERldGVjdGVkOiB0aGlzLl9jcnVkRGV0ZWN0ZWQsXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGVsdGEgKz0gbWV0cmljcy5kZWx0YTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBZGFwdGl2ZUJ1ZmZlclBhcmFtcyhtZXRyaWNzLCBpdGVtcy5sZW5ndGgpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcmV2aW91c1RvdGFsU2l6ZSA9IG1ldHJpY3MudG90YWxTaXplO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5fY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChvcHQuZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlzcGxheUl0ZW1zID0gdGhpcy5nZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uKGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCB7IC4uLm1ldHJpY3MsIH0pO1xyXG4gICAgICAgIHJldHVybiB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplOiBtZXRyaWNzLnRvdGFsU2l6ZSwgZGVsdGE6IG1ldHJpY3MuZGVsdGEsIGNydWREZXRlY3RlZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJldmlvdXNTY3JvbGxTaXplID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlQWRhcHRpdmVCdWZmZXJQYXJhbXMobWV0cmljczogSU1ldHJpY3MsIHRvdGFsSXRlbXNMZW5ndGg6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZGlzcG9zZUNsZWFyQnVmZmVyU2l6ZVRpbWVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSBtZXRyaWNzLnNjcm9sbFNpemUgKyB0aGlzLl9kZWx0YSwgZGVsdGEgPSBNYXRoLmFicyh0aGlzLl9wcmV2aW91c1Njcm9sbFNpemUgLSBzY3JvbGxTaXplKTtcclxuICAgICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbFNpemUgPSBzY3JvbGxTaXplO1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlclJhd1NpemUgPSBNYXRoLm1pbihNYXRoLmZsb29yKG1ldHJpY3MudHlwaWNhbEl0ZW1TaXplICE9PSAwID8gZGVsdGEgLyBtZXRyaWNzLnR5cGljYWxJdGVtU2l6ZSA6IDApICogNSwgdG90YWxJdGVtc0xlbmd0aCksXHJcbiAgICAgICAgICAgIG1pbkJ1ZmZlclNpemUgPSBidWZmZXJSYXdTaXplIDwgdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgPyB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA6IGJ1ZmZlclJhd1NpemUsXHJcbiAgICAgICAgICAgIGJ1ZmZlclZhbHVlID0gbWluQnVmZmVyU2l6ZSA+IHRoaXMuX21heEJ1ZmZlclNpemUgPyB0aGlzLl9tYXhCdWZmZXJTaXplIDogbWluQnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IGJ1ZmZlckludGVycG9sYXRpb24odGhpcy5fYnVmZmVyU2l6ZSwgdGhpcy5fYnVmZmVyU2l6ZVNlcXVlbmNlLCBidWZmZXJWYWx1ZSwge1xyXG4gICAgICAgICAgICBleHRyZW11bVRocmVzaG9sZDogdGhpcy5fYnVmZmVyU2VxdWVuY2VFeHRyYVRocmVzaG9sZCxcclxuICAgICAgICAgICAgYnVmZmVyU2l6ZTogdGhpcy5fbWF4QnVmZmVyU2VxdWVuY2VMZW5ndGgsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhcnRSZXNldEJ1ZmZlclNpemVUaW1lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGFydFJlc2V0QnVmZmVyU2l6ZVRpbWVyKCkge1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0QnVmZmVyU2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNpemUgPSB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZVNlcXVlbmNlID0gW107XHJcbiAgICAgICAgfSwgdGhpcy5fcmVzZXRCdWZmZXJTaXplVGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRpc3Bvc2VDbGVhckJ1ZmZlclNpemVUaW1lcigpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRCdWZmZXJTaXplVGltZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZW50cnkgaW50byB0aGUgb3ZlcnNjcm9sbCBhcmVhIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3ZlcnNjcm9sbCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudE51bVRvRW5kPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpOiBudW1iZXIsIGNvbGxlY3Rpb246IEMsIG1hcDogQ01hcDxJZCwgSVNpemU+LCB0eXBpY2FsSXRlbVNpemU6IG51bWJlcixcclxuICAgICAgICBzaXplOiBudW1iZXIsIGlzVmVydGljYWw6IGJvb2xlYW4sIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAwLCByZXZlcnNlOiBib29sZWFuID0gZmFsc2UpOiB7IG51bTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCB0cmFja0J5ID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUsIHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGogPSBjb2xsZWN0aW9uLmxlbmd0aCAtIGluZGV4T2Zmc2V0IC0gMTsgcmV2ZXJzZSA/IGogPj0gMCA6IGogPj0gaTsgai0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb2xsZWN0aW9uW2pdLCBpZCA9IGl0ZW1bdHJhY2tCeV07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBtYXAuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gY2FjaGUgJiYgY2FjaGVbc2l6ZVByb3BlcnR5XSA+IDAgPyBjYWNoZVtzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9mZnNldCArIGl0ZW1TaXplID4gc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbnVtLCBvZmZzZXQgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvZmZzZXQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBudW0sIG9mZnNldCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBsaXN0IG1ldHJpY3NcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlY2FsY3VsYXRlTWV0cmljczxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ob3B0aW9uczogSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SSwgQz4pOiBJTWV0cmljcyB7XHJcbiAgICAgICAgY29uc3QgeyBmcm9tSXRlbUlkLCBib3VuZHMsIGNvbGxlY3Rpb24sIGR5bmFtaWNTaXplLCBpc1ZlcnRpY2FsLCBpdGVtU2l6ZSwgYnVmZmVyU2l6ZTogbWluQnVmZmVyU2l6ZSxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSwgc25hcCwgaXRlbUNvbmZpZ01hcCwgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiwgcHJldmlvdXNUb3RhbFNpemUsIGNydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwIH0gPSBvcHRpb25zIGFzIElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+ICYge1xyXG4gICAgICAgICAgICAgICAgaXRlbUNvbmZpZ01hcDogSVZpcnR1YWxMaXN0SXRlbUNvbmZpZ01hcCxcclxuICAgICAgICAgICAgfSwgcm91bmRlZFNjcm9sbFNpemUgPSBNYXRoLnJvdW5kKHNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICBjb25zdCB0cmFja0J5ID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUsIGJ1ZmZlclNpemUgPSBNYXRoLm1heChtaW5CdWZmZXJTaXplLCB0aGlzLl9idWZmZXJTaXplKSxcclxuICAgICAgICAgICAgeyB3aWR0aCwgaGVpZ2h0IH0gPSBib3VuZHMsIHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FLFxyXG4gICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLCB0b3RhbExlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLCB0eXBpY2FsSXRlbVNpemUgPSBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgdyA9IGlzVmVydGljYWwgPyB3aWR0aCA6IHR5cGljYWxJdGVtU2l6ZSwgaCA9IGlzVmVydGljYWwgPyB0eXBpY2FsSXRlbVNpemUgOiBoZWlnaHQsXHJcbiAgICAgICAgICAgIG1hcCA9IHRoaXMuX21hcCwgc25hcHNob3QgPSB0aGlzLl9zbmFwc2hvdCxcclxuICAgICAgICAgICAgc25pcGVkUG9zID0gTWF0aC5mbG9vcihzY3JvbGxTaXplKSArIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LCBsZWZ0SXRlbXNXZWlnaHRzOiBBcnJheTxudW1iZXI+ID0gW10sXHJcbiAgICAgICAgICAgIGlzRnJvbUlkID0gZnJvbUl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgZnJvbUl0ZW1JZCA9PT0gJ251bWJlcicgJiYgZnJvbUl0ZW1JZCA+IC0xKVxyXG4gICAgICAgICAgICAgICAgfHwgKHR5cGVvZiBmcm9tSXRlbUlkID09PSAnc3RyaW5nJyAmJiBmcm9tSXRlbUlkID4gJy0xJyk7XHJcblxyXG4gICAgICAgIGxldCBsZWZ0SXRlbXNPZmZzZXQgPSAwLCByaWdodEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICBpZiAoZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nyb2xsRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAtMToge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc09mZnNldCA9IGJ1ZmZlclNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gcmlnaHRJdGVtc09mZnNldCA9IGJ1ZmZlclNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kOiBudW1iZXIgPSAtMSwgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gMCwgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSAtMSxcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSAwLCByaWdodEl0ZW1MZW5ndGggPSAwLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgPSAwLCByaWdodEl0ZW1zV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBpdGVtQnlJZDogSSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgaXRlbUJ5SWRQb3M6IG51bWJlciA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXRlbUJ5SWRQb3MsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0LFxyXG4gICAgICAgICAgICBzdGFydEluZGV4OiBudW1iZXIsXHJcbiAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gPSAwLFxyXG4gICAgICAgICAgICBpc1VwZGF0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzU3RhcnQgPSAoKHJvdW5kZWRTY3JvbGxTaXplID09PSAwKSB8fCB0aGlzLmlzU25hcHBlZFRvU3RhcnQpO1xyXG4gICAgICAgIGxldCBzdGlja3lJdGVtSWQ6IElkIHwgdW5kZWZpbmVkLCBpc05ldyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBkeW5hbWljIG9yIHRoZXJlIGFyZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24sIHRoZW4gaXQgc3dpdGNoZXMgdG8gdGhlIGxvbmcgYWxnb3JpdGhtLlxyXG4gICAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHN0aWNreUlkOiBJZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW0/Llt0cmFja0J5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1Db25maWdNYXBbaWRdPy5zdGlja3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbUlkID0gc3RpY2t5SWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB5ID0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQsIHN0aWNreUNvbXBvbmVudFNpemUgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpaSA9IGkgKyAxLCBjb2xsZWN0aW9uSXRlbSA9IGNvbGxlY3Rpb25baV0sIGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudFNpemUgPSAwLCBjb21wb25lbnRTaXplRGVsdGEgPSAwLCBpdGVtRGlzcGxheU1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzID0gSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBtYXAuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplID0gY2FjaGVbc2l6ZVByb3BlcnR5XSA+IDAgPyBjYWNoZVtzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EaXNwbGF5TWV0aG9kID0gY2FjaGU/Lm1ldGhvZCA/PyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzSXRlbU5ldyA9IHRoaXMuX25ld0l0ZW1zLmluZGV4T2YoaWQpID4gLTEgfHwgKHRoaXMuX2lzTGF6eSAmJiBpc1N0YXJ0ICYmICF0aGlzLl9pc1Jlc2V0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlzTmV3ID0gaXNJdGVtTmV3O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05ldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1VwZGF0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3RCb3VuZHMgPSBzbmFwc2hvdC5nZXQoaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTbmFwc2hvdFNpemUgPSBjb21wb25lbnRTaXplIC0gKHNuYXBzaG90Qm91bmRzID8gc25hcHNob3RCb3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZURlbHRhID0gY29tcG9uZW50U25hcHNob3RTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmNhY2hlLCBtZXRob2Q6IGlzTmV3ID8gSXRlbURpc3BsYXlNZXRob2RzLlVQREFURSA6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRCwgW0lTX05FV106IGlzTmV3IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmV3ICYmIHkgPD0gKHNjcm9sbFNpemUgKyBzaXplICsgZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiArIGNvbXBvbmVudFNpemUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZURlbHRhID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZURlbHRhID0gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldChpZCwgeyAuLi5jYWNoZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFLCBbSVNfTkVXXTogaXNOZXcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOZXcgJiYgeSA8PSAoc2Nyb2xsU2l6ZSArIHNpemUgKyBkZWx0YUZyb21TdGFydENyZWF0aW9uICsgY29tcG9uZW50U2l6ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YUZyb21TdGFydENyZWF0aW9uICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplRGVsdGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWRJdGVtc01hcC5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gZGVsZXRlZEl0ZW1zTWFwW2ldLCBzaXplID0gY2FjaGU/LltzaXplUHJvcGVydHldID8/IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IHNjcm9sbFNpemUgKyB0aGlzLl9zY3JvbGxTdGFydE9mZnNldCAtIHNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gY29tcG9uZW50U2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT09IGZyb21JdGVtSWQgJiYgaWQgPT09IHN0aWNreUl0ZW1JZCAmJiBpdGVtQ29uZmlnTWFwPy5baWRdPy5zdGlja3kgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbXBvbmVudFNpemUgPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT09IGZyb21JdGVtSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG51bSwgb2Zmc2V0IH0gPSB0aGlzLmdldEVsZW1lbnROdW1Ub0VuZChpLCBjb2xsZWN0aW9uLCBtYXAsIHR5cGljYWxJdGVtU2l6ZSwgc2l6ZSwgaXNWZXJ0aWNhbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZpZXdwb3J0U2l6ZSA9IHNpemUgLSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFZpZXdwb3J0U2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG51bTogbnVtMSwgb2Zmc2V0OiBvZmZzZXQxIH0gPSB0aGlzLmdldEVsZW1lbnROdW1Ub0VuZChpICsgbnVtLCBjb2xsZWN0aW9uLCBtYXAsIHR5cGljYWxJdGVtU2l6ZSwgc2l6ZSwgaXNWZXJ0aWNhbCwgMCwgdHJ1ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhTnVtID0gKG51bTEgLSBudW0pLCBkZWx0YU9mZnNldCA9IChvZmZzZXQxIC0gb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ICs9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC09IGRlbHRhTnVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQgPSByaWdodEl0ZW1MZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCAtPSBkZWx0YU9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnNwbGljZShsZWZ0SXRlbXNXZWlnaHRzLmxlbmd0aCAtIGRlbHRhTnVtLCBkZWx0YU51bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBkZWx0YU9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZCA9IGNvbGxlY3Rpb25JdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWRQb3MgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPD0gc2Nyb2xsU2l6ZSAtIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnB1c2goY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnlJZCA9PT0gdW5kZWZpbmVkIHx8IHkgPCBpdGVtQnlJZFBvcyArIHNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8PSBzY3JvbGxTaXplICsgc2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDw9IHNjcm9sbFNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5ERUxFVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1EaXNwbGF5TWV0aG9kID09PSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtcyArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHkgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPD0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA8PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBpc0Zyb21JZCA/IGl0ZW1CeUlkUG9zIDogc2Nyb2xsU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodHMuc3BsaWNlKDAsIGxlZnRJdGVtc1dlaWdodHMubGVuZ3RoIC0gbGVmdEl0ZW1zT2Zmc2V0KTtcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0ICs9IHY7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLCBsZWZ0SXRlbXNPZmZzZXQpO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogcmlnaHRJdGVtc09mZnNldDtcclxuXHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgLy8gQnVmZmVyIG9wdGltaXphdGlvbiBkb2VzIG5vdCB3b3JrIG9uIGZhc3QgbGluZWFyIGFsZ29yaXRobVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IE1hdGguZmxvb3IodHlwaWNhbEl0ZW1TaXplICE9PSAwID8gc2Nyb2xsU2l6ZSAvIHR5cGljYWxJdGVtU2l6ZSA6IDApO1xyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IE1hdGguY2VpbCh0eXBpY2FsSXRlbVNpemUgIT09IDAgPyAoc2Nyb2xsU2l6ZSArIHNpemUpIC8gdHlwaWNhbEl0ZW1TaXplIDogMCk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgYnVmZmVyU2l6ZSk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgYnVmZmVyU2l6ZSA+IHRvdGFsTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHRvdGFsTGVuZ3RoIC0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgOiBidWZmZXJTaXplO1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgPSBsZWZ0SXRlbUxlbmd0aCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCA9IHJpZ2h0SXRlbUxlbmd0aCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB0b3RhbFNpemUgPSAodG90YWxMZW5ndGggKiB0eXBpY2FsSXRlbVNpemUpICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgKyB0aGlzLl9zY3JvbGxFbmRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBrID0gdG90YWxTaXplICE9PSAwID8gcHJldmlvdXNUb3RhbFNpemUgLyB0b3RhbFNpemUgOiAwO1xyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSAqIGs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApO1xyXG5cclxuICAgICAgICBjb25zdCBpdGVtc09uRGlzcGxheVdlaWdodCA9IHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgLSBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgLSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgKyBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgLSBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zID0gaXRlbXNPbkRpc3BsYXlMZW5ndGggKyBsZWZ0SXRlbUxlbmd0aCArIHJpZ2h0SXRlbUxlbmd0aCxcclxuICAgICAgICAgICAgc3RhcnRDcmVhdGlvbkRlbHRhID0gZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiA+IDAgPyBkZWx0YUZyb21TdGFydENyZWF0aW9uIDogMCxcclxuICAgICAgICAgICAgZGVsdGEgPSBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICsgbGVmdFNpemVPZkFkZGVkSXRlbXMgLSBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICsgc3RhcnRDcmVhdGlvbkRlbHRhO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWx0YU9mTmV3SXRlbXMgPSBkZWx0YU9mTmV3SXRlbXM7XHJcblxyXG4gICAgICAgIGlmIChpc0Zyb21JZCAmJiAhaXNUYXJnZXRJbk92ZXJzY3JvbGwpIHtcclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSAtPSB0aGlzLl9zY3JvbGxTdGFydE9mZnNldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldHJpY3M6IElNZXRyaWNzID0ge1xyXG4gICAgICAgICAgICBkZWx0YSxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1XaWR0aDogdyxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQ6IGgsXHJcbiAgICAgICAgICAgIHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5V2VpZ2h0LFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyxcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyxcclxuICAgICAgICAgICAgc2l6ZVByb3BlcnR5LFxyXG4gICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICBzbmlwZWRQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQsXHJcbiAgICAgICAgICAgIGlzVXBkYXRpbmcsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENhY2hlKGNhY2hlOiBQcmVyZW5kZXJDYWNoZSkge1xyXG4gICAgICAgIHRoaXMuX3ByZXJlbmRlcmVkQ2FjaGUgPSBjYWNoZTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRlbHRhKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RlbHRhID0gdGhpcy5fZGVsdGFPZk5ld0l0ZW1zID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhclNjcm9sbERpcmVjdGlvbkNhY2hlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZXMoaW1tZWRpYXRlbHk6IGJvb2xlYW4gPSBmYWxzZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKENBQ0hFX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSBhcyBDYWNoZU1hcEV2ZW50cywgdGhpcy52ZXJzaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGFuZ2VzRGV0ZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJvdW5kcyBvZiBhdCBsZWFzdCBvbmUgc2NyZWVuIG9iamVjdCBoYXZlIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrQm91bmRzT2ZFbGVtZW50cygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzW2ldLCBpdGVtSWQgPSBjb21wb25lbnQuaW5zdGFuY2UuaXRlbUlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGNvbXBvbmVudC5pbnN0YW5jZS5nZXRCb3VuZHMoKSwgY2FjaGUgPSB0aGlzLmdldChpdGVtSWQpO1xyXG4gICAgICAgICAgICBpZiAoISFib3VuZHMgJiYgISFjYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy53aWR0aCAhPT0gY2FjaGUud2lkdGggfHwgYm91bmRzLmhlaWdodCAhPT0gY2FjaGUuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpdGVtczogQywgaXRlbUNvbmZpZ01hcDogSVZpcnR1YWxMaXN0SXRlbUNvbmZpZ01hcCxcclxuICAgICAgICBtZXRyaWNzOiBJTWV0cmljcyk6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXM6IHJlbmRlckl0ZW1zTGVuZ3RoLFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBzaXplUHJvcGVydHksXHJcbiAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgIHNuaXBlZFBvcyxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgdG90YWxMZW5ndGgsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICB9ID0gbWV0cmljcyxcclxuICAgICAgICAgICAgZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lLCBhY3R1YWxTbmlwcGVkUG9zaXRpb24gPSBzbmlwZWRQb3MsXHJcbiAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgPSB0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICBkZWx0YU9mZmV0ID0gKGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCA/IHNjcm9sbFNpemUgOiAwKSxcclxuICAgICAgICAgICAgICAgIGJvdW5kc1NpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgsIGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiA9IHNjcm9sbFNpemUgKyBib3VuZHNTaXplIC0gdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICBsZXQgcG9zID0gc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zID0gcmVuZGVySXRlbXNMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBzdGlja3lJdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBuZXh0U3RpY2t5OiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBzdGlja3lJdGVtSW5kZXggPSAtMSxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gMCwgZW5kU3RpY2t5SXRlbTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCwgbmV4dEVuZFN0aWNreTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW1JbmRleCA9IC0xLCBlbmRTdGlja3lJdGVtU2l6ZSA9IDAsIGNvdW50ID0gMTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzbmFwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA+IDAgPyBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIDogMCwgdG90YWxMZW5ndGggLSAxKTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sIGNhY2hlID0gdGhpcy5nZXQoaWQpISwgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSA/PyAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gaXRlbUNvbmZpZ01hcFtpZF0/LnNlbGVjdGFibGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uY29sbGFwc2FibGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBkeW5hbWljU2l6ZSA/IGNhY2hlPy5bc2l6ZVByb3BlcnR5XSA+IDAgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemUgOiB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIChzY3JvbGxTaXplIC0gc2l6ZSkgLSBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByYXRpbyA9IHNpemUgIT09IDAgPyBib3VuZHNTaXplIC8gc2l6ZSA6IDAsIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgPSAtKGJvdW5kc1NpemUgIT09IDAgPyBhYnNvbHV0ZVN0YXJ0UG9zaXRpb24gLyBib3VuZHNTaXplIDogMCkgKiByYXRpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uUGVyY2VudCA9IChhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50ICsgKGJvdW5kc1NpemUgIT09IDAgPyAoYWJzb2x1dGVFbmRQb3NpdGlvbiArIHNpemUpIC8gYm91bmRzU2l6ZSA6IDApICogcmF0aW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGlja3kgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPZGQgPSBpICUgMiAhPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1NZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBpc1ZlcnRpY2FsID8gc3RhcnRQb3NpdGlvbiA6IGFjdHVhbFNuaXBwZWRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpc1ZlcnRpY2FsID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaXNWZXJ0aWNhbCA/IG5vcm1hbGl6ZWRJdGVtV2lkdGggOiBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaXNWZXJ0aWNhbCA/IHNpemUgOiBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHN0aWNreSA9PT0gMSA/IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0IDogc3RpY2t5ID09PSAyID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gZGVsdGFPZmZldCAtIHNpemUgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldzogKGNhY2hlIHNhdGlzZmllcyBDYWNoZSk/LltJU19ORVddID09PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogIWlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogY291bnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiAnMScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbURhdGE6IEkgPSBjb2xsZWN0aW9uSXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgcHJldmlvdXNlRGF0YTogaSA+IDAgPyBpdGVtc1tpIC0gMV0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dERhdGE6IGkgPCB0b3RhbExlbmd0aCA/IGl0ZW1zW2kgKyAxXSA6IG51bGwsIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goc3RpY2t5SXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzbmFwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaSA9IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgKyBpdGVtc09uRGlzcGxheUxlbmd0aCAtIDEsIHN0YXJ0SW5kZXggPSBzaSA8IDAgPyBzaSA6IHNpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApLCBsID0gdG90YWxMZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sIGNhY2hlID0gdGhpcy5nZXQoaWQpISwgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSA/PyAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gaXRlbUNvbmZpZ01hcFtpZF0/LnNlbGVjdGFibGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uY29sbGFwc2FibGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBkeW5hbWljU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT2RkID0gaSAlIDIgIT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IHNpemUsIGggPSBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVTdGFydFBvc2l0aW9uID0gcG9zIC0gKHNjcm9sbFNpemUgLSBzaXplKSAtIHNpemUsIHJhdGlvID0gc2l6ZSAhPT0gMCA/IGJvdW5kc1NpemUgLyBzaXplIDogMCwgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCA9IC0oYm91bmRzU2l6ZSAhPT0gMCA/IGFic29sdXRlU3RhcnRQb3NpdGlvbiAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQgPSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIChib3VuZHNTaXplICE9PSAwID8gKGFic29sdXRlRW5kUG9zaXRpb24gKyBzaXplKSAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtTWVhc3VyZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaXNWZXJ0aWNhbCA/IDAgOiBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSB3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGlzVmVydGljYWwgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBoIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhOiBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBkZWx0YU9mZmV0IC0gc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZzogSVJlbmRlclZpcnR1YWxMaXN0SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXc6IChjYWNoZSBzYXRpc2ZpZXMgQ2FjaGUpPy5bSVNfTkVXXSA9PT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGQ6IGlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW46ICFpc09kZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkT3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IGl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcxJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGNvbGxlY3Rpb25JdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLCBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBwcmV2aW91c2VEYXRhOiBpID4gMCA/IGl0ZW1zW2kgLSAxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RGF0YTogaSA8IHRvdGFsTGVuZ3RoID8gaXRlbXNbaSArIDFdIDogbnVsbCwgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtU2l6ZSA9IHNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SXRlbXMucHVzaChlbmRTdGlja3lJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaSA9IHN0YXJ0SW5kZXgsIGl0ZXJhdGlvbnMgPSAwO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHJlbmRlckl0ZW1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9ucysrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPiB0b3RhbExlbmd0aCB8fCBpID49IHRvdGFsTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsZWN0aW9uSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sIGNhY2hlID0gdGhpcy5nZXQoaWQpISxcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gZHluYW1pY1NpemUgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkIHx8IGlkICE9PSBzdGlja3lJdGVtPy5pZCkgJiYgaWQgIT09IGVuZFN0aWNreUl0ZW0/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPZGQgPSBpICUgMiAhPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3kgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc3RpY2t5ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc2VsZWN0YWJsZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzYWJsZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5jb2xsYXBzYWJsZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZCA9IHNuYXAgJiYgKHN0aWNreSA9PT0gMSAmJiAocG9zIDw9IHNjcm9sbFNpemUgKyB0aGlzLl9zY3JvbGxTdGFydE9mZnNldCkgfHwgc3RpY2t5ID09PSAyICYmIChwb3MgPj0gc2Nyb2xsU2l6ZSArIGJvdW5kc1NpemUgLSBzaXplKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIHNjcm9sbFNpemUsIHJhdGlvID0gc2l6ZSAhPT0gMCA/IGJvdW5kc1NpemUgLyBzaXplIDogMCwgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCA9IC0oYm91bmRzU2l6ZSAhPT0gMCA/IGFic29sdXRlU3RhcnRQb3NpdGlvbiAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uID0gYm91bmRzU2l6ZSAtIChhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50ICsgc2l6ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb25QZXJjZW50ID0gKGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgKyAoYm91bmRzU2l6ZSAhPT0gMCA/IChhYnNvbHV0ZUVuZFBvc2l0aW9uICsgc2l6ZSkgLyBib3VuZHNTaXplIDogMCkgKiByYXRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtTWVhc3VyZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBpc1ZlcnRpY2FsID8gMCA6IHBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGlzVmVydGljYWwgPyBwb3MgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaXNWZXJ0aWNhbCA/IG5vcm1hbGl6ZWRJdGVtV2lkdGggOiBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHN0aWNreSA9PT0gMSA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IHN0aWNreSA9PT0gMiA/IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIGRlbHRhT2ZmZXQgLSBzaXplIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3OiAoY2FjaGUgc2F0aXNmaWVzIENhY2hlKT8uW0lTX05FV10gPT09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGQ6IGlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogIWlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreTogc3RpY2t5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZE91dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiBjb3VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3R1YjogKGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCAmJiBpZCA9PT0gc3RpY2t5SXRlbT8uaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiAnMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmFwcGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy56SW5kZXggPSAnMic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGNvbGxlY3Rpb25JdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgcHJldmlvdXNlRGF0YTogaSA+IDAgPyBpdGVtc1tpIC0gMV0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RGF0YTogaSA8IHRvdGFsTGVuZ3RoID8gaXRlbXNbaSArIDFdIDogbnVsbCwgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0U3RpY2t5ICYmIHN0aWNreUl0ZW1JbmRleCA8IGkgJiYgc3RpY2t5ID09PSAxICYmIChwb3MgPD0gc2Nyb2xsU2l6ZSArIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgc2l6ZSArIHN0aWNreUl0ZW1TaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnggPSBpc1ZlcnRpY2FsID8gMCA6IHNuYXBwZWQgPyBhY3R1YWxTbmlwcGVkUG9zaXRpb24gOiBwb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBpdGVtLm1lYXN1cmVzLnkgOiBpdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuekluZGV4ID0gJzMnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRFbmRTdGlja3kgJiYgZW5kU3RpY2t5SXRlbUluZGV4ID4gaSAmJiBzdGlja3kgPT09IDIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvcyA+PSBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBzaXplIC0gZW5kU3RpY2t5SXRlbVNpemUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueCA9IGlzVmVydGljYWwgPyAwIDogc25hcHBlZCA/IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIHNpemUgOiBwb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gc2l6ZSA6IHBvcyA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5LmNvbmZpZy56SW5kZXggPSAnMyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBpdGVtLm1lYXN1cmVzLnkgOiBpdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zIC09IDE7XHJcbiAgICAgICAgICAgICAgICBwb3MgKz0gc2l6ZTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgYXhpcyA9IGlzVmVydGljYWwgPyBZX1BST1BfTkFNRSA6IFhfUFJPUF9OQU1FO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEhbmV4dFN0aWNreSAmJiAhIXN0aWNreUl0ZW0gJiYgbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSA8PSBhY3R1YWxTbmlwcGVkUG9zaXRpb24gKyBzdGlja3lJdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gPiBzY3JvbGxTaXplIC0gc3RpY2t5SXRlbVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSAtIHN0aWNreUl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWQgPSBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc25hcHBlZE91dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc3RpY2t5ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBzdGlja3lJdGVtLm1lYXN1cmVzLnkgOiBzdGlja3lJdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5tZWFzdXJlcy5kZWx0YSA9IChpc1ZlcnRpY2FsID8gbmV4dFN0aWNreS5tZWFzdXJlcy55IDogbmV4dFN0aWNreS5tZWFzdXJlcy54KSAtIHNjcm9sbFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5tZWFzdXJlc1theGlzXSA9IHN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gKyBzdGlja3lJdGVtLm1lYXN1cmVzW3NpemVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghIW5leHRFbmRTdGlja3kgJiYgISFlbmRTdGlja3lJdGVtICYmXHJcbiAgICAgICAgICAgICAgICAobmV4dEVuZFN0aWNreS5tZWFzdXJlc1theGlzXSA+PSBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBlbmRTdGlja3lJdGVtU2l6ZSAtIG5leHRFbmRTdGlja3kubWVhc3VyZXNbc2l6ZVByb3BlcnR5XSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdIDwgYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5tZWFzdXJlc1theGlzXSA9IG5leHRFbmRTdGlja3kubWVhc3VyZXNbYXhpc10gKyBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5jb25maWcuc25hcHBlZCA9IG5leHRFbmRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkT3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLmNvbmZpZy5zdGlja3kgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0ubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IGVuZFN0aWNreUl0ZW0ubWVhc3VyZXMueSA6IGVuZFN0aWNreUl0ZW0ubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdID0gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IG5leHRFbmRTdGlja3kubWVhc3VyZXMueSA6IG5leHRFbmRTdGlja3kubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdICsgbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkaXNwbGF5SXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRQb3NpdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci5jbGVhclRyYWNrTWFwKCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJTY3JvbGxEaXJlY3Rpb25DYWNoZShmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVsdGFEaXJlY3Rpb24gPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnRyYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB0cmFja2luZyBieSBwcm9wTmFtZVxyXG4gICAgICovXHJcbiAgICB0cmFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zIHx8ICF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90cmFja2VyLnRyYWNrKHRoaXMuX2l0ZW1zLCB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cywgdGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzLCB0aGlzLnNjcm9sbERpcmVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCh2OiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLmRpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50PzogQyB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1Cb3VuZHMoaWQ6IElkKTogSVNpemUgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChpZCkgPz8gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkSXNTY3JvbGxTdGFydE9mZiA9IGRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9pc1Njcm9sbFN0YXJ0ID0gZmFsc2U7XHJcbiAgICB9KTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgY2FjaGVFbGVtZW50cyhpc1ZlcnRpY2FsOiBib29sZWFuLCBpdGVtU2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXSwgaXRlbUlkID0gY29tcG9uZW50Lmluc3RhbmNlLml0ZW1JZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBjb21wb25lbnQuaW5zdGFuY2UuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1JZCwge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXQoaXRlbUlkKSwgLi4uYm91bmRzLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJvdW5kcy53aWR0aCB8fCAoaXNWZXJ0aWNhbCA/IDAgOiBpdGVtU2l6ZSksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGJvdW5kcy5oZWlnaHQgfHwgKGlzVmVydGljYWwgPyBpdGVtU2l6ZSA6IDApLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzTGF6eSAmJiAodGhpcy5faXNTY3JvbGxTdGFydCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlZElzU2Nyb2xsU3RhcnRPZmYuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fcHJlcmVuZGVyZWRDYWNoZTtcclxuICAgICAgICBpZiAoISFjYWNoZSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUl0ZW0gPSBjYWNoZVtpZF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldChpZCwgeyAuLi4odGhpcy5nZXQoaWQpIHx8IHt9KSwgLi4uY2FjaGVJdGVtIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXJlbmRlcmVkQ2FjaGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXNldENhY2hlQ2h1bmtJbmZvKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX25ld0l0ZW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY2FjaGVDbGVhbigpIHtcclxuICAgICAgICB0aGlzLl9tYXAuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLl9zbmFwc2hvdC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRpc3Bvc2VDbGVhckJ1ZmZlclNpemVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoISF0aGlzLl9kZWJvdW5jZWRJc1Njcm9sbFN0YXJ0T2ZmKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlZElzU2Nyb2xsU3RhcnRPZmYuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEhdGhpcy5fdHJhY2tlcikge1xyXG4gICAgICAgICAgICB0aGlzLl90cmFja2VyLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
1353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2stYm94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29yZS90cmFjay1ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFDSCxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUMxSCxXQUFXLEVBQUUsV0FBVyxHQUMzQixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUNBQWlDLEVBQUUsa0NBQWtDLEVBQUUsaUNBQWlDLEVBQUUsd0JBQXdCLEVBQ2xJLE1BQU0sRUFBRSwwQkFBMEIsR0FDckMsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUt2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3Qzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxRQUNULFNBQVEsUUFBc0Q7SUFFcEQsUUFBUSxDQUFjO0lBRXRCLE1BQU0sQ0FBa0Q7SUFFbEUsSUFBSSxLQUFLLENBQUMs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LE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNySixxQkFBcUIsR0FBRyxHQUFHLEdBQUcsVUFBVSxFQUFFLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUN6TCxtQkFBbUIsR0FBRyxVQUFVLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsRUFDeEUsMEJBQTBCLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDeEksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFDaEUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDaEUsUUFBUSxHQUFtQzs0QkFDdkMsQ0FBQzs0QkFDRCxDQUFDOzRCQUNELFlBQVks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ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24sIH0gZnJvbSBcIi4uL21vZGVscy9yZW5kZXItY29sbGVjdGlvbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJUmVuZGVyVmlydHVhbExpc3RJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9yZW5kZXItaXRlbS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJZCB9IGZyb20gXCIuLi90eXBlcy9pZFwiO1xyXG5pbXBvcnQgeyBDQUNIRV9CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIENhY2hlTWFwIH0gZnJvbSBcIi4vY2FjaGUtbWFwXCI7XHJcbmltcG9ydCB7IFRyYWNrZXIgfSBmcm9tIFwiLi90cmFja2VyXCI7XHJcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBERUZBVUxUX0RJVklERVMsIEhFSUdIVF9QUk9QX05BTUUsIFNFUlZJQ0VfUFJPUF9EVU1NWSwgU0VSVklDRV9QUk9QX0RVTU1ZX0VOQUJMRUQsIFRSQUNLX0JZX1BST1BFUlRZX05BTUUsIFdJRFRIX1BST1BfTkFNRSxcclxuICAgIFhfUFJPUF9OQU1FLCBZX1BST1BfTkFNRSxcclxufSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0SXRlbUNvbmZpZywgSVJlbmRlclZpcnR1YWxMaXN0SXRlbU1lYXN1cmVzLCBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBDTWFwIH0gZnJvbSAnLi4vdXRpbHMvY21hcCc7XHJcbmltcG9ydCB7IGJ1ZmZlckludGVycG9sYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvYnVmZmVyLWludGVycG9sYXRpb25cIjtcclxuaW1wb3J0IHsgQmFzZVZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRzL25nLWxpc3QtaXRlbS9iYXNlXCI7XHJcbmltcG9ydCB7IFByZXJlbmRlckNhY2hlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctcHJlcmVuZGVyLWNvbnRhaW5lci90eXBlcy9jYWNoZVwiO1xyXG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuaW1wb3J0IHsgb2JqZWN0QXNSZWFkb25seSB9IGZyb20gXCIuLi91dGlscy9vYmplY3RcIjtcclxuaW1wb3J0IHsgZ2V0U2VydmljZUlkUHJvcCB9IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBERUZBVUxUX0JVRkZFUl9FWFRSRU1VTV9USFJFU0hPTEQsIERFRkFVTFRfTUFYX0JVRkZFUl9TRVFVRU5DRV9MRU5HVEgsIERFRkFVTFRfUkVTRVRfQlVGRkVSX1NJWkVfVElNRU9VVCwgRU5EX0NPTExFQ1RJT05fUFJFRklYX0lELFxyXG4gICAgSVNfTkVXLCBTVEFSVF9DT0xMRUNUSU9OX1BSRUZJWF9JRCxcclxufSBmcm9tIFwiLi9jb25zdFwiO1xyXG5pbXBvcnQgeyBaX0lOREVYXzAsIFpfSU5ERVhfMSwgWl9JTkRFWF8yLCBaX0lOREVYXzMsIH0gZnJvbSAnLi4vY29uc3QnO1xyXG5pbXBvcnQge1xyXG4gICAgSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnMsIElHZXRNZXRyaWNzUmV0dXJucywgSUl0ZW0sIElNZXRyaWNzLCBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9ucywgSVVwZGF0ZUNvbGxlY3Rpb25PcHRpb25zLFxyXG4gICAgSVVwZGF0ZUNvbGxlY3Rpb25SZXR1cm5zLFxyXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgVHJhY2tCb3hFdmVudHMgfSBmcm9tIFwiLi9ldmVudHNcIjtcclxuaW1wb3J0IHsgQ2FjaGUsIENhY2hlTWFwRXZlbnRzLCBDYWNoZU1hcExpc3RlbmVycyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcbmltcG9ydCB7IEl0ZW1EaXNwbGF5TWV0aG9kcyB9IGZyb20gXCIuL2VudW1zXCI7XHJcblxyXG4vKipcclxuICogQW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgdHJhY2tpbmcsIGNhbGN1bGF0aW9ucyBhbmQgY2FjaGluZy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTgueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb3JlL3RyYWNrLWJveC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgQWxleGFuZHJvdmljaCBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFja0JveDxDIGV4dGVuZHMgQmFzZVZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCA9IGFueT5cclxuICAgIGV4dGVuZHMgQ2FjaGVNYXA8SWQsIENhY2hlLCBDYWNoZU1hcEV2ZW50cywgQ2FjaGVNYXBMaXN0ZW5lcnM+IHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3RyYWNrZXIhOiBUcmFja2VyPEM+O1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBpdGVtcyh2OiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pdGVtcyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPEM+PiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgc2V0IGRpc3BsYXlDb21wb25lbnRzKHY6IEFycmF5PENvbXBvbmVudFJlZjxDPj4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPEM+PiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgc2V0IHNuYXBwZWREaXNwbGF5Q29tcG9uZW50cyh2OiBBcnJheTxDb21wb25lbnRSZWY8Qz4+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gMDtcclxuICAgIHNldCBzY3JvbGxEaXJlY3Rpb24odjogU2Nyb2xsRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbERpcmVjdGlvbiA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24gPSB2O1xyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Njcm9sbERpcmVjdGlvbjsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdHJhY2tCeTogc3RyaW5nID0gVFJBQ0tfQllfUFJPUEVSVFlfTkFNRTtcclxuICAgIHNldCB0cmFja0J5KHY6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLl90cmFja0J5ID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYWNrQnkgPSB2O1xyXG4gICAgfVxyXG4gICAgZ2V0IHRyYWNrQnkoKSB7IHJldHVybiB0aGlzLl90cmFja0J5OyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXZpZGVzOiBudW1iZXIgPSBERUZBVUxUX0RJVklERVM7XHJcblxyXG4gICAgc2V0IGRpdmlkZXModjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RpdmlkZXMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGl2aWRlcyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc0luZmluaXR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzSW5maW5pdHkodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luZmluaXR5ID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5maW5pdHkgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZCA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNMYXp5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzTGF6eSh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzTGF6eSA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc0xhenkgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0cmFja0J5IHByb3BlcnR5XHJcbiAgICAgKi9cclxuICAgIHNldCB0cmFja2luZ1Byb3BlcnR5TmFtZSh2OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSA9IHRoaXMuX3RyYWNrZXIudHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdHJhY2tpbmdQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFRSQUNLX0JZX1BST1BFUlRZX05BTUU7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1Njcm9sbFN0YXJ0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzU2Nyb2xsU3RhcnQodjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsU3RhcnQgPSB2O1xyXG4gICAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU2Nyb2xsU25hcFRvU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc2V0IGlzU2Nyb2xsRW5kKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9pc1Njcm9sbEVuZCA9IHY7XHJcbiAgICAgICAgaWYgKHYpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNTY3JvbGxTbmFwVG9FbmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsU25hcFRvU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgaXNTbmFwcGVkVG9TdGFydCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTY3JvbGxTdGFydCB8fCB0aGlzLl9pc1Njcm9sbFNuYXBUb1N0YXJ0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTY3JvbGxTbmFwVG9FbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgaXNTbmFwcGVkVG9FbmQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Nyb2xsRW5kIHx8IHRoaXMuX2lzU2Nyb2xsU25hcFRvRW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2Nyb2xsU3RhcnRPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgICBzZXQgc2Nyb2xsU3RhcnRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgPSB2O1xyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbFN0YXJ0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxTdGFydE9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbEVuZE9mZnNldDogbnVtYmVyID0gMDtcclxuICAgIHNldCBzY3JvbGxFbmRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0ID0gdjtcclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxFbmRPZmZzZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVuZE9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlciA9IG5ldyBUcmFja2VyKHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQoaWQ6IElkLCBjYWNoZTogQ2FjaGUpOiBDTWFwPElkLCBJU2l6ZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCBiID0gdGhpcy5fbWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgIGlmIChiPy53aWR0aCA9PT0gY2FjaGUud2lkdGggJiYgYj8uaGVpZ2h0ID09PSBjYWNoZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLl9tYXAuc2V0KGlkLCBjYWNoZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZpb3VzQ29sbGVjdGlvbjogQXJyYXk8SUl0ZW0+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG4gICAgZ2V0IGNydWREZXRlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX2NydWREZXRlY3RlZDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2hhbmdlSWZOZWVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5nZXNEZXRlY3RlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goVHJhY2tCb3hFdmVudHMuQ0hBTkdFLCB0aGlzLl92ZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpcmVUaWNrKCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2goVHJhY2tCb3hFdmVudHMuVElDSyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9wcmV2aW91c1RvdGFsU2l6ZSA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWx0YU9mTmV3SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICBnZXQgZGVsdGFPZk5ld0l0ZW1zKCkgeyByZXR1cm4gdGhpcy5fZGVsdGFPZk5ld0l0ZW1zOyB9XHJcblxyXG4gICAgaXNBZGFwdGl2ZUJ1ZmZlciA9IHRydWU7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9idWZmZXJTZXF1ZW5jZUV4dHJhVGhyZXNob2xkID0gREVGQVVMVF9CVUZGRVJfRVhUUkVNVU1fVEhSRVNIT0xEO1xyXG5cclxuICAgIHByb3RlY3RlZCBfbWF4QnVmZmVyU2VxdWVuY2VMZW5ndGggPSBERUZBVUxUX01BWF9CVUZGRVJfU0VRVUVOQ0VfTEVOR1RIO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYnVmZmVyU2l6ZVNlcXVlbmNlOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIF9idWZmZXJTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgZ2V0IGJ1ZmZlclNpemUoKSB7IHJldHVybiB0aGlzLl9idWZmZXJTaXplOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0QnVmZmVyU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX21heEJ1ZmZlclNpemU6IG51bWJlciA9IHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcmVzZXRCdWZmZXJTaXplVGltZW91dDogbnVtYmVyID0gREVGQVVMVF9SRVNFVF9CVUZGRVJfU0laRV9USU1FT1VUO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcmVzZXRCdWZmZXJTaXplVGltZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzUmVzZXRlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcmVuZGVyZWRDYWNoZTogUHJlcmVuZGVyQ2FjaGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9uZXdJdGVtczogQXJyYXk8SWQ+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGxpZmVDaXJjbGUoKSB7XHJcbiAgICAgICAgdGhpcy5maXJlQ2hhbmdlSWZOZWVkKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmlyZVRpY2soKTtcclxuXHJcbiAgICAgICAgdGhpcy5saWZlQ2lyY2xlRG8oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYW5zIHRoZSBjb2xsZWN0aW9uIGZvciBkZWxldGVkIGl0ZW1zIGFuZCBmbHVzaGVzIHRoZSBkZWxldGVkIGl0ZW0gY2FjaGUuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Q29sbGVjdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oY3VycmVudENvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29sbGVjdGlvbiAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50Q29sbGVjdGlvbiA9PT0gdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQXR0ZW50aW9uISBUaGUgY29sbGVjdGlvbiBtdXN0IGJlIGltbXV0YWJsZS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzZXRlZCA9ICgoIXRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiB8fCB0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSAmJlxyXG4gICAgICAgICAgICAoISFjdXJyZW50Q29sbGVjdGlvbiAmJiBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGggPiAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzUmVzZXRlZCA9IHJlc2V0ZWQ7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUodGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uLCBjdXJyZW50Q29sbGVjdGlvbiwgaXRlbVNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24gPSBbLi4uKGN1cnJlbnRDb2xsZWN0aW9uIHx8IFtdKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGNhY2hlIG9mIGl0ZW1zIGZyb20gdGhlIGxpc3RcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUNhY2hlPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihwcmV2aW91c0NvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGN1cnJlbnRDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBpdGVtU2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lO1xyXG4gICAgICAgIGxldCBjcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9uZXdJdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIWN1cnJlbnRDb2xsZWN0aW9uIHx8IGN1cnJlbnRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAocHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHByZXZpb3VzQ29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gcHJldmlvdXNDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW0/Llt0cmFja0J5XTtcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWl0ZW0gJiYgdGhpcy5fbWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbGxlY3Rpb24gfHwgcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGFkZGVkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGN1cnJlbnRDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW0/Llt0cmFja0J5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoaWQsIHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkRpY3Q6IElJdGVtPEk+ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRDb2xsZWN0aW9uW2ldO1xyXG4gICAgICAgICAgICBpZiAoISFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uRGljdFtpdGVtW3RyYWNrQnldXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgbm90Q2hhbmdlZE1hcDogSUl0ZW08ST4gPSB7fSwgZGVsZXRlZE1hcDogSUl0ZW08ST4gPSB7fSwgZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemUgfSA9IHt9LFxyXG4gICAgICAgICAgICB1cGRhdGVkTWFwOiBJSXRlbTxJPiA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcHJldmlvdXNDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW0/Llt0cmFja0J5XTtcclxuICAgICAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EaWN0Lmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBjb2xsZWN0aW9uRGljdFtpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGNoYW5nZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm90Q2hhbmdlZE1hcFtpdGVtW3RyYWNrQnldXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoaWQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0aGlzLl9tYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNYXBbaXRlbVt0cmFja0J5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4odGhpcy5fbWFwLmdldChpZCkgfHwgeyB3aWR0aDogaXRlbVNpemUsIGhlaWdodDogaXRlbVNpemUgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlZE1hcFtpZF0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwW2ldID0gdGhpcy5fbWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRDb2xsZWN0aW9uW2ldLCBpZCA9IGl0ZW0/Llt0cmFja0J5XTtcclxuICAgICAgICAgICAgaWYgKCEhaXRlbSAmJiAhZGVsZXRlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIXVwZGF0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmXHJcbiAgICAgICAgICAgICAgICAhbm90Q2hhbmdlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25ld0l0ZW1zLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGNydWREZXRlY3RlZDtcclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSBkZWxldGVkSXRlbXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgcG9zaXRpb24gb2YgYSBjb2xsZWN0aW9uIGVsZW1lbnQgYnkgdGhlIGdpdmVuIElkXHJcbiAgICAgKi9cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaWQ6IElkLCBpdGVtQ29uZmlnTWFwOiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEksIEM+KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGZyb21JdGVtSWQ6IGlkID8/IG9wdGlvbnMuZnJvbUl0ZW1JZCwgaXRlbUNvbmZpZ01hcCwgLi4ub3B0aW9ucyB9O1xyXG4gICAgICAgIHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplID0gb3B0LmJ1ZmZlclNpemU7XHJcbiAgICAgICAgdGhpcy5fbWF4QnVmZmVyU2l6ZSA9IG9wdC5tYXhCdWZmZXJTaXplO1xyXG5cclxuICAgICAgICBjb25zdCB7IHNjcm9sbFNpemUsIGlzRnJvbUl0ZW1JZEZvdW5kIH0gPSB0aGlzLnJlY2FsY3VsYXRlTWV0cmljcyh7XHJcbiAgICAgICAgICAgIC4uLm9wdCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemU6IHRoaXMuX2NydWREZXRlY3RlZCB8fCBvcHQuZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIHByZXZpb3VzVG90YWxTaXplOiB0aGlzLl9wcmV2aW91c1RvdGFsU2l6ZSxcclxuICAgICAgICAgICAgY3J1ZERldGVjdGVkOiB0aGlzLl9jcnVkRGV0ZWN0ZWQsXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcDogdGhpcy5fZGVsZXRlZEl0ZW1zTWFwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpc0Zyb21JdGVtSWRGb3VuZCA/IHNjcm9sbFNpemUgOiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwcmV2ZW50U2Nyb2xsU25hcHBpbmcoY2xlYXJCdWZmZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsU3RhcnQgPSB0aGlzLl9pc1Njcm9sbEVuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoY2xlYXJCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNTY3JvbGxTbmFwVG9TdGFydCA9IHRoaXMuX2lzU2Nyb2xsU25hcFRvRW5kID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgY29sbGVjdGlvbiBvZiBkaXNwbGF5IG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgZ2V0TWV0cmljczxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaXRlbXM6IEMsIGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAsXHJcbiAgICAgICAgb3B0aW9uczogSVVwZGF0ZUNvbGxlY3Rpb25PcHRpb25zPEksIEM+KTogSUdldE1ldHJpY3NSZXR1cm5zIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGl0ZW1Db25maWdNYXAsIC4uLm9wdGlvbnMgfSwgY3J1ZERldGVjdGVkID0gdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAgPSB0aGlzLl9kZWxldGVkSXRlbXNNYXA7XHJcbiAgICAgICAgdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgPSBvcHQuYnVmZmVyU2l6ZTtcclxuICAgICAgICB0aGlzLl9tYXhCdWZmZXJTaXplID0gb3B0Lm1heEJ1ZmZlclNpemU7XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLnJlY2FsY3VsYXRlTWV0cmljcyh7XHJcbiAgICAgICAgICAgIC4uLm9wdCxcclxuICAgICAgICAgICAgY29sbGVjdGlvbjogaXRlbXMsXHJcbiAgICAgICAgICAgIHByZXZpb3VzVG90YWxTaXplOiB0aGlzLl9wcmV2aW91c1RvdGFsU2l6ZSxcclxuICAgICAgICAgICAgY3J1ZERldGVjdGVkOiB0aGlzLl9jcnVkRGV0ZWN0ZWQsXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgdG90YWxTaXplOiBtZXRyaWNzLnRvdGFsU2l6ZSwgZGVsdGE6IG1ldHJpY3MuZGVsdGEsIGNydWREZXRlY3RlZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgY29sbGVjdGlvbiBvZiBkaXNwbGF5IG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlQ29sbGVjdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaXRlbXM6IEMsIGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAsXHJcbiAgICAgICAgb3B0aW9uczogSVVwZGF0ZUNvbGxlY3Rpb25PcHRpb25zPEksIEM+KTogSVVwZGF0ZUNvbGxlY3Rpb25SZXR1cm5zIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGl0ZW1Db25maWdNYXAsIC4uLm9wdGlvbnMgfSwgZHluYW1pY1NpemUgPSBvcHQuZHluYW1pY1NpemUsIGNydWREZXRlY3RlZCA9IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlRWxlbWVudHMob3B0LmlzVmVydGljYWwsIG9wdC5pdGVtU2l6ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplID0gb3B0LmJ1ZmZlclNpemU7XHJcbiAgICAgICAgdGhpcy5fbWF4QnVmZmVyU2l6ZSA9IG9wdC5tYXhCdWZmZXJTaXplO1xyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGl0ZW1zLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbHRhICs9IG1ldHJpY3MuZGVsdGE7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWRhcHRpdmVCdWZmZXJQYXJhbXMobWV0cmljcywgaXRlbXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldmlvdXNUb3RhbFNpemUgPSBtZXRyaWNzLnRvdGFsU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZEl0ZW1zTWFwID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAob3B0LmR5bmFtaWNTaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlJdGVtcyA9IHRoaXMuZ2VuZXJhdGVEaXNwbGF5Q29sbGVjdGlvbihtZXRyaWNzLml0ZW1zLCBpdGVtcywgaXRlbUNvbmZpZ01hcCwgeyAuLi5tZXRyaWNzLCB9KTtcclxuICAgICAgICByZXR1cm4geyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZTogbWV0cmljcy50b3RhbFNpemUsIGRlbHRhOiBtZXRyaWNzLmRlbHRhLCBjcnVkRGV0ZWN0ZWQsIGxlZnRMYXlvdXRPZmZzZXQ6IG1ldHJpY3MubGVmdExheW91dE9mZnNldCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJldmlvdXNTY3JvbGxTaXplID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlQWRhcHRpdmVCdWZmZXJQYXJhbXM8SSBleHRlbmRzIElJdGVtPihtZXRyaWNzOiBJTWV0cmljczxJPiwgdG90YWxJdGVtc0xlbmd0aDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwb3NlQ2xlYXJCdWZmZXJTaXplVGltZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IG1ldHJpY3Muc2Nyb2xsU2l6ZSArIHRoaXMuX2RlbHRhLCBkZWx0YSA9IE1hdGguYWJzKHRoaXMuX3ByZXZpb3VzU2Nyb2xsU2l6ZSAtIHNjcm9sbFNpemUpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemU7XHJcbiAgICAgICAgY29uc3QgYnVmZmVyUmF3U2l6ZSA9IE1hdGgubWluKE1hdGguZmxvb3IobWV0cmljcy50eXBpY2FsSXRlbVNpemUgIT09IDAgPyBkZWx0YSAvIG1ldHJpY3MudHlwaWNhbEl0ZW1TaXplIDogMCkgKiA1LCB0b3RhbEl0ZW1zTGVuZ3RoKSxcclxuICAgICAgICAgICAgbWluQnVmZmVyU2l6ZSA9IGJ1ZmZlclJhd1NpemUgPCB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA/IHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplIDogYnVmZmVyUmF3U2l6ZSxcclxuICAgICAgICAgICAgYnVmZmVyVmFsdWUgPSBtaW5CdWZmZXJTaXplID4gdGhpcy5fbWF4QnVmZmVyU2l6ZSA/IHRoaXMuX21heEJ1ZmZlclNpemUgOiBtaW5CdWZmZXJTaXplO1xyXG5cclxuICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gYnVmZmVySW50ZXJwb2xhdGlvbih0aGlzLl9idWZmZXJTaXplLCB0aGlzLl9idWZmZXJTaXplU2VxdWVuY2UsIGJ1ZmZlclZhbHVlLCB7XHJcbiAgICAgICAgICAgIGV4dHJlbXVtVGhyZXNob2xkOiB0aGlzLl9idWZmZXJTZXF1ZW5jZUV4dHJhVGhyZXNob2xkLFxyXG4gICAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLl9tYXhCdWZmZXJTZXF1ZW5jZUxlbmd0aCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydFJlc2V0QnVmZmVyU2l6ZVRpbWVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXJ0UmVzZXRCdWZmZXJTaXplVGltZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVzZXRCdWZmZXJTaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplO1xyXG4gICAgICAgICAgICB0aGlzLl9idWZmZXJTaXplU2VxdWVuY2UgPSBbXTtcclxuICAgICAgICB9LCB0aGlzLl9yZXNldEJ1ZmZlclNpemVUaW1lb3V0KSBhcyB1bmtub3duIGFzIG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGlzcG9zZUNsZWFyQnVmZmVyU2l6ZVRpbWVyKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNldEJ1ZmZlclNpemVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbnRyeSBpbnRvIHRoZSBvdmVyc2Nyb2xsIGFyZWEgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBvdmVyc2Nyb2xsIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRFbGVtZW50TnVtVG9FbmQ8SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+KGk6IG51bWJlciwgY29sbGVjdGlvbjogQywgbWFwOiBDTWFwPElkLCBJU2l6ZT4sIHR5cGljYWxJdGVtU2l6ZTogbnVtYmVyLFxyXG4gICAgICAgIHNpemU6IG51bWJlciwgaXNWZXJ0aWNhbDogYm9vbGVhbiwgaW5kZXhPZmZzZXQ6IG51bWJlciA9IDAsIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHsgbnVtOiBudW1iZXIsIG9mZnNldDogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHRyYWNrQnkgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSwgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUU7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IDAsIG51bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IGNvbGxlY3Rpb24ubGVuZ3RoIC0gaW5kZXhPZmZzZXQgLSAxOyByZXZlcnNlID8gaiA+PSAwIDogaiA+PSBpOyBqLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25bal0sIGlkID0gaXRlbVt0cmFja0J5XTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplID0gMDtcclxuICAgICAgICAgICAgaWYgKG1hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBjYWNoZSAmJiBjYWNoZVtzaXplUHJvcGVydHldID4gMCA/IGNhY2hlW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2l6ZSA9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgaXRlbVNpemUgPiBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBudW0sIG9mZnNldCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgbnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG51bSwgb2Zmc2V0IH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGxpc3QgbWV0cmljc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVjYWxjdWxhdGVNZXRyaWNzPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihvcHRpb25zOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPik6IElNZXRyaWNzPEk+IHtcclxuICAgICAgICBjb25zdCB7IGZyb21JdGVtSWQsIGJvdW5kcywgY29sbGVjdGlvbiwgZHluYW1pY1NpemUsIGlzVmVydGljYWwsIGl0ZW1TaXplLCBtaW5JdGVtU2l6ZSwgbWF4SXRlbVNpemUsIGJ1ZmZlclNpemU6IG1pbkJ1ZmZlclNpemUsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUsIHN0aWNreUVuYWJsZWQsIGl0ZW1Db25maWdNYXAsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sIHByZXZpb3VzVG90YWxTaXplLCBzbmFwVG9JdGVtLCBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCwgaXRlbVRyYW5zZm9ybSB9ID0gb3B0aW9ucyBhcyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiAmIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAsXHJcbiAgICAgICAgICAgIH0sIHJvdW5kZWRTY3JvbGxTaXplID0gTWF0aC5yb3VuZChzY3JvbGxTaXplKTtcclxuXHJcbiAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lLCBidWZmZXJTaXplID0gTWF0aC5tYXgobWluQnVmZmVyU2l6ZSwgdGhpcy5fYnVmZmVyU2l6ZSksXHJcbiAgICAgICAgICAgIHsgd2lkdGgsIGhlaWdodCB9ID0gYm91bmRzLCBzaXplUHJvcGVydHkgPSBpc1ZlcnRpY2FsID8gSEVJR0hUX1BST1BfTkFNRSA6IFdJRFRIX1BST1BfTkFNRSxcclxuICAgICAgICAgICAgc2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCwgdG90YWxMZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCwgdHlwaWNhbEl0ZW1TaXplID0gaXRlbVNpemUsXHJcbiAgICAgICAgICAgIHcgPSBpc1ZlcnRpY2FsID8gd2lkdGggOiB0eXBpY2FsSXRlbVNpemUsIGggPSBpc1ZlcnRpY2FsID8gdHlwaWNhbEl0ZW1TaXplIDogaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXAsIHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3QsIGRpdmlkZXMgPSB0aGlzLl9kaXZpZGVzLFxyXG4gICAgICAgICAgICBzdGlja3lQb3MgPSBNYXRoLmZsb29yKHNjcm9sbFNpemUpICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQsIGxlZnRJdGVtc09yUm93c1dlaWdodHM6IEFycmF5PG51bWJlcj4gPSBbXSxcclxuICAgICAgICAgICAgaXNGcm9tSWQgPSBmcm9tSXRlbUlkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBmcm9tSXRlbUlkID09PSAnbnVtYmVyJyAmJiBmcm9tSXRlbUlkID4gLTEpXHJcbiAgICAgICAgICAgICAgICB8fCAodHlwZW9mIGZyb21JdGVtSWQgPT09ICdzdHJpbmcnICYmIGZyb21JdGVtSWQgPiAnLTEnKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnRJdGVtc09mZnNldCA9IDAsIHJpZ2h0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmIChlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fc2Nyb2xsRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplICogZGl2aWRlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgLTE6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplICogZGl2aWRlcztcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZSAqIGRpdmlkZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZSAqIGRpdmlkZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZDogbnVtYmVyID0gLTEsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gLTEsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gMCwgcmlnaHRJdGVtTGVuZ3RoID0gMCxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0ID0gMCwgcmlnaHRJdGVtc1dlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBkZWx0YU9mTmV3SXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgaXRlbUJ5SWQ6IEkgfCBudWxsID0gbnVsbCxcclxuICAgICAgICAgICAgaXRlbUJ5SWRQb3M6IG51bWJlciA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXRlbUJ5SWRQb3MsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0LFxyXG4gICAgICAgICAgICBzdGFydEluZGV4OiBudW1iZXIsXHJcbiAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gPSAwLFxyXG4gICAgICAgICAgICBpc1VwZGF0aW5nID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGxlZnRZT2Zmc2V0ID0gMCxcclxuICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRJbmRleE9mZnNldCA9IDAsXHJcbiAgICAgICAgICAgIHJpZ2h0TGF5b3V0SW5kZXhPZmZzZXQgPSAwO1xyXG5cclxuICAgICAgICBjb25zdCBpc1N0YXJ0ID0gKChyb3VuZGVkU2Nyb2xsU2l6ZSA9PT0gMCkgfHwgdGhpcy5pc1NuYXBwZWRUb1N0YXJ0KTtcclxuICAgICAgICBsZXQgc3RpY2t5SXRlbUlkOiBJZCB8IHVuZGVmaW5lZCwgaXNOZXcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zOiBBcnJheTxJPjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgZHluYW1pYyBvciB0aGVyZSBhcmUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGVuIGl0IHN3aXRjaGVzIHRvIHRoZSBsb25nIGFsZ29yaXRobS5cclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUlkUHJvcCA9IGdldFNlcnZpY2VJZFByb3AodHJhY2tCeSk7XHJcbiAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3RpY2t5SWQ6IElkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25baV0sIGlkID0gaXRlbT8uW3RyYWNrQnldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnTWFwW2lkXT8uc3RpY2t5ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUlkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtSWQgPSBzdGlja3lJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IGZyb21JdGVtSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgeSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5Q29tcG9uZW50U2l6ZSA9IDAsXHJcbiAgICAgICAgICAgICAgICByb3c6IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEl0ZW1JbmRleDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZEl0ZW1JbmRleDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdFNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBkZWx0YUZyb21TdGFydENyZWF0aW9uOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc09yUm93c1dlaWdodHM6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIH0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3RTaXplOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGUgPSAoaTogbnVtYmVyLCBsOiBudW1iZXIsIGxpOiBudW1iZXIsIGlzUHJlY29sbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBpZFByZWZpeDogc3RyaW5nIHwgbnVsbCA9IG51bGwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWkgPiBsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW0gPSBjb2xsZWN0aW9uW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcD8uW2lkXT8uc3RpY2t5ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOZXdSb3cgPSBpICUgZGl2aWRlcyA9PT0gMCxcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3RJdGVtSW5Sb3cgPSBpaSAlIGRpdmlkZXMgPT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNMYXN0SXRlbSA9IGkgPT09IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzUm93RW5kID0gKGlzTGFzdEl0ZW1JblJvdyB8fCAoIWlzTGFzdEl0ZW1JblJvdyAmJiBpc0xhc3RJdGVtKSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGlzUHJlY29sbGVjdGlvbiA/IHsgLi4uY29sbGVjdGlvbkl0ZW0sIFtzZXJ2aWNlSWRQcm9wXTogYF8ke2lkUHJlZml4fS0ke2lkfV9gIH0gOiBjb2xsZWN0aW9uSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdSb3cgfHwgcm93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEl0ZW1JbmRleDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEl0ZW1JbmRleDogaSArIGRpdmlkZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90U2l6ZTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFGcm9tU3RhcnRDcmVhdGlvbjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0czogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50U2l6ZSA9IDAsIHJvd1NpemVEZWx0YSA9IDAsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNpemUgPSBjYWNoZVtzaXplUHJvcGVydHldID4gMCA/IGNhY2hlW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbURpc3BsYXlNZXRob2QgPSBjYWNoZT8ubWV0aG9kID8/IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJdGVtTmV3ID0gdGhpcy5fbmV3SXRlbXMuaW5kZXhPZihpZCkgPiAtMSB8fCAodGhpcy5faXNMYXp5ICYmIGlzU3RhcnQgJiYgIXRoaXMuX2lzUmVzZXRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNOZXcgPSBpc0l0ZW1OZXc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwc2hvdEJvdW5kcyA9IHNuYXBzaG90LmdldChpZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90U2l6ZSA9IHNuYXBzaG90Qm91bmRzID8gc25hcHNob3RCb3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnNpemUgPSBNYXRoLm1heChyb3cuc2l6ZSwgY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnNuYXBzaG90U2l6ZSA9IE1hdGgubWF4KHJvdy5zbmFwc2hvdFNpemUsIHNuYXBzaG90U2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1NpemVEZWx0YSA9IHJvdy5zaXplIC0gcm93LnNuYXBzaG90U2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtRGlzcGxheU1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIHsgLi4uY2FjaGUsIG1ldGhvZDogaXNOZXcgPyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFIDogSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VELCBbSVNfTkVXXTogaXNOZXcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3dFbmQgJiYgaXNOZXcgJiYgeSA8PSAoc2Nyb2xsU2l6ZSArIHNpemUgKyBkZWx0YUZyb21TdGFydENyZWF0aW9uICsgY29tcG9uZW50U2l6ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTaXplRGVsdGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTaXplRGVsdGEgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmNhY2hlLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEUsIFtJU19ORVddOiBpc05ldyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Jvd0VuZCAmJiBpc05ldyAmJiB5IDw9IChzY3JvbGxTaXplICsgc2l6ZSArIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gKyBjb21wb25lbnRTaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5kZWx0YUZyb21TdGFydENyZWF0aW9uID0gcm93U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NpemVEZWx0YSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZSA9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICByb3cuc2l6ZSA9IE1hdGgubWF4KHJvdy5zaXplLCBjb21wb25lbnRTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICByb3cuc25hcHNob3RTaXplID0gcm93LnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93U2l6ZURlbHRhID0gcm93LnNpemUgLSByb3cuc25hcHNob3RTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkSXRlbXNNYXAuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRJdGVtc01hcFtpXSwgc2l6ZSA9IGNhY2hlPy5bc2l6ZVByb3BlcnR5XSA/PyB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzY3JvbGxTaXplICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgLSBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5sZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zID0gTWF0aC5tYXgocm93LmxlZnRTaXplT2ZEZWxldGVkSXRlbXMsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IGZyb21JdGVtSWQgJiYgaWQgPT09IHN0aWNreUl0ZW1JZCAmJiBzdGlja3kgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbXBvbmVudFNpemUgPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbnVtLCBvZmZzZXQgfSA9IHRoaXMuZ2V0RWxlbWVudE51bVRvRW5kKGksIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Vmlld3BvcnRTaXplID0gc2l6ZSAtIG9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0Vmlld3BvcnRTaXplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbnVtOiBudW0xLCBvZmZzZXQ6IG9mZnNldDEgfSA9IHRoaXMuZ2V0RWxlbWVudE51bVRvRW5kKGkgKyBudW0sIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsLCAwLCB0cnVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFOdW0gPSAobnVtMSAtIG51bSksIGRlbHRhT2Zmc2V0ID0gKG9mZnNldDEgLSBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgLT0gZGVsdGFOdW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCA9IHJpZ2h0SXRlbUxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IGRlbHRhT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc09yUm93c1dlaWdodHMuc3BsaWNlKGxlZnRJdGVtc09yUm93c1dlaWdodHMubGVuZ3RoIC0gZGVsdGFOdW0sIGRlbHRhTnVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC09IGRlbHRhT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1CeUlkID0gY29sbGVjdGlvbkl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZFBvcyA9IHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzLnB1c2goY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSByb3cuc3RhcnRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPD0gc2Nyb2xsU2l6ZSAtIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm93LmxlZnRJdGVtc09yUm93c1dlaWdodHMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmxlZnRJdGVtc09yUm93c1dlaWdodHMgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByb3cubGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cyA9IE1hdGgubWF4KHJvdy5sZWZ0SXRlbXNPclJvd3NXZWlnaHRzLCBjb21wb25lbnRTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICByb3cubGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gTWF0aC5tYXgocm93LmxlZnRIaWRkZW5JdGVtc1dlaWdodCwgY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IHJvdy5zdGFydEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRnJvbUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CeUlkID09PSBudWxsIHx8IHkgPCBpdGVtQnlJZFBvcyArIHNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gcm93LmVuZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5IDw9IHNjcm9sbFNpemUgKyBzaXplICsgY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gcm93LmVuZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByb3cudG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCA9IE1hdGgubWF4KHJvdy50b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0LCBjb21wb25lbnRTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm93RW5kICYmIHkgPD0gc2Nyb2xsU2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtRGlzcGxheU1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmxlZnRTaXplT2ZBZGRlZEl0ZW1zID0gcm93U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cubGVmdFNpemVPZlVwZGF0ZWRJdGVtcyA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkRFTEVURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5sZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zID0gcm93U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3dFbmQgJiYgaXRlbURpc3BsYXlNZXRob2QgPT09IEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmRlbHRhT2ZOZXdJdGVtcyA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jvd0VuZCAmJiBpIDwgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5yaWdodEl0ZW1zV2VpZ2h0ID0gTWF0aC5tYXgocm93LnJpZ2h0SXRlbXNXZWlnaHQsIGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSb3dFbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YUZyb21TdGFydENyZWF0aW9uICs9IHJvdy5kZWx0YUZyb21TdGFydENyZWF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyArPSByb3cubGVmdFNpemVPZkFkZGVkSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKz0gcm93LmxlZnRTaXplT2ZVcGRhdGVkSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKz0gcm93LmxlZnRTaXplT2ZEZWxldGVkSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtcyArPSByb3cuZGVsdGFPZk5ld0l0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ICs9IHJvdy5yaWdodEl0ZW1zV2VpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ICs9IHJvdy50b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgKz0gcm93LmxlZnRIaWRkZW5JdGVtc1dlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdy5sZWZ0SXRlbXNPclJvd3NXZWlnaHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzLnB1c2gocm93LmxlZnRJdGVtc09yUm93c1dlaWdodHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSByb3cuc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB5ICs9IHJvdy5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnVmZlNpemUgPSAtMTtcclxuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxTaXplIDw9IHZpZXdwb3J0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLCBsaSA9IGwgPiAwID8gKGwgLSAxKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gdmlld3BvcnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeSA8PSBsaW1pdCB8fCBidWZmU2l6ZSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZTaXplID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZTaXplID0gbGVmdEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPj0gbGltaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmU2l6ZS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxjdWxhdGUobGkgLSBpLCBsLCBsaSwgdHJ1ZSwgU1RBUlRfQ09MTEVDVElPTl9QUkVGSVhfSUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT09IGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRZT2Zmc2V0ID0geTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IHZpZXdwb3J0U2l6ZSAqIC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0TGF5b3V0SW5kZXhPZmZzZXQgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocm93IGFzIGFueSkgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aCwgbGkgPSBsIC0gMTsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjYWxjdWxhdGUoaSwgbCwgbGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAocm93IGFzIGFueSkgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHl5ID0geSwgY3VycmVudFRvdGFsU2l6ZSA9IHRvdGFsU2l6ZSwgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUb3RhbFNpemUgPSB0b3RhbFNpemUgKyB2aWV3cG9ydFNpemU7XHJcbiAgICAgICAgICAgICAgICByb3cgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3RTaXplOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLCBsaSA9IGwgLSAxO1xyXG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwLCBjb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoeSA8IG5vcm1hbGl6ZWRUb3RhbFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FsY3VsYXRlKGksIGwsIGxpLCB0cnVlLCBFTkRfQ09MTEVDVElPTl9QUkVGSVhfSUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT09IGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgeSA9IHl5O1xyXG4gICAgICAgICAgICAgICAgdG90YWxTaXplID0gY3VycmVudFRvdGFsU2l6ZTtcclxuICAgICAgICAgICAgICAgIHJpZ2h0TGF5b3V0SW5kZXhPZmZzZXQgPSBjb3VudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IChpc0Zyb21JZCA/IGl0ZW1CeUlkUG9zIDogc2Nyb2xsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA8PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDw9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc09yUm93c1dlaWdodHMuc3BsaWNlKDAsIGxlZnRJdGVtc09yUm93c1dlaWdodHMubGVuZ3RoIC0gYnVmZmVyU2l6ZSk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc09yUm93c1dlaWdodHMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCArPSB2O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgbGVmdEl0ZW1zT2Zmc2V0KTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0ID4gdG90YWxMZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBzdGFydEluZGV4ID0gKE1hdGguY2VpbChNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApIC8gZGl2aWRlcykgKiBkaXZpZGVzKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAvLyBCdWZmZXIgb3B0aW1pemF0aW9uIGRvZXMgbm90IHdvcmsgb24gZmFzdCBsaW5lYXIgYWxnb3JpdGhtXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zdCBkaXZpZGVkVHlwaWNhbEl0ZW1TaXplID0gdHlwaWNhbEl0ZW1TaXplIC8gZGl2aWRlcywgYnVmZmVySXRlbU51bWJlcnMgPSBidWZmZXJTaXplICogZGl2aWRlcztcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IE1hdGguZmxvb3IoZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAhPT0gMCA/IChzY3JvbGxTaXplIC8gZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSkgOiAwKTtcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSBNYXRoLmNlaWwoZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAhPT0gMCA/ICgoc2Nyb2xsU2l6ZSArIHNpemUpIC8gZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSkgOiAwKTtcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLCBidWZmZXJTaXplICogZGl2aWRlcyk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IChpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIGJ1ZmZlckl0ZW1OdW1iZXJzKSA+IHRvdGFsTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHRvdGFsTGVuZ3RoIC0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgOiBidWZmZXJJdGVtTnVtYmVycztcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0ID0gTWF0aC5mbG9vcihsZWZ0SXRlbUxlbmd0aCAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgLyB0eXBpY2FsSXRlbVNpemUpICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ID0gTWF0aC5mbG9vcihyaWdodEl0ZW1MZW5ndGggKiBkaXZpZGVkVHlwaWNhbEl0ZW1TaXplIC8gdHlwaWNhbEl0ZW1TaXplKSAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gTWF0aC5mbG9vcihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kICogZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAvIHR5cGljYWxJdGVtU2l6ZSkgKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSBNYXRoLmZsb29yKGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICogZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAvIHR5cGljYWxJdGVtU2l6ZSkgKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9ICh0b3RhbExlbmd0aCAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUpICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgKyB0aGlzLl9zY3JvbGxFbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0b3RhbFNpemUgIT09IDAgPyBwcmV2aW91c1RvdGFsU2l6ZSAvIHRvdGFsU2l6ZSA6IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29sbGVjdGlvbi5maW5kSW5kZXgoaXRlbSA9PiBpdGVtW3RyYWNrQnldID09IGZyb21JdGVtSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZFBvcyA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgTWF0aC5mbG9vcihpbmRleCAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgLyBkaXZpZGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpc0Zyb21JdGVtSWRGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSAoaXNGcm9tSWQgPyBpdGVtQnlJZFBvcyA6IHNjcm9sbFNpemUgKiBrKTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW1zID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZTaXplID0gLTEsIHkgPSB0aGlzLl9zY3JvbGxTdGFydE9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxTaXplIDw9IHZpZXdwb3J0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLCBsaSA9IGwgPiAwID8gKGwgLSAxKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gdmlld3BvcnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeSA8PSBsaW1pdCB8fCBidWZmU2l6ZSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZTaXplID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZTaXplID0gbGVmdEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPj0gbGltaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmU2l6ZS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gbGkgLSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24ubGVuZ3RoID4gaXRlbUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChjb2xsZWN0aW9uW2l0ZW1JbmRleF0gYXMgSSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0SXRlbUluUm93ID0gaWkgJSBkaXZpZGVzID09PSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdEl0ZW0gPSBpID09PSBsaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xhc3RJdGVtSW5Sb3cgfHwgKCFpc0xhc3RJdGVtSW5Sb3cgJiYgaXNMYXN0SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IGRpdmlkZWRUeXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT09IGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRZT2Zmc2V0ID0geTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IHZpZXdwb3J0U2l6ZSAqIC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0TGF5b3V0SW5kZXhPZmZzZXQgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbXMucHVzaCguLi5jb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgeSA9IE1hdGguZmxvb3IodG90YWxTaXplIC8gZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSkgKiBkaXZpZGVkVHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUb3RhbFNpemUgPSB0b3RhbFNpemUgKyB2aWV3cG9ydFNpemU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gY29sbGVjdGlvbi5sZW5ndGgsIGxpID0gbCAtIDE7XHJcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDAsIGNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIHdoaWxlICh5IDwgbm9ybWFsaXplZFRvdGFsU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24ubGVuZ3RoIDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY29sbGVjdGlvbltpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0SXRlbUluUm93ID0gaWkgJSBkaXZpZGVzID09PSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RJdGVtID0gaSA9PT0gbGk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGFzdEl0ZW1JblJvdyB8fCAoIWlzTGFzdEl0ZW1JblJvdyAmJiBpc0xhc3RJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ICs9IGRpdmlkZWRUeXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpaSA9PT0gbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByaWdodExheW91dEluZGV4T2Zmc2V0ID0gY291bnQ7XHJcbiAgICAgICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsIGxlZnRJdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IChNYXRoLmNlaWwoTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtIGxlZnRJdGVtTGVuZ3RoLCB0b3RhbExlbmd0aCA+IDAgPyB0b3RhbExlbmd0aCAtIDEgOiAwKSAvIGRpdmlkZXMpICogZGl2aWRlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtIGxlZnRJdGVtTGVuZ3RoLCB0b3RhbExlbmd0aCA+IDAgPyB0b3RhbExlbmd0aCAtIDEgOiAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXRlbXNPbkRpc3BsYXlXZWlnaHQgPSB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0IC0gbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIC0gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC0gbGVmdEl0ZW1zV2VpZ2h0IC0gbGVmdFlPZmZzZXQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zID0gKE1hdGguY2VpbCgoaXRlbXNPbkRpc3BsYXlMZW5ndGggKyBsZWZ0SXRlbUxlbmd0aCArIHJpZ2h0SXRlbUxlbmd0aCkgLyBkaXZpZGVzKSAqIGRpdmlkZXMpICsgcmlnaHRMYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgc3RhcnRDcmVhdGlvbkRlbHRhID0gZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiA+IDAgPyBkZWx0YUZyb21TdGFydENyZWF0aW9uIDogMCxcclxuICAgICAgICAgICAgZGVsdGEgPSBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICsgbGVmdFNpemVPZkFkZGVkSXRlbXMgLSBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICsgc3RhcnRDcmVhdGlvbkRlbHRhO1xyXG4gICAgICAgIHRoaXMuX2RlbHRhT2ZOZXdJdGVtcyA9IGRlbHRhT2ZOZXdJdGVtcztcclxuXHJcbiAgICAgICAgaWYgKGlzRnJvbUlkICYmICFpc1RhcmdldEluT3ZlcnNjcm9sbCkge1xyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplIC09IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljczogSU1ldHJpY3M8ST4gPSB7XHJcbiAgICAgICAgICAgIGRlbHRhLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoOiB3LFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodDogaCxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGRpdmlkZXMsXHJcbiAgICAgICAgICAgIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXlXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXMsXHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCxcclxuICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXMsXHJcbiAgICAgICAgICAgIHNpemVQcm9wZXJ0eSxcclxuICAgICAgICAgICAgc3RpY2t5RW5hYmxlZCxcclxuICAgICAgICAgICAgc3RpY2t5UG9zLFxyXG4gICAgICAgICAgICBzdGFydEluZGV4LFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0LFxyXG4gICAgICAgICAgICB0b3RhbExlbmd0aCxcclxuICAgICAgICAgICAgdG90YWxTaXplLFxyXG4gICAgICAgICAgICB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kLFxyXG4gICAgICAgICAgICBpc1VwZGF0aW5nLFxyXG4gICAgICAgICAgICBzbmFwVG9JdGVtLFxyXG4gICAgICAgICAgICBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgIGl0ZW1UcmFuc2Zvcm0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENhY2hlKGNhY2hlOiBQcmVyZW5kZXJDYWNoZSkge1xyXG4gICAgICAgIHRoaXMuX3ByZXJlbmRlcmVkQ2FjaGUgPSBjYWNoZTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRlbHRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RlbHRhID0gdGhpcy5fZGVsdGFPZk5ld0l0ZW1zID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VzKGltbWVkaWF0ZWx5OiBib29sZWFuID0gZmFsc2UsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaW1tZWRpYXRlbHkpIHtcclxuICAgICAgICAgICAgaWYgKGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1bXBWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChDQUNIRV9CT1hfQ0hBTkdFX0VWRU5UX05BTUUgYXMgQ2FjaGVNYXBFdmVudHMsIHRoaXMudmVyc2lvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1bXBWZXJzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhbmdlc0RldGVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJ1bXBWZXJzaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBib3VuZHMgb2YgYXQgbGVhc3Qgb25lIHNjcmVlbiBvYmplY3QgaGF2ZSBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBjaGVja0JvdW5kc09mRWxlbWVudHMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXSwgaXRlbUlkID0gY29tcG9uZW50Lmluc3RhbmNlLml0ZW1JZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBjb21wb25lbnQuaW5zdGFuY2UuZ2V0Qm91bmRzKCksIGNhY2hlID0gdGhpcy5nZXQoaXRlbUlkKTtcclxuICAgICAgICAgICAgaWYgKCEhYm91bmRzICYmICEhY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChib3VuZHMud2lkdGggIT09IGNhY2hlLndpZHRoIHx8IGJvdW5kcy5oZWlnaHQgIT09IGNhY2hlLmhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVEaXNwbGF5Q29sbGVjdGlvbjxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaXRlbXM6IEMsIGFjdHVhbEl0ZW1zOiBDLCBpdGVtQ29uZmlnTWFwOiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG4gICAgICAgIG1ldHJpY3M6IElNZXRyaWNzPEk+KTogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0LFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGRpdmlkZXMsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICBsZWZ0TGF5b3V0T2Zmc2V0OiBsYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRJbmRleE9mZnNldDogbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zOiByZW5kZXJJdGVtc0xlbmd0aCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVByb3BlcnR5LFxyXG4gICAgICAgICAgICBzdGlja3lFbmFibGVkLFxyXG4gICAgICAgICAgICBzdGlja3lQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICBzdGFydEluZGV4LFxyXG4gICAgICAgICAgICB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgIG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgc25hcFRvSXRlbSxcclxuICAgICAgICAgICAgc25hcFRvSXRlbUFsaWduLFxyXG4gICAgICAgICAgICBpdGVtVHJhbnNmb3JtLFxyXG4gICAgICAgIH0gPSBtZXRyaWNzLFxyXG4gICAgICAgICAgICBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCB0cmFja0J5ID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUsIGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA9IHN0aWNreVBvcyxcclxuICAgICAgICAgICAgICAgIGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCA9IHRoaXMuX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZCxcclxuICAgICAgICAgICAgICAgIGRlbHRhT2ZmZXQgPSAoaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID8gc2Nyb2xsU2l6ZSA6IDApLFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgYm91bmRzU2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCwgYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uID0gc2Nyb2xsU2l6ZSArIGJvdW5kc1NpemUgLSB0aGlzLl9zY3JvbGxFbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxldCBwb3MgPSBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySXRlbXMgPSByZW5kZXJJdGVtc0xlbmd0aCxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIG5leHRTdGlja3k6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIHN0aWNreUl0ZW1JbmRleCA9IC0xLFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSAwLCBlbmRTdGlja3lJdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBuZXh0RW5kU3RpY2t5OiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbUluZGV4ID0gLTEsIGVuZFN0aWNreUl0ZW1TaXplID0gMDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxpID0gbGF5b3V0SW5kZXhPZmZzZXQgKyBhY3R1YWxJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBpZiAoc3RpY2t5RW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPiAwID8gKGRpdmlkZXMgPiAxID8gKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgLSAxKSA6IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQpIDogMCwgdG90YWxMZW5ndGggLSAxKTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0R1bW15ID0gY29sbGVjdGlvbkl0ZW0/LltTRVJWSUNFX1BST1BfRFVNTVldICYmIChjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gPT09IFNFUlZJQ0VfUFJPUF9EVU1NWV9FTkFCTEVEKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25JdGVtIHx8IGlzRHVtbXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gTWF0aC5mbG9vcigoKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgKyAxKSAvIGRpdmlkZXMpLCBpZCA9IGNvbGxlY3Rpb25JdGVtW3RyYWNrQnldLCBjYWNoZSA9IHRoaXMuZ2V0KGlkKSEsIHN0aWNreSA9IGl0ZW1Db25maWdNYXBbaWRdPy5zdGlja3kgPz8gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5zZWxlY3RhYmxlID8/IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNhYmxlID0gaXRlbUNvbmZpZ01hcFtpZF0/LmNvbGxhcHNhYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZHluYW1pY1NpemUgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gPiAwID8gY2FjaGU/LltzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb24gPSBwb3MgLSAoc2Nyb2xsU2l6ZSAtIHNpemUpIC0gc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSBzaXplICE9PSAwID8gYm91bmRzU2l6ZSAvIHNpemUgOiAwLCBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50ID0gLShib3VuZHNTaXplICE9PSAwID8gYWJzb2x1dGVTdGFydFBvc2l0aW9uIC8gYm91bmRzU2l6ZSA6IDApICogcmF0aW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24gPSBib3VuZHNTaXplIC0gKGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgKyBzaXplKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQgPSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIChib3VuZHNTaXplICE9PSAwID8gKGFic29sdXRlRW5kUG9zaXRpb24gKyBzaXplKSAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGlzVmVydGljYWwgPyAwIDogYWN0dWFsU25pcHBlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gaXNWZXJ0aWNhbCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0aWNreSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc09kZCA9IChpdGVtcy5sZW5ndGggLSBsYXlvdXRJbmRleE9mZnNldCArIGkpICUgMiAhPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1NZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRYOiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkWTogeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25aOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVaOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogcm93SW5kZXggJSAyICE9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW46IHJvd0luZGV4ICUgMiA9PSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVTdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uUGVyY2VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHN0aWNreSA9PT0gMSA/IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0IDogc3RpY2t5ID09PSAyID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gZGVsdGFPZmZldCAtIHNpemUgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxTaXplOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3Q6IGkgPT09IGxheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdDogaSA9PT0gbGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3OiAoY2FjaGUgYXMgQ2FjaGUpPy5bSVNfTkVXXSA9PT0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGQ6IGlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW46ICFpc09kZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXA6IHN0aWNreUVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkT3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXM6IGl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwVG9JdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogaSAtIGxheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IFpfSU5ERVhfMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGNvbGxlY3Rpb25JdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLCBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBwcmV2aW91c2VEYXRhOiBpID4gMCA/IGl0ZW1zW2kgLSAxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RGF0YTogaSA8IHRvdGFsTGVuZ3RoID8gaXRlbXNbaSArIDFdIDogbnVsbCwgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtU2l6ZSA9IHNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SXRlbXMucHVzaChzdGlja3lJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RpY2t5RW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2kgPSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kICsgaXRlbXNPbkRpc3BsYXlMZW5ndGggLSAxLCBzdGFydEluZGV4ID0gc2kgPCAwID8gc2kgOiBzaTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1pbihzdGFydEluZGV4LCB0b3RhbExlbmd0aCA+IDAgPyB0b3RhbExlbmd0aCAtIDEgOiAwKSxcclxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleCA9IE1hdGguZmxvb3IoKChpdGVtcy5sZW5ndGggLSBsYXlvdXRJbmRleE9mZnNldCArIGkpICsgMSkgLyBkaXZpZGVzKSxcclxuICAgICAgICAgICAgICAgICAgICBsID0gdG90YWxMZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0R1bW15ID0gY29sbGVjdGlvbkl0ZW0/LltTRVJWSUNFX1BST1BfRFVNTVldICYmIChjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gPT09IFNFUlZJQ0VfUFJPUF9EVU1NWV9FTkFCTEVEKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25JdGVtIHx8IGlzRHVtbXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sIGNhY2hlID0gdGhpcy5nZXQoaWQpISwgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSA/PyAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gaXRlbUNvbmZpZ01hcFtpZF0/LnNlbGVjdGFibGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uY29sbGFwc2FibGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBkeW5hbWljU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT2RkID0gKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgJSAyICE9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gaXNWZXJ0aWNhbCA/IG5vcm1hbGl6ZWRJdGVtV2lkdGggOiBzaXplLCBoID0gaXNWZXJ0aWNhbCA/IHNpemUgOiBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIChzY3JvbGxTaXplIC0gc2l6ZSkgLSBzaXplLCByYXRpbyA9IHNpemUgIT09IDAgPyBib3VuZHNTaXplIC8gc2l6ZSA6IDAsIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgPSAtKGJvdW5kc1NpemUgIT09IDAgPyBhYnNvbHV0ZVN0YXJ0UG9zaXRpb24gLyBib3VuZHNTaXplIDogMCkgKiByYXRpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24gPSBib3VuZHNTaXplIC0gKGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgKyBzaXplKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb25QZXJjZW50ID0gKGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgKyAoYm91bmRzU2l6ZSAhPT0gMCA/IChhYnNvbHV0ZUVuZFBvc2l0aW9uICsgc2l6ZSkgLyBib3VuZHNTaXplIDogMCkgKiByYXRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gaXNWZXJ0aWNhbCA/IDAgOiBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSB3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGlzVmVydGljYWwgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBoIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtTWVhc3VyZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkWDogeCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFk6IHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgejogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25ZOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVg6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVZOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWjogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGQ6IHJvd0luZGV4ICUgMiAhPSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuOiByb3dJbmRleCAlIDIgPT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gZGVsdGFPZmZldCAtIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjb25maWc6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNpemU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdDogaSA9PT0gbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0OiBpID09PSBsaSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXc6IChjYWNoZSBhcyBDYWNoZSk/LltJU19ORVddID09PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogIWlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcDogc3RpY2t5RW5hYmxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogaXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcFRvSXRlbUFsaWduLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiBpIC0gbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogWl9JTkRFWF8xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gY29sbGVjdGlvbkl0ZW07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksIGlkLCBtZWFzdXJlcywgZGF0YTogaXRlbURhdGEsIHByZXZpb3VzZURhdGE6IGkgPiAwID8gaXRlbXNbaSAtIDFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHREYXRhOiBpIDwgdG90YWxMZW5ndGggPyBpdGVtc1tpICsgMV0gOiBudWxsLCBjb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW1TaXplID0gc2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKGVuZFN0aWNreUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25MZW5ndGggPSBpdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBpID0gc3RhcnRJbmRleCxcclxuICAgICAgICAgICAgICAgIGNpID0gMCxcclxuICAgICAgICAgICAgICAgIHJvdzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBvZGQ6IGJvb2xlYW47XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbjogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgIH0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMCxcclxuICAgICAgICAgICAgICAgICAgICBvZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW46IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgd2hpbGUgKHJlbmRlckl0ZW1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gY29sbGVjdGlvbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0R1bW15ID0gY29sbGVjdGlvbkl0ZW0/LltTRVJWSUNFX1BST1BfRFVNTVldICYmIChjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gPT09IFNFUlZJQ0VfUFJPUF9EVU1NWV9FTkFCTEVEKSxcclxuICAgICAgICAgICAgICAgICAgICBpaSA9IGkgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4ID0gTWF0aC5mbG9vcigoKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgKyAxKSAvIGRpdmlkZXMpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmdldChpZCkhLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBpc0R1bW15ID8gdHlwaWNhbEl0ZW1TaXplIDogKGR5bmFtaWNTaXplID8gY2FjaGU/LltzaXplUHJvcGVydHldIHx8IHR5cGljYWxJdGVtU2l6ZSA6IHR5cGljYWxJdGVtU2l6ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZGl2U2l6ZSA9IChpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0KSAvIGRpdmlkZXM7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGkgJSBkaXZpZGVzID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2kgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiByb3dJbmRleCAlIDIgIT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW46IHJvd0luZGV4ICUgMiA9PT0gMCxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuc2l6ZSA9IE1hdGgubWF4KHJvdy5zaXplLCBzaXplKTtcclxuICAgICAgICAgICAgICAgICAgICBjaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghaXNEdW1teSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkIHx8IGlkICE9PSBzdGlja3lJdGVtPy5pZCkgJiYgaWQgIT09IGVuZFN0aWNreUl0ZW0/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT2RkID0gKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgJSAyICE9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3kgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc3RpY2t5ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2l6ZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5mdWxsU2l6ZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc2VsZWN0YWJsZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uY29sbGFwc2FibGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkID0gc3RpY2t5RW5hYmxlZCAmJiAoc3RpY2t5ID09PSAxICYmIChwb3MgPD0gc2Nyb2xsU2l6ZSArIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0KSB8fCBzdGlja3kgPT09IDIgJiYgKHBvcyA+PSBzY3JvbGxTaXplICsgYm91bmRzU2l6ZSAtIHNpemUpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIHNjcm9sbFNpemUsIHJhdGlvID0gc2l6ZSAhPT0gMCA/IGJvdW5kc1NpemUgLyBzaXplIDogMCwgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCA9IC0oYm91bmRzU2l6ZSAhPT0gMCA/IGFic29sdXRlU3RhcnRQb3NpdGlvbiAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQgPSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIChib3VuZHNTaXplICE9PSAwID8gKGFic29sdXRlRW5kUG9zaXRpb24gKyBzaXplKSAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBpc1ZlcnRpY2FsID8gZGl2U2l6ZSAqICgoc3RpY2t5IHx8IGZ1bGxTaXplKSA/IDAgOiBjaSkgOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gaXNWZXJ0aWNhbCA/IHBvcyA6IGRpdlNpemUgKiAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyAwIDogY2kpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1NZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRYOiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkWTogeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25aOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVaOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGlzVmVydGljYWwgPyAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyBub3JtYWxpemVkSXRlbVdpZHRoIDogKG5vcm1hbGl6ZWRJdGVtV2lkdGggLyBkaXZpZGVzKSkgOiBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaXNWZXJ0aWNhbCA/IHNpemUgOiAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyBub3JtYWxpemVkSXRlbUhlaWdodCA6IChub3JtYWxpemVkSXRlbUhlaWdodCAvIGRpdmlkZXMpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHN0aWNreSA9PT0gMSA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IHN0aWNreSA9PT0gMiA/IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIGRlbHRhT2ZmZXQgLSBzaXplIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZzogSVJlbmRlclZpcnR1YWxMaXN0SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0OiBpID09PSBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3Q6IGkgPT09IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldzogKGNhY2hlIGFzIENhY2hlKT8uW0lTX05FV10gPT09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiBpc09kZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuOiAhaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreTogc3RpY2t5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXA6IHN0aWNreUVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZE91dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBpdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcFRvSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IGkgLSBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0dWI6IChpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgJiYgaWQgPT09IHN0aWNreUl0ZW0/LmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBaX0lOREVYXzAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNuYXBwZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy56SW5kZXggPSBaX0lOREVYXzI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gY29sbGVjdGlvbkl0ZW07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksIGlkLCBtZWFzdXJlcywgZGF0YTogaXRlbURhdGEsIHByZXZpb3VzZURhdGE6IGkgPiAwID8gaXRlbXNbaSAtIDFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHREYXRhOiBpIDwgdG90YWxMZW5ndGggPyBpdGVtc1tpICsgMV0gOiBudWxsLCBjb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dFN0aWNreSAmJiBzdGlja3lJdGVtSW5kZXggPCBpICYmIHN0aWNreSA9PT0gMSAmJiAocG9zIDw9IHNjcm9sbFNpemUgKyB0aGlzLl9zY3JvbGxTdGFydE9mZnNldCArIHNpemUgKyBzdGlja3lJdGVtU2l6ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueCA9IGlzVmVydGljYWwgPyAwIDogc25hcHBlZCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IHBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHNuYXBwZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBpdGVtLm1lYXN1cmVzLnkgOiBpdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kuY29uZmlnLnpJbmRleCA9IFpfSU5ERVhfMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRFbmRTdGlja3kgJiYgZW5kU3RpY2t5SXRlbUluZGV4ID4gaSAmJiBzdGlja3kgPT09IDIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3MgPj0gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gc2l6ZSAtIGVuZFN0aWNreUl0ZW1TaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy54ID0gaXNWZXJ0aWNhbCA/IDAgOiBzbmFwcGVkID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gc2l6ZSA6IHBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gc2l6ZSA6IHBvcyA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kuY29uZmlnLnpJbmRleCA9IFpfSU5ERVhfMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5tZWFzdXJlcy5kZWx0YSA9IChpc1ZlcnRpY2FsID8gaXRlbS5tZWFzdXJlcy55IDogaXRlbS5tZWFzdXJlcy54KSAtIHNjcm9sbFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJJdGVtcy0tO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlpICUgZGl2aWRlcyA9PT0gMCB8fCByZW5kZXJJdGVtcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IHJvdy5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBheGlzID0gaXNWZXJ0aWNhbCA/IFlfUFJPUF9OQU1FIDogWF9QUk9QX05BTUU7XHJcblxyXG4gICAgICAgICAgICBpZiAoISFuZXh0U3RpY2t5ICYmICEhc3RpY2t5SXRlbSAmJiBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIDw9IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiArIHN0aWNreUl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSA+IHNjcm9sbFNpemUgLSBzdGlja3lJdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIC0gc3RpY2t5SXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc25hcHBlZCA9IG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkT3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zdGlja3kgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0ubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IHN0aWNreUl0ZW0ubWVhc3VyZXMueSA6IHN0aWNreUl0ZW0ubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBuZXh0U3RpY2t5Lm1lYXN1cmVzLnkgOiBuZXh0U3RpY2t5Lm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gc3RpY2t5SXRlbS5tZWFzdXJlc1theGlzXSArIHN0aWNreUl0ZW0ubWVhc3VyZXNbc2l6ZVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCEhbmV4dEVuZFN0aWNreSAmJiAhIWVuZFN0aWNreUl0ZW0gJiZcclxuICAgICAgICAgICAgICAgIChuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdID49IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIGVuZFN0aWNreUl0ZW1TaXplIC0gbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRFbmRTdGlja3kubWVhc3VyZXNbYXhpc10gPCBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dEVuZFN0aWNreS5tZWFzdXJlc1theGlzXSArIG5leHRFbmRTdGlja3kubWVhc3VyZXNbc2l6ZVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkID0gbmV4dEVuZFN0aWNreS5jb25maWcuc25hcHBlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWRPdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0uY29uZmlnLnN0aWNreSA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5tZWFzdXJlcy5kZWx0YSA9IChpc1ZlcnRpY2FsID8gZW5kU3RpY2t5SXRlbS5tZWFzdXJlcy55IDogZW5kU3RpY2t5SXRlbS5tZWFzdXJlcy54KSAtIHNjcm9sbFNpemU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kubWVhc3VyZXNbYXhpc10gPSBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5tZWFzdXJlcy5kZWx0YSA9IChpc1ZlcnRpY2FsID8gbmV4dEVuZFN0aWNreS5tZWFzdXJlcy55IDogbmV4dEVuZFN0aWNreS5tZWFzdXJlcy54KSAtIHNjcm9sbFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5tZWFzdXJlc1theGlzXSA9IG5leHRFbmRTdGlja3kubWVhc3VyZXNbYXhpc10gKyBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtVHJhbnNmb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRpc3BsYXlJdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGlzcGxheUl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtYXRpb24gPSBpdGVtVHJhbnNmb3JtKGl0ZW0uaW5kZXgsIG9iamVjdEFzUmVhZG9ubHkoaXRlbS5tZWFzdXJlcyksIG9iamVjdEFzUmVhZG9ubHkoaXRlbS5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy50cmFuc2Zvcm1lZFggPSB0cmFuc2Zvcm1hdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnRyYW5zZm9ybWVkWSA9IHRyYW5zZm9ybWF0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueiA9IHRyYW5zZm9ybWF0aW9uLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMucm90YXRpb25YID0gdHJhbnNmb3JtYXRpb24ucm90YXRpb25YO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnJvdGF0aW9uWSA9IHRyYW5zZm9ybWF0aW9uLnJvdGF0aW9uWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy5yb3RhdGlvblogPSB0cmFuc2Zvcm1hdGlvbi5yb3RhdGlvblo7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMuc2NhbGVYID0gdHJhbnNmb3JtYXRpb24uc2NhbGVYO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnNjYWxlWSA9IHRyYW5zZm9ybWF0aW9uLnNjYWxlWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy5zY2FsZVogPSB0cmFuc2Zvcm1hdGlvbi5zY2FsZVo7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29uZmlnLm9wYWNpdHkgPSB0cmFuc2Zvcm1hdGlvbi5vcGFjaXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbmZpZy5maWx0ZXIgPSB0cmFuc2Zvcm1hdGlvbi5maWx0ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29uZmlnLmJsZW5kQ29sb3IgPSB0cmFuc2Zvcm1hdGlvbi5ibGVuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbmZpZy56SW5kZXggPSBTdHJpbmcodHJhbnNmb3JtYXRpb24uekluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICByZXNldFBvc2l0aW9ucygpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLmNsZWFyVHJhY2tNYXAoKTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdHJhY2tpbmcgYnkgcHJvcE5hbWVcclxuICAgICAqL1xyXG4gICAgdHJhY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pdGVtcyB8fCAhdGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci50cmFjayh0aGlzLl9pdGVtcywgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMsIHRoaXMuX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50cywgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLCB0aGlzLl90cmFja0J5KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKHY6IHsgW2lkOiBudW1iZXJdOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgdW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQ/OiBDIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci51bnRyYWNrQ29tcG9uZW50QnlJZFByb3BlcnR5KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbUJvdW5kcyhpZDogSWQpOiBJU2l6ZSB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKSA/PyBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIsIG1heFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IChJUmVjdCAmIHsgaWQ6IElkIHwgbnVsbDsgaXNGaXJzdDogYm9vbGVhbjsgaXNMYXN0OiBib29sZWFuOyB9KSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cztcclxuICAgICAgICBsZXQgZmlyc3Q6IChJUmVjdCAmIHsgaWQ6IElkIHwgbnVsbDsgaXNGaXJzdDogYm9vbGVhbjsgaXNMYXN0OiBib29sZWFuOyB9KSB8IG51bGwgPSBudWxsLFxyXG4gICAgICAgICAgICBsYXN0OiAoSVJlY3QgJiB7IGlkOiBJZCB8IG51bGw7IGlzRmlyc3Q6IGJvb2xlYW47IGlzTGFzdDogYm9vbGVhbjsgfSkgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBpZiAoISFjb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGNvbXAuaW5zdGFuY2UuaXRlbUlkID8/IG51bGwsIGlzVmVydGljYWwgPSBjb21wLmluc3RhbmNlLml0ZW0/LmNvbmZpZz8uaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICB4ID0gY29tcC5pbnN0YW5jZS5pdGVtPy5tZWFzdXJlcz8ueCA/PyAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHkgPSBjb21wLmluc3RhbmNlLml0ZW0/Lm1lYXN1cmVzPy55ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGNvbXAuaW5zdGFuY2UuaXRlbT8uY29uZmlnPy5pc0ZpcnN0ID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTGFzdCA9IGNvbXAuaW5zdGFuY2UuaXRlbT8uY29uZmlnPy5pc0xhc3QgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wLmluc3RhbmNlLmdldEJvdW5kcygpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwgJiYgKHBvcyA+PSB5ICYmIHBvcyA8IHkgKyBoZWlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzRmlyc3QsIGlzTGFzdCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNWZXJ0aWNhbCAmJiAocG9zID49IHggJiYgcG9zIDwgeCArIHdpZHRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlkLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0ZpcnN0LCBpc0xhc3QgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSB7IGlkLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0ZpcnN0LCBpc0xhc3QgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHsgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzRmlyc3QsIGlzTGFzdCB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4UG9zaXRpb24gIT09IG51bGwgJiYgcG9zaXRpb24gPiBtYXhQb3NpdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbGFzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9kZWJvdW5jZWRJc1Njcm9sbFN0YXJ0T2ZmID0gZGVib3VuY2UoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2lzU2Nyb2xsU3RhcnQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHByb3RlY3RlZCBjYWNoZUVsZW1lbnRzKGlzVmVydGljYWw6IGJvb2xlYW4sIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzW2ldLCBpdGVtSWQgPSBjb21wb25lbnQuaW5zdGFuY2UuaXRlbUlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGNvbXBvbmVudC5pbnN0YW5jZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXQoaXRlbUlkLCB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldChpdGVtSWQpLCAuLi5ib3VuZHMsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogYm91bmRzLndpZHRoIHx8IChpc1ZlcnRpY2FsID8gMCA6IGl0ZW1TaXplKSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogYm91bmRzLmhlaWdodCB8fCAoaXNWZXJ0aWNhbCA/IGl0ZW1TaXplIDogMCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNMYXp5ICYmICh0aGlzLl9pc1Njcm9sbFN0YXJ0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2VkSXNTY3JvbGxTdGFydE9mZi5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9wcmVyZW5kZXJlZENhY2hlO1xyXG4gICAgICAgIGlmICghIWNhY2hlKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlSXRlbSA9IGNhY2hlW2lkXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGlkLCB7IC4uLih0aGlzLmdldChpZCkgfHwge30pLCAuLi5jYWNoZUl0ZW0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJlcmVuZGVyZWRDYWNoZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0Q2FjaGVDaHVua0luZm8oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbmV3SXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjYWNoZUNsZWFuKCkge1xyXG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuX3NuYXBzaG90LmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcG9zZUNsZWFyQnVmZmVyU2l6ZVRpbWVyKCk7XHJcblxyXG4gICAgICAgIGlmICghIXRoaXMuX2RlYm91bmNlZElzU2Nyb2xsU3RhcnRPZmYpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVib3VuY2VkSXNTY3JvbGxTdGFydE9mZi5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF0aGlzLl90cmFja2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|